From: Stephane Glondu Date: Tue, 21 Dec 2021 12:49:01 +0000 (+0100) Subject: New upstream version 4.13.0 X-Git-Tag: archive/raspbian/4.13.1-3+rpi1~2^2~27^2~1 X-Git-Url: https://dgit.raspbian.org/?a=commitdiff_plain;h=e0926bb13788d678dda3abb3418403fad818a0f4;p=ocaml.git New upstream version 4.13.0 --- diff --git a/.depend b/.depend index 48759913..b516be08 100644 --- a/.depend +++ b/.depend @@ -58,6 +58,11 @@ utils/consistbl.cmx : \ utils/consistbl.cmi utils/consistbl.cmi : \ utils/misc.cmi +utils/diffing.cmo : \ + utils/diffing.cmi +utils/diffing.cmx : \ + utils/diffing.cmi +utils/diffing.cmi : utils/domainstate.cmo : \ utils/domainstate.cmi utils/domainstate.cmx : \ @@ -75,6 +80,11 @@ utils/int_replace_polymorphic_compare.cmo : \ utils/int_replace_polymorphic_compare.cmx : \ utils/int_replace_polymorphic_compare.cmi utils/int_replace_polymorphic_compare.cmi : +utils/lazy_backtrack.cmo : \ + utils/lazy_backtrack.cmi +utils/lazy_backtrack.cmx : \ + utils/lazy_backtrack.cmi +utils/lazy_backtrack.cmi : utils/load_path.cmo : \ utils/misc.cmi \ utils/local_store.cmi \ @@ -496,6 +506,7 @@ typing/ctype.cmo : \ parsing/location.cmi \ utils/local_store.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ utils/clflags.cmi \ typing/btype.cmi \ @@ -512,6 +523,7 @@ typing/ctype.cmx : \ parsing/location.cmx \ utils/local_store.cmx \ typing/ident.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ utils/clflags.cmx \ typing/btype.cmx \ @@ -522,7 +534,9 @@ typing/ctype.cmi : \ typing/type_immediacy.cmi \ typing/path.cmi \ parsing/longident.cmi \ + parsing/location.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ parsing/asttypes.cmi typing/datarepr.cmo : \ @@ -557,6 +571,7 @@ typing/env.cmo : \ parsing/location.cmi \ utils/local_store.cmi \ utils/load_path.cmi \ + utils/lazy_backtrack.cmi \ typing/ident.cmi \ typing/datarepr.cmi \ file_formats/cmi_format.cmi \ @@ -577,6 +592,7 @@ typing/env.cmx : \ parsing/location.cmx \ utils/local_store.cmx \ utils/load_path.cmx \ + utils/lazy_backtrack.cmx \ typing/ident.cmx \ typing/datarepr.cmx \ file_formats/cmi_format.cmx \ @@ -619,6 +635,20 @@ typing/envaux.cmi : \ typing/subst.cmi \ typing/path.cmi \ typing/env.cmi +typing/errortrace.cmo : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/asttypes.cmi \ + typing/errortrace.cmi +typing/errortrace.cmx : \ + typing/types.cmx \ + typing/path.cmx \ + parsing/asttypes.cmi \ + typing/errortrace.cmi +typing/errortrace.cmi : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/asttypes.cmi typing/ident.cmo : \ utils/misc.cmi \ utils/local_store.cmi \ @@ -657,8 +687,10 @@ typing/includecore.cmo : \ typing/typedtree.cmi \ typing/type_immediacy.cmi \ typing/printtyp.cmi \ + typing/primitive.cmi \ typing/path.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ parsing/builtin_attributes.cmi \ @@ -670,8 +702,10 @@ typing/includecore.cmx : \ typing/typedtree.cmx \ typing/type_immediacy.cmx \ typing/printtyp.cmx \ + typing/primitive.cmx \ typing/path.cmx \ typing/ident.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ parsing/builtin_attributes.cmx \ @@ -685,8 +719,8 @@ typing/includecore.cmi : \ typing/path.cmi \ parsing/location.cmi \ typing/ident.cmi \ - typing/env.cmi \ - typing/ctype.cmi + typing/errortrace.cmi \ + typing/env.cmi typing/includemod.cmo : \ typing/types.cmi \ typing/typedtree.cmi \ @@ -695,17 +729,17 @@ typing/includemod.cmo : \ typing/primitive.cmi \ typing/predef.cmi \ typing/path.cmi \ - typing/oprint.cmi \ typing/mtype.cmi \ utils/misc.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ typing/includecore.cmi \ typing/includeclass.cmi \ typing/ident.cmi \ typing/env.cmi \ + utils/diffing.cmi \ typing/ctype.cmi \ file_formats/cmt_format.cmi \ - utils/clflags.cmi \ parsing/builtin_attributes.cmi \ typing/btype.cmi \ typing/includemod.cmi @@ -717,17 +751,17 @@ typing/includemod.cmx : \ typing/primitive.cmx \ typing/predef.cmx \ typing/path.cmx \ - typing/oprint.cmx \ typing/mtype.cmx \ utils/misc.cmx \ + parsing/longident.cmx \ parsing/location.cmx \ typing/includecore.cmx \ typing/includeclass.cmx \ typing/ident.cmx \ typing/env.cmx \ + utils/diffing.cmx \ typing/ctype.cmx \ file_formats/cmt_format.cmx \ - utils/clflags.cmx \ parsing/builtin_attributes.cmx \ typing/btype.cmx \ typing/includemod.cmi @@ -735,11 +769,47 @@ typing/includemod.cmi : \ typing/types.cmi \ typing/typedtree.cmi \ typing/path.cmi \ + parsing/longident.cmi \ parsing/location.cmi \ typing/includecore.cmi \ typing/ident.cmi \ typing/env.cmi \ + utils/diffing.cmi \ typing/ctype.cmi +typing/includemod_errorprinter.cmo : \ + typing/types.cmi \ + typing/typedtree.cmi \ + typing/printtyp.cmi \ + typing/path.cmi \ + typing/oprint.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + typing/includemod.cmi \ + typing/includecore.cmi \ + typing/includeclass.cmi \ + typing/ident.cmi \ + typing/env.cmi \ + utils/diffing.cmi \ + utils/clflags.cmi \ + typing/includemod_errorprinter.cmi +typing/includemod_errorprinter.cmx : \ + typing/types.cmx \ + typing/typedtree.cmx \ + typing/printtyp.cmx \ + typing/path.cmx \ + typing/oprint.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + typing/includemod.cmx \ + typing/includecore.cmx \ + typing/includeclass.cmx \ + typing/ident.cmx \ + typing/env.cmx \ + utils/diffing.cmx \ + utils/clflags.cmx \ + typing/includemod_errorprinter.cmi +typing/includemod_errorprinter.cmi : \ + typing/includemod.cmi typing/mtype.cmo : \ typing/types.cmi \ typing/subst.cmi \ @@ -878,6 +948,7 @@ typing/persistent_env.cmo : \ utils/misc.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + utils/lazy_backtrack.cmi \ utils/consistbl.cmi \ utils/config.cmi \ file_formats/cmi_format.cmi \ @@ -888,6 +959,7 @@ typing/persistent_env.cmx : \ utils/misc.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + utils/lazy_backtrack.cmx \ utils/consistbl.cmx \ utils/config.cmx \ file_formats/cmi_format.cmx \ @@ -897,6 +969,7 @@ typing/persistent_env.cmi : \ typing/types.cmi \ utils/misc.cmi \ parsing/location.cmi \ + utils/lazy_backtrack.cmi \ utils/consistbl.cmi \ file_formats/cmi_format.cmi typing/predef.cmo : \ @@ -962,6 +1035,7 @@ typing/printtyp.cmo : \ utils/warnings.cmi \ typing/types.cmi \ typing/type_immediacy.cmi \ + typing/signature_group.cmi \ typing/primitive.cmi \ typing/predef.cmi \ typing/path.cmi \ @@ -972,6 +1046,7 @@ typing/printtyp.cmo : \ parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ utils/clflags.cmi \ @@ -982,6 +1057,7 @@ typing/printtyp.cmx : \ utils/warnings.cmx \ typing/types.cmx \ typing/type_immediacy.cmx \ + typing/signature_group.cmx \ typing/primitive.cmx \ typing/predef.cmx \ typing/path.cmx \ @@ -992,6 +1068,7 @@ typing/printtyp.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ typing/ident.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ utils/clflags.cmx \ @@ -1005,8 +1082,8 @@ typing/printtyp.cmi : \ parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ - typing/ctype.cmi \ parsing/asttypes.cmi typing/printtyped.cmo : \ typing/types.cmi \ @@ -1057,6 +1134,18 @@ typing/rec_check.cmx : \ typing/rec_check.cmi : \ typing/typedtree.cmi \ typing/ident.cmi +typing/signature_group.cmo : \ + typing/types.cmi \ + typing/ident.cmi \ + typing/btype.cmi \ + typing/signature_group.cmi +typing/signature_group.cmx : \ + typing/types.cmx \ + typing/ident.cmx \ + typing/btype.cmx \ + typing/signature_group.cmi +typing/signature_group.cmi : \ + typing/types.cmi typing/stypes.cmo : \ typing/typedtree.cmi \ typing/printtyp.cmi \ @@ -1104,6 +1193,7 @@ typing/subst.cmx : \ typing/subst.cmi : \ typing/types.cmi \ typing/path.cmi \ + parsing/location.cmi \ typing/ident.cmi typing/tast_iterator.cmo : \ typing/typedtree.cmi \ @@ -1159,6 +1249,7 @@ typing/typeclass.cmo : \ parsing/location.cmi \ typing/includeclass.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ file_formats/cmt_format.cmi \ @@ -1186,6 +1277,7 @@ typing/typeclass.cmx : \ parsing/location.cmx \ typing/includeclass.cmx \ typing/ident.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ file_formats/cmt_format.cmx \ @@ -1202,6 +1294,7 @@ typing/typeclass.cmi : \ parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ parsing/asttypes.cmi @@ -1226,6 +1319,7 @@ typing/typecore.cmo : \ parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ file_formats/cmt_format.cmi \ @@ -1256,6 +1350,7 @@ typing/typecore.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ typing/ident.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ file_formats/cmt_format.cmx \ @@ -1273,8 +1368,8 @@ typing/typecore.cmi : \ parsing/longident.cmi \ parsing/location.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ - typing/ctype.cmi \ parsing/asttypes.cmi typing/typedecl.cmo : \ utils/warnings.cmi \ @@ -1299,6 +1394,7 @@ typing/typedecl.cmo : \ parsing/location.cmi \ typing/includecore.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ utils/config.cmi \ @@ -1333,6 +1429,7 @@ typing/typedecl.cmx : \ parsing/location.cmx \ typing/includecore.cmx \ typing/ident.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ utils/config.cmx \ @@ -1356,8 +1453,8 @@ typing/typedecl.cmi : \ parsing/location.cmi \ typing/includecore.cmi \ typing/ident.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ - typing/ctype.cmi \ parsing/asttypes.cmi typing/typedecl_immediacy.cmo : \ typing/types.cmi \ @@ -1406,7 +1503,6 @@ typing/typedecl_separability.cmo : \ typing/ctype.cmi \ utils/config.cmi \ typing/btype.cmi \ - parsing/asttypes.cmi \ typing/typedecl_separability.cmi typing/typedecl_separability.cmx : \ typing/types.cmx \ @@ -1416,7 +1512,6 @@ typing/typedecl_separability.cmx : \ typing/ctype.cmx \ utils/config.cmx \ typing/btype.cmx \ - parsing/asttypes.cmi \ typing/typedecl_separability.cmi typing/typedecl_separability.cmi : \ typing/types.cmi \ @@ -1513,6 +1608,7 @@ typing/typemod.cmo : \ typing/typecore.cmi \ typing/typeclass.cmi \ typing/subst.cmi \ + typing/signature_group.cmi \ typing/printtyp.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ @@ -1522,6 +1618,7 @@ typing/typemod.cmo : \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ + typing/includemod_errorprinter.cmi \ typing/includemod.cmi \ typing/ident.cmi \ typing/env.cmi \ @@ -1545,6 +1642,7 @@ typing/typemod.cmx : \ typing/typecore.cmx \ typing/typeclass.cmx \ typing/subst.cmx \ + typing/signature_group.cmx \ typing/printtyp.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ @@ -1554,6 +1652,7 @@ typing/typemod.cmx : \ parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ + typing/includemod_errorprinter.cmx \ typing/includemod.cmx \ typing/ident.cmx \ typing/env.cmx \ @@ -1660,6 +1759,7 @@ typing/typetexp.cmo : \ utils/misc.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ typing/ctype.cmi \ utils/clflags.cmi \ @@ -1680,6 +1780,7 @@ typing/typetexp.cmx : \ utils/misc.cmx \ parsing/longident.cmx \ parsing/location.cmx \ + typing/errortrace.cmx \ typing/env.cmx \ typing/ctype.cmx \ utils/clflags.cmx \ @@ -1695,8 +1796,8 @@ typing/typetexp.cmi : \ parsing/parsetree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/errortrace.cmi \ typing/env.cmi \ - typing/ctype.cmi \ parsing/asttypes.cmi typing/untypeast.cmo : \ typing/typedtree.cmi \ @@ -2023,15 +2124,18 @@ asmcomp/CSEgen.cmo : \ asmcomp/proc.cmi \ asmcomp/mach.cmi \ asmcomp/cmm.cmi \ + parsing/asttypes.cmi \ asmcomp/CSEgen.cmi asmcomp/CSEgen.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ asmcomp/mach.cmx \ asmcomp/cmm.cmx \ + parsing/asttypes.cmi \ asmcomp/CSEgen.cmi asmcomp/CSEgen.cmi : \ - asmcomp/mach.cmi + asmcomp/mach.cmi \ + parsing/asttypes.cmi asmcomp/afl_instrument.cmo : \ lambda/lambda.cmi \ asmcomp/cmm.cmi \ @@ -2069,6 +2173,7 @@ asmcomp/asmgen.cmo : \ asmcomp/printlinear.cmi \ asmcomp/printcmm.cmi \ typing/primitive.cmi \ + asmcomp/polling.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ parsing/location.cmi \ @@ -2076,6 +2181,7 @@ asmcomp/asmgen.cmo : \ asmcomp/linscan.cmi \ asmcomp/linearize.cmi \ file_formats/linear_format.cmi \ + asmcomp/linear.cmi \ lambda/lambda.cmi \ asmcomp/interval.cmi \ asmcomp/interf.cmi \ @@ -2088,13 +2194,13 @@ asmcomp/asmgen.cmo : \ asmcomp/comballoc.cmi \ asmcomp/coloring.cmi \ asmcomp/cmmgen.cmi \ + asmcomp/cmm_invariants.cmi \ asmcomp/cmm_helpers.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ middle_end/clambda.cmi \ asmcomp/CSE.cmo \ middle_end/backend_intf.cmi \ - asmcomp/debug/available_regs.cmi \ asmcomp/asmgen.cmi asmcomp/asmgen.cmx : \ lambda/translmod.cmx \ @@ -2110,6 +2216,7 @@ asmcomp/asmgen.cmx : \ asmcomp/printlinear.cmx \ asmcomp/printcmm.cmx \ typing/primitive.cmx \ + asmcomp/polling.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ parsing/location.cmx \ @@ -2117,6 +2224,7 @@ asmcomp/asmgen.cmx : \ asmcomp/linscan.cmx \ asmcomp/linearize.cmx \ file_formats/linear_format.cmx \ + asmcomp/linear.cmx \ lambda/lambda.cmx \ asmcomp/interval.cmx \ asmcomp/interf.cmx \ @@ -2129,16 +2237,17 @@ asmcomp/asmgen.cmx : \ asmcomp/comballoc.cmx \ asmcomp/coloring.cmx \ asmcomp/cmmgen.cmx \ + asmcomp/cmm_invariants.cmx \ asmcomp/cmm_helpers.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ middle_end/clambda.cmx \ asmcomp/CSE.cmx \ middle_end/backend_intf.cmi \ - asmcomp/debug/available_regs.cmx \ asmcomp/asmgen.cmi asmcomp/asmgen.cmi : \ lambda/lambda.cmi \ + asmcomp/emitaux.cmi \ asmcomp/cmm.cmi \ middle_end/clambda.cmi \ middle_end/backend_intf.cmi @@ -2279,10 +2388,12 @@ asmcomp/branch_relaxation.cmi : \ asmcomp/branch_relaxation_intf.cmo : \ asmcomp/linear.cmi \ lambda/debuginfo.cmi \ + asmcomp/cmm.cmi \ asmcomp/arch.cmo asmcomp/branch_relaxation_intf.cmx : \ asmcomp/linear.cmx \ lambda/debuginfo.cmx \ + asmcomp/cmm.cmx \ asmcomp/arch.cmx asmcomp/cmm.cmo : \ utils/targetint.cmi \ @@ -2365,6 +2476,16 @@ asmcomp/cmm_helpers.cmi : \ middle_end/clambda_primitives.cmi \ middle_end/clambda.cmi \ parsing/asttypes.cmi +asmcomp/cmm_invariants.cmo : \ + utils/numbers.cmi \ + asmcomp/cmm.cmi \ + asmcomp/cmm_invariants.cmi +asmcomp/cmm_invariants.cmx : \ + utils/numbers.cmx \ + asmcomp/cmm.cmx \ + asmcomp/cmm_invariants.cmi +asmcomp/cmm_invariants.cmi : \ + asmcomp/cmm.cmi asmcomp/cmmgen.cmo : \ typing/types.cmi \ middle_end/printclambda_primitives.cmi \ @@ -2449,6 +2570,16 @@ asmcomp/comballoc.cmx : \ asmcomp/comballoc.cmi asmcomp/comballoc.cmi : \ asmcomp/mach.cmi +asmcomp/dataflow.cmo : \ + asmcomp/mach.cmi \ + asmcomp/cmm.cmi \ + asmcomp/dataflow.cmi +asmcomp/dataflow.cmx : \ + asmcomp/mach.cmx \ + asmcomp/cmm.cmx \ + asmcomp/dataflow.cmi +asmcomp/dataflow.cmi : \ + asmcomp/mach.cmi asmcomp/deadcode.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ @@ -2478,6 +2609,7 @@ asmcomp/emit.cmo : \ asmcomp/mach.cmi \ asmcomp/linear.cmi \ lambda/lambda.cmi \ + asmcomp/emitenv.cmi \ asmcomp/emitaux.cmi \ utils/domainstate.cmi \ utils/config.cmi \ @@ -2500,6 +2632,7 @@ asmcomp/emit.cmx : \ asmcomp/mach.cmx \ asmcomp/linear.cmx \ lambda/lambda.cmx \ + asmcomp/emitenv.cmi \ asmcomp/emitaux.cmx \ utils/domainstate.cmx \ utils/config.cmx \ @@ -2513,6 +2646,7 @@ asmcomp/emit.cmi : \ asmcomp/linear.cmi \ asmcomp/cmm.cmi asmcomp/emitaux.cmo : \ + asmcomp/emitenv.cmi \ lambda/debuginfo.cmi \ utils/config.cmi \ asmcomp/cmm.cmi \ @@ -2520,6 +2654,7 @@ asmcomp/emitaux.cmo : \ asmcomp/arch.cmo \ asmcomp/emitaux.cmi asmcomp/emitaux.cmx : \ + asmcomp/emitenv.cmi \ lambda/debuginfo.cmx \ utils/config.cmx \ asmcomp/cmm.cmx \ @@ -2527,7 +2662,11 @@ asmcomp/emitaux.cmx : \ asmcomp/arch.cmx \ asmcomp/emitaux.cmi asmcomp/emitaux.cmi : \ + asmcomp/linear.cmi \ + asmcomp/emitenv.cmi \ lambda/debuginfo.cmi +asmcomp/emitenv.cmi : \ + asmcomp/linear.cmi asmcomp/interf.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ @@ -2613,7 +2752,7 @@ asmcomp/liveness.cmo : \ asmcomp/printmach.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ - asmcomp/cmm.cmi \ + asmcomp/dataflow.cmi \ asmcomp/liveness.cmi asmcomp/liveness.cmx : \ asmcomp/reg.cmx \ @@ -2621,38 +2760,50 @@ asmcomp/liveness.cmx : \ asmcomp/printmach.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ - asmcomp/cmm.cmx \ + asmcomp/dataflow.cmx \ asmcomp/liveness.cmi asmcomp/liveness.cmi : \ asmcomp/mach.cmi asmcomp/mach.cmo : \ - asmcomp/debug/reg_with_debug_info.cmi \ - asmcomp/debug/reg_availability_set.cmi \ asmcomp/reg.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ - middle_end/backend_var.cmi \ + parsing/asttypes.cmi \ asmcomp/arch.cmo \ asmcomp/mach.cmi asmcomp/mach.cmx : \ - asmcomp/debug/reg_with_debug_info.cmx \ - asmcomp/debug/reg_availability_set.cmx \ asmcomp/reg.cmx \ lambda/lambda.cmx \ lambda/debuginfo.cmx \ asmcomp/cmm.cmx \ - middle_end/backend_var.cmx \ + parsing/asttypes.cmi \ asmcomp/arch.cmx \ asmcomp/mach.cmi asmcomp/mach.cmi : \ - asmcomp/debug/reg_availability_set.cmi \ asmcomp/reg.cmi \ lambda/lambda.cmi \ lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ - middle_end/backend_var.cmi \ + parsing/asttypes.cmi \ asmcomp/arch.cmo +asmcomp/polling.cmo : \ + utils/numbers.cmi \ + utils/misc.cmi \ + asmcomp/mach.cmi \ + asmcomp/dataflow.cmi \ + asmcomp/cmm.cmi \ + asmcomp/polling.cmi +asmcomp/polling.cmx : \ + utils/numbers.cmx \ + utils/misc.cmx \ + asmcomp/mach.cmx \ + asmcomp/dataflow.cmx \ + asmcomp/cmm.cmx \ + asmcomp/polling.cmi +asmcomp/polling.cmi : \ + utils/misc.cmi \ + asmcomp/mach.cmi asmcomp/printcmm.cmo : \ utils/targetint.cmi \ lambda/lambda.cmi \ @@ -2693,7 +2844,6 @@ asmcomp/printlinear.cmx : \ asmcomp/printlinear.cmi : \ asmcomp/linear.cmi asmcomp/printmach.cmo : \ - asmcomp/debug/reg_availability_set.cmi \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ asmcomp/printcmm.cmi \ @@ -2703,11 +2853,9 @@ asmcomp/printmach.cmo : \ lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ - middle_end/backend_var.cmi \ asmcomp/arch.cmo \ asmcomp/printmach.cmi asmcomp/printmach.cmx : \ - asmcomp/debug/reg_availability_set.cmx \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ asmcomp/printcmm.cmx \ @@ -2717,7 +2865,6 @@ asmcomp/printmach.cmx : \ lambda/debuginfo.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ - middle_end/backend_var.cmx \ asmcomp/arch.cmx \ asmcomp/printmach.cmi asmcomp/printmach.cmi : \ @@ -2819,6 +2966,7 @@ asmcomp/scheduling.cmi : \ asmcomp/selectgen.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ + asmcomp/polling.cmi \ utils/numbers.cmi \ utils/misc.cmi \ asmcomp/mach.cmi \ @@ -2832,6 +2980,7 @@ asmcomp/selectgen.cmo : \ asmcomp/selectgen.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ + asmcomp/polling.cmx \ utils/numbers.cmx \ utils/misc.cmx \ asmcomp/mach.cmx \ @@ -2844,6 +2993,7 @@ asmcomp/selectgen.cmx : \ asmcomp/selectgen.cmi asmcomp/selectgen.cmi : \ asmcomp/reg.cmi \ + utils/misc.cmi \ asmcomp/mach.cmi \ lambda/debuginfo.cmi \ asmcomp/cmm.cmi \ @@ -2867,12 +3017,12 @@ asmcomp/selection.cmx : \ asmcomp/arch.cmx \ asmcomp/selection.cmi asmcomp/selection.cmi : \ + utils/misc.cmi \ asmcomp/mach.cmi \ asmcomp/cmm.cmi asmcomp/spill.cmo : \ asmcomp/reg.cmi \ asmcomp/proc.cmi \ - utils/misc.cmi \ asmcomp/mach.cmi \ asmcomp/cmm.cmi \ utils/clflags.cmi \ @@ -2880,7 +3030,6 @@ asmcomp/spill.cmo : \ asmcomp/spill.cmx : \ asmcomp/reg.cmx \ asmcomp/proc.cmx \ - utils/misc.cmx \ asmcomp/mach.cmx \ asmcomp/cmm.cmx \ utils/clflags.cmx \ @@ -5648,80 +5797,6 @@ middle_end/flambda/base_types/var_within_closure.cmx : \ middle_end/flambda/base_types/var_within_closure.cmi middle_end/flambda/base_types/var_within_closure.cmi : \ middle_end/flambda/base_types/closure_element.cmi -asmcomp/debug/available_regs.cmo : \ - asmcomp/debug/reg_with_debug_info.cmi \ - asmcomp/debug/reg_availability_set.cmi \ - asmcomp/reg.cmi \ - asmcomp/proc.cmi \ - asmcomp/printmach.cmi \ - utils/misc.cmi \ - asmcomp/mach.cmi \ - utils/clflags.cmi \ - middle_end/backend_var.cmi \ - asmcomp/debug/available_regs.cmi -asmcomp/debug/available_regs.cmx : \ - asmcomp/debug/reg_with_debug_info.cmx \ - asmcomp/debug/reg_availability_set.cmx \ - asmcomp/reg.cmx \ - asmcomp/proc.cmx \ - asmcomp/printmach.cmx \ - utils/misc.cmx \ - asmcomp/mach.cmx \ - utils/clflags.cmx \ - middle_end/backend_var.cmx \ - asmcomp/debug/available_regs.cmi -asmcomp/debug/available_regs.cmi : \ - asmcomp/mach.cmi -asmcomp/debug/compute_ranges.cmo : \ - asmcomp/printlinear.cmi \ - utils/numbers.cmi \ - utils/misc.cmi \ - asmcomp/linear.cmi \ - utils/int_replace_polymorphic_compare.cmi \ - asmcomp/debug/compute_ranges_intf.cmo \ - asmcomp/cmm.cmi \ - asmcomp/debug/compute_ranges.cmi -asmcomp/debug/compute_ranges.cmx : \ - asmcomp/printlinear.cmx \ - utils/numbers.cmx \ - utils/misc.cmx \ - asmcomp/linear.cmx \ - utils/int_replace_polymorphic_compare.cmx \ - asmcomp/debug/compute_ranges_intf.cmx \ - asmcomp/cmm.cmx \ - asmcomp/debug/compute_ranges.cmi -asmcomp/debug/compute_ranges.cmi : \ - asmcomp/debug/compute_ranges_intf.cmo -asmcomp/debug/compute_ranges_intf.cmo : \ - utils/numbers.cmi \ - asmcomp/linear.cmi \ - utils/identifiable.cmi -asmcomp/debug/compute_ranges_intf.cmx : \ - utils/numbers.cmx \ - asmcomp/linear.cmx \ - utils/identifiable.cmx -asmcomp/debug/reg_availability_set.cmo : \ - asmcomp/debug/reg_with_debug_info.cmi \ - middle_end/backend_var.cmi \ - asmcomp/debug/reg_availability_set.cmi -asmcomp/debug/reg_availability_set.cmx : \ - asmcomp/debug/reg_with_debug_info.cmx \ - middle_end/backend_var.cmx \ - asmcomp/debug/reg_availability_set.cmi -asmcomp/debug/reg_availability_set.cmi : \ - asmcomp/debug/reg_with_debug_info.cmi \ - asmcomp/reg.cmi -asmcomp/debug/reg_with_debug_info.cmo : \ - asmcomp/reg.cmi \ - middle_end/backend_var.cmi \ - asmcomp/debug/reg_with_debug_info.cmi -asmcomp/debug/reg_with_debug_info.cmx : \ - asmcomp/reg.cmx \ - middle_end/backend_var.cmx \ - asmcomp/debug/reg_with_debug_info.cmi -asmcomp/debug/reg_with_debug_info.cmi : \ - asmcomp/reg.cmi \ - middle_end/backend_var.cmi driver/compenv.cmo : \ utils/warnings.cmi \ utils/profile.cmi \ @@ -5743,6 +5818,7 @@ driver/compenv.cmx : \ driver/compenv.cmi : \ utils/clflags.cmi driver/compile.cmo : \ + typing/typedtree.cmi \ lambda/translmod.cmi \ lambda/simplif.cmi \ utils/profile.cmi \ @@ -5756,6 +5832,7 @@ driver/compile.cmo : \ bytecomp/bytegen.cmi \ driver/compile.cmi driver/compile.cmx : \ + typing/typedtree.cmx \ lambda/translmod.cmx \ lambda/simplif.cmx \ utils/profile.cmx \ @@ -5862,6 +5939,7 @@ driver/main_args.cmo : \ utils/warnings.cmi \ utils/profile.cmi \ utils/misc.cmi \ + parsing/location.cmi \ utils/config.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ @@ -5870,6 +5948,7 @@ driver/main_args.cmx : \ utils/warnings.cmx \ utils/profile.cmx \ utils/misc.cmx \ + parsing/location.cmx \ utils/config.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ @@ -5934,6 +6013,7 @@ driver/makedepend.cmx : \ driver/makedepend.cmi driver/makedepend.cmi : driver/optcompile.cmo : \ + typing/typedtree.cmi \ lambda/translmod.cmi \ lambda/simplif.cmi \ utils/profile.cmi \ @@ -5949,6 +6029,7 @@ driver/optcompile.cmo : \ asmcomp/asmgen.cmi \ driver/optcompile.cmi driver/optcompile.cmx : \ + typing/typedtree.cmx \ lambda/translmod.cmx \ lambda/simplif.cmx \ utils/profile.cmx \ @@ -6101,52 +6182,7 @@ toplevel/genprintval.cmi : \ typing/path.cmi \ typing/outcometree.cmi \ typing/env.cmi -toplevel/opttopdirs.cmo : \ - utils/warnings.cmi \ - typing/types.cmi \ - typing/printtyp.cmi \ - toplevel/opttoploop.cmi \ - utils/misc.cmi \ - parsing/longident.cmi \ - utils/load_path.cmi \ - typing/ident.cmi \ - typing/env.cmi \ - typing/ctype.cmi \ - utils/config.cmi \ - driver/compenv.cmi \ - utils/clflags.cmi \ - asmcomp/asmlink.cmi \ - toplevel/opttopdirs.cmi -toplevel/opttopdirs.cmx : \ - utils/warnings.cmx \ - typing/types.cmx \ - typing/printtyp.cmx \ - toplevel/opttoploop.cmx \ - utils/misc.cmx \ - parsing/longident.cmx \ - utils/load_path.cmx \ - typing/ident.cmx \ - typing/env.cmx \ - typing/ctype.cmx \ - utils/config.cmx \ - driver/compenv.cmx \ - utils/clflags.cmx \ - asmcomp/asmlink.cmx \ - toplevel/opttopdirs.cmi -toplevel/opttopdirs.cmi : \ - parsing/longident.cmi -toplevel/opttoploop.cmo : \ - utils/warnings.cmi \ - typing/types.cmi \ - typing/typemod.cmi \ - typing/typedtree.cmi \ - typing/typecore.cmi \ - lambda/translmod.cmi \ - lambda/simplif.cmi \ - asmcomp/proc.cmi \ - typing/printtyped.cmi \ - typing/printtyp.cmi \ - lambda/printlambda.cmi \ +toplevel/topcommon.cmo : \ parsing/printast.cmi \ typing/predef.cmi \ parsing/pprintast.cmi \ @@ -6161,39 +6197,17 @@ toplevel/opttoploop.cmo : \ parsing/location.cmi \ utils/load_path.cmi \ parsing/lexer.cmi \ - lambda/lambda.cmi \ - typing/includemod.cmi \ - middle_end/flambda/import_approx.cmi \ typing/ident.cmi \ toplevel/genprintval.cmi \ - middle_end/flambda/flambda_middle_end.cmi \ typing/env.cmi \ + bytecomp/dll.cmi \ utils/config.cmi \ driver/compmisc.cmi \ - middle_end/compilenv.cmi \ driver/compenv.cmi \ - middle_end/closure/closure_middle_end.cmi \ utils/clflags.cmi \ - typing/btype.cmi \ - middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ parsing/ast_helper.cmi \ - asmcomp/asmlink.cmi \ - asmcomp/asmgen.cmi \ - asmcomp/arch.cmo \ - toplevel/opttoploop.cmi -toplevel/opttoploop.cmx : \ - utils/warnings.cmx \ - typing/types.cmx \ - typing/typemod.cmx \ - typing/typedtree.cmx \ - typing/typecore.cmx \ - lambda/translmod.cmx \ - lambda/simplif.cmx \ - asmcomp/proc.cmx \ - typing/printtyped.cmx \ - typing/printtyp.cmx \ - lambda/printlambda.cmx \ + toplevel/topcommon.cmi +toplevel/topcommon.cmx : \ parsing/printast.cmx \ typing/predef.cmx \ parsing/pprintast.cmx \ @@ -6208,28 +6222,17 @@ toplevel/opttoploop.cmx : \ parsing/location.cmx \ utils/load_path.cmx \ parsing/lexer.cmx \ - lambda/lambda.cmx \ - typing/includemod.cmx \ - middle_end/flambda/import_approx.cmx \ typing/ident.cmx \ toplevel/genprintval.cmx \ - middle_end/flambda/flambda_middle_end.cmx \ typing/env.cmx \ + bytecomp/dll.cmx \ utils/config.cmx \ driver/compmisc.cmx \ - middle_end/compilenv.cmx \ driver/compenv.cmx \ - middle_end/closure/closure_middle_end.cmx \ utils/clflags.cmx \ - typing/btype.cmx \ - middle_end/backend_intf.cmi \ - parsing/asttypes.cmi \ parsing/ast_helper.cmx \ - asmcomp/asmlink.cmx \ - asmcomp/asmgen.cmx \ - asmcomp/arch.cmx \ - toplevel/opttoploop.cmi -toplevel/opttoploop.cmi : \ + toplevel/topcommon.cmi +toplevel/topcommon.cmi : \ utils/warnings.cmi \ typing/types.cmi \ typing/path.cmi \ @@ -6237,46 +6240,19 @@ toplevel/opttoploop.cmi : \ typing/outcometree.cmi \ parsing/longident.cmi \ parsing/location.cmi \ + typing/ident.cmi \ + toplevel/genprintval.cmi \ typing/env.cmi -toplevel/opttopmain.cmo : \ - toplevel/opttoploop.cmi \ - toplevel/opttopdirs.cmi \ - utils/misc.cmi \ - driver/main_args.cmi \ - parsing/location.cmi \ - driver/compmisc.cmi \ - driver/compenv.cmi \ - utils/clflags.cmi \ - toplevel/opttopmain.cmi -toplevel/opttopmain.cmx : \ - toplevel/opttoploop.cmx \ - toplevel/opttopdirs.cmx \ - utils/misc.cmx \ - driver/main_args.cmx \ - parsing/location.cmx \ - driver/compmisc.cmx \ - driver/compenv.cmx \ - utils/clflags.cmx \ - toplevel/opttopmain.cmi -toplevel/opttopmain.cmi : -toplevel/opttopstart.cmo : \ - toplevel/opttopmain.cmi -toplevel/opttopstart.cmx : \ - toplevel/opttopmain.cmx toplevel/topdirs.cmo : \ utils/warnings.cmi \ typing/types.cmi \ - toplevel/trace.cmi \ toplevel/toploop.cmi \ - bytecomp/symtable.cmi \ + toplevel/topeval.cmi \ typing/printtyp.cmi \ typing/predef.cmi \ - typing/persistent_env.cmi \ typing/path.cmi \ parsing/parsetree.cmi \ - bytecomp/opcodes.cmi \ utils/misc.cmi \ - bytecomp/meta.cmi \ parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ @@ -6286,7 +6262,6 @@ toplevel/topdirs.cmo : \ typing/ctype.cmi \ utils/config.cmi \ driver/compenv.cmi \ - file_formats/cmo_format.cmi \ utils/clflags.cmi \ typing/btype.cmi \ parsing/asttypes.cmi \ @@ -6295,17 +6270,13 @@ toplevel/topdirs.cmo : \ toplevel/topdirs.cmx : \ utils/warnings.cmx \ typing/types.cmx \ - toplevel/trace.cmx \ toplevel/toploop.cmx \ - bytecomp/symtable.cmx \ + toplevel/topeval.cmi \ typing/printtyp.cmx \ typing/predef.cmx \ - typing/persistent_env.cmx \ typing/path.cmx \ parsing/parsetree.cmi \ - bytecomp/opcodes.cmx \ utils/misc.cmx \ - bytecomp/meta.cmx \ parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ @@ -6315,7 +6286,6 @@ toplevel/topdirs.cmx : \ typing/ctype.cmx \ utils/config.cmx \ driver/compenv.cmx \ - file_formats/cmo_format.cmi \ utils/clflags.cmx \ typing/btype.cmx \ parsing/asttypes.cmi \ @@ -6323,131 +6293,172 @@ toplevel/topdirs.cmx : \ toplevel/topdirs.cmi toplevel/topdirs.cmi : \ parsing/longident.cmi +toplevel/topeval.cmi : \ + toplevel/topcommon.cmi \ + parsing/parsetree.cmi toplevel/toploop.cmo : \ utils/warnings.cmi \ typing/typetexp.cmi \ + toplevel/topeval.cmi \ + toplevel/topcommon.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/load_path.cmi \ + parsing/lexer.cmi \ + typing/env.cmi \ + utils/config.cmi \ + driver/compmisc.cmi \ + driver/compenv.cmi \ + utils/clflags.cmi \ + typing/btype.cmi \ + toplevel/toploop.cmi +toplevel/toploop.cmx : \ + utils/warnings.cmx \ + typing/typetexp.cmx \ + toplevel/topeval.cmi \ + toplevel/topcommon.cmx \ + utils/misc.cmx \ + parsing/location.cmx \ + utils/load_path.cmx \ + parsing/lexer.cmx \ + typing/env.cmx \ + utils/config.cmx \ + driver/compmisc.cmx \ + driver/compenv.cmx \ + utils/clflags.cmx \ + typing/btype.cmx \ + toplevel/toploop.cmi +toplevel/toploop.cmi : \ + utils/warnings.cmi \ + typing/types.cmi \ + typing/path.cmi \ + parsing/parsetree.cmi \ + typing/outcometree.cmi \ + parsing/longident.cmi \ + parsing/location.cmi \ + typing/env.cmi +toplevel/topmain.cmi : +toplevel/topstart.cmo : \ + toplevel/topmain.cmi +toplevel/topstart.cmx : \ + toplevel/topmain.cmi +toplevel/trace.cmi : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/longident.cmi \ + typing/env.cmi +toplevel/byte/topeval.cmo : \ + utils/warnings.cmi \ typing/types.cmi \ typing/typemod.cmi \ typing/typedtree.cmi \ typing/typecore.cmi \ lambda/translmod.cmi \ + toplevel/topcommon.cmi \ bytecomp/symtable.cmi \ lambda/simplif.cmi \ typing/printtyped.cmi \ typing/printtyp.cmi \ lambda/printlambda.cmi \ bytecomp/printinstr.cmi \ - parsing/printast.cmi \ typing/predef.cmi \ - parsing/pprintast.cmi \ - driver/pparse.cmi \ - typing/path.cmi \ + typing/persistent_env.cmi \ parsing/parsetree.cmi \ - parsing/parse.cmi \ typing/outcometree.cmi \ - typing/oprint.cmi \ + bytecomp/opcodes.cmi \ utils/misc.cmi \ bytecomp/meta.cmi \ - parsing/longident.cmi \ parsing/location.cmi \ utils/load_path.cmi \ - parsing/lexer.cmi \ typing/includemod.cmi \ typing/ident.cmi \ - toplevel/genprintval.cmi \ typing/env.cmi \ bytecomp/emitcode.cmi \ bytecomp/dll.cmi \ utils/config.cmi \ driver/compmisc.cmi \ - driver/compenv.cmi \ + file_formats/cmo_format.cmi \ utils/clflags.cmi \ bytecomp/bytegen.cmi \ - typing/btype.cmi \ parsing/asttypes.cmi \ - parsing/ast_helper.cmi \ - toplevel/toploop.cmi -toplevel/toploop.cmx : \ + toplevel/byte/topeval.cmi +toplevel/byte/topeval.cmx : \ utils/warnings.cmx \ - typing/typetexp.cmx \ typing/types.cmx \ typing/typemod.cmx \ typing/typedtree.cmx \ typing/typecore.cmx \ lambda/translmod.cmx \ + toplevel/topcommon.cmx \ bytecomp/symtable.cmx \ lambda/simplif.cmx \ typing/printtyped.cmx \ typing/printtyp.cmx \ lambda/printlambda.cmx \ bytecomp/printinstr.cmx \ - parsing/printast.cmx \ typing/predef.cmx \ - parsing/pprintast.cmx \ - driver/pparse.cmx \ - typing/path.cmx \ + typing/persistent_env.cmx \ parsing/parsetree.cmi \ - parsing/parse.cmx \ typing/outcometree.cmi \ - typing/oprint.cmx \ + bytecomp/opcodes.cmx \ utils/misc.cmx \ bytecomp/meta.cmx \ - parsing/longident.cmx \ parsing/location.cmx \ utils/load_path.cmx \ - parsing/lexer.cmx \ typing/includemod.cmx \ typing/ident.cmx \ - toplevel/genprintval.cmx \ typing/env.cmx \ bytecomp/emitcode.cmx \ bytecomp/dll.cmx \ utils/config.cmx \ driver/compmisc.cmx \ - driver/compenv.cmx \ + file_formats/cmo_format.cmi \ utils/clflags.cmx \ bytecomp/bytegen.cmx \ - typing/btype.cmx \ parsing/asttypes.cmi \ - parsing/ast_helper.cmx \ - toplevel/toploop.cmi -toplevel/toploop.cmi : \ - utils/warnings.cmi \ - typing/types.cmi \ - typing/path.cmi \ - parsing/parsetree.cmi \ - typing/outcometree.cmi \ - parsing/longident.cmi \ - parsing/location.cmi \ - typing/env.cmi -toplevel/topmain.cmo : \ + toplevel/byte/topeval.cmi +toplevel/byte/topeval.cmi : \ + toplevel/topcommon.cmi \ + parsing/parsetree.cmi +toplevel/byte/topmain.cmo : \ + toplevel/byte/trace.cmi \ toplevel/toploop.cmi \ + toplevel/byte/topeval.cmi \ toplevel/topdirs.cmi \ + toplevel/topcommon.cmi \ + typing/printtyp.cmi \ + typing/path.cmi \ utils/misc.cmi \ driver/main_args.cmi \ parsing/location.cmi \ + typing/env.cmi \ + typing/ctype.cmi \ driver/compmisc.cmi \ driver/compenv.cmi \ utils/clflags.cmi \ - toplevel/topmain.cmi -toplevel/topmain.cmx : \ + toplevel/byte/topmain.cmi +toplevel/byte/topmain.cmx : \ + toplevel/byte/trace.cmx \ toplevel/toploop.cmx \ + toplevel/byte/topeval.cmx \ toplevel/topdirs.cmx \ + toplevel/topcommon.cmx \ + typing/printtyp.cmx \ + typing/path.cmx \ utils/misc.cmx \ driver/main_args.cmx \ parsing/location.cmx \ + typing/env.cmx \ + typing/ctype.cmx \ driver/compmisc.cmx \ driver/compenv.cmx \ utils/clflags.cmx \ - toplevel/topmain.cmi -toplevel/topmain.cmi : -toplevel/topstart.cmo : \ - toplevel/topmain.cmi -toplevel/topstart.cmx : \ - toplevel/topmain.cmx -toplevel/trace.cmo : \ + toplevel/byte/topmain.cmi +toplevel/byte/topmain.cmi : +toplevel/byte/trace.cmo : \ typing/types.cmi \ - toplevel/toploop.cmi \ + toplevel/byte/topeval.cmi \ + toplevel/topcommon.cmi \ typing/printtyp.cmi \ typing/predef.cmi \ typing/path.cmi \ @@ -6456,10 +6467,11 @@ toplevel/trace.cmo : \ parsing/longident.cmi \ typing/ctype.cmi \ parsing/asttypes.cmi \ - toplevel/trace.cmi -toplevel/trace.cmx : \ + toplevel/byte/trace.cmi +toplevel/byte/trace.cmx : \ typing/types.cmx \ - toplevel/toploop.cmx \ + toplevel/byte/topeval.cmx \ + toplevel/topcommon.cmx \ typing/printtyp.cmx \ typing/predef.cmx \ typing/path.cmx \ @@ -6468,8 +6480,119 @@ toplevel/trace.cmx : \ parsing/longident.cmx \ typing/ctype.cmx \ parsing/asttypes.cmi \ - toplevel/trace.cmi -toplevel/trace.cmi : \ + toplevel/byte/trace.cmi +toplevel/byte/trace.cmi : \ + typing/types.cmi \ + typing/path.cmi \ + parsing/longident.cmi \ + typing/env.cmi +toplevel/native/topeval.cmo : \ + utils/warnings.cmi \ + typing/types.cmi \ + typing/typemod.cmi \ + typing/typedtree.cmi \ + typing/typecore.cmi \ + lambda/translmod.cmi \ + toplevel/topcommon.cmi \ + lambda/simplif.cmi \ + asmcomp/proc.cmi \ + typing/printtyped.cmi \ + typing/printtyp.cmi \ + lambda/printlambda.cmi \ + typing/predef.cmi \ + parsing/parsetree.cmi \ + typing/outcometree.cmi \ + utils/misc.cmi \ + parsing/location.cmi \ + utils/load_path.cmi \ + lambda/lambda.cmi \ + typing/includemod.cmi \ + middle_end/flambda/import_approx.cmi \ + typing/ident.cmi \ + middle_end/flambda/flambda_middle_end.cmi \ + typing/env.cmi \ + utils/config.cmi \ + driver/compmisc.cmi \ + middle_end/compilenv.cmi \ + middle_end/closure/closure_middle_end.cmi \ + utils/clflags.cmi \ + middle_end/backend_intf.cmi \ + parsing/asttypes.cmi \ + parsing/ast_helper.cmi \ + asmcomp/asmlink.cmi \ + asmcomp/asmgen.cmi \ + asmcomp/arch.cmo \ + toplevel/native/topeval.cmi +toplevel/native/topeval.cmx : \ + utils/warnings.cmx \ + typing/types.cmx \ + typing/typemod.cmx \ + typing/typedtree.cmx \ + typing/typecore.cmx \ + lambda/translmod.cmx \ + toplevel/topcommon.cmx \ + lambda/simplif.cmx \ + asmcomp/proc.cmx \ + typing/printtyped.cmx \ + typing/printtyp.cmx \ + lambda/printlambda.cmx \ + typing/predef.cmx \ + parsing/parsetree.cmi \ + typing/outcometree.cmi \ + utils/misc.cmx \ + parsing/location.cmx \ + utils/load_path.cmx \ + lambda/lambda.cmx \ + typing/includemod.cmx \ + middle_end/flambda/import_approx.cmx \ + typing/ident.cmx \ + middle_end/flambda/flambda_middle_end.cmx \ + typing/env.cmx \ + utils/config.cmx \ + driver/compmisc.cmx \ + middle_end/compilenv.cmx \ + middle_end/closure/closure_middle_end.cmx \ + utils/clflags.cmx \ + middle_end/backend_intf.cmi \ + parsing/asttypes.cmi \ + parsing/ast_helper.cmx \ + asmcomp/asmlink.cmx \ + asmcomp/asmgen.cmx \ + asmcomp/arch.cmx \ + toplevel/native/topeval.cmi +toplevel/native/topeval.cmi : \ + toplevel/topcommon.cmi \ + parsing/parsetree.cmi +toplevel/native/topmain.cmo : \ + toplevel/toploop.cmi \ + toplevel/native/topeval.cmi \ + toplevel/topcommon.cmi \ + utils/misc.cmi \ + driver/main_args.cmi \ + parsing/location.cmi \ + driver/compmisc.cmi \ + driver/compenv.cmi \ + utils/clflags.cmi \ + toplevel/native/topmain.cmi +toplevel/native/topmain.cmx : \ + toplevel/toploop.cmx \ + toplevel/native/topeval.cmx \ + toplevel/topcommon.cmx \ + utils/misc.cmx \ + driver/main_args.cmx \ + parsing/location.cmx \ + driver/compmisc.cmx \ + driver/compenv.cmx \ + utils/clflags.cmx \ + toplevel/native/topmain.cmi +toplevel/native/topmain.cmi : +toplevel/native/trace.cmo : \ + typing/path.cmi \ + toplevel/native/trace.cmi +toplevel/native/trace.cmx : \ + typing/path.cmx \ + toplevel/native/trace.cmi +toplevel/native/trace.cmi : \ typing/types.cmi \ typing/path.cmi \ parsing/longident.cmi \ diff --git a/.gitattributes b/.gitattributes index 5961fef2..956d2136 100644 --- a/.gitattributes +++ b/.gitattributes @@ -46,7 +46,8 @@ *.md typo.missing-header README* typo.missing-header *.adoc typo.missing-header -stdlib/*.mld typo.missing-header +api_docgen/*.mld typo.missing-header +api_docgen/alldoc.tex typo.missing-header tools/mantis2gh_stripped.csv typo.missing-header *.adoc typo.long-line=may @@ -63,7 +64,6 @@ tools/mantis2gh_stripped.csv typo.missing-header # tools/ci/appveyor/appveyor_build.cmd only has missing-header because # dra27 too lazy to update check-typo to interpret Cmd-style comments! /tools/ci/appveyor/appveyor_build.cmd typo.very-long-line typo.missing-header typo.non-ascii -/tools/ci/appveyor/appveyor_build.sh typo.non-ascii /tools/ci/inria/bootstrap/remove-sinh-primitive.patch typo.prune /release-info/howto.md typo.missing-header typo.long-line /release-info/templates/*.md typo.missing-header typo.very-long-line=may @@ -72,7 +72,7 @@ tools/mantis2gh_stripped.csv typo.missing-header /.depend.menhir typo.prune # Makefiles may contain tabs -Makefile* typo.tab=may +Makefile* typo.makefile-whitespace=may asmcomp/*/emit.mlp typo.tab=may typo.long-line=may @@ -101,6 +101,8 @@ otherlibs/win32unix/readlink.c typo.long-line otherlibs/win32unix/stat.c typo.long-line otherlibs/win32unix/symlink.c typo.long-line +runtime/sak.c typo.non-ascii + stdlib/hashbang typo.white-at-eol typo.missing-lf testsuite/tests/** typo.missing-header typo.long-line=may @@ -110,6 +112,7 @@ testsuite/tests/misc-unsafe/almabench.ml typo.long-line testsuite/tests/tool-toplevel/strings.ml typo.utf8 testsuite/tests/win-unicode/*.ml typo.utf8 testsuite/tests/asmgen/immediates.cmm typo.very-long-line +testsuite/tests/generated-parse-errors/errors.* typo.very-long-line testsuite/tools/*.S typo.missing-header testsuite/tools/*.asm typo.missing-header testsuite/typing typo.missing-header @@ -150,6 +153,7 @@ menhir-bench.bash typo.missing-header typo.utf8 /tools/ci/appveyor/appveyor_build.cmd text eol=crlf +aclocal.m4 typo.tab configure.ac text eol=lf build-aux/compile text eol=lf build-aux/config.guess text eol=lf @@ -164,6 +168,7 @@ stdlib/sharpbang text eol=lf tools/autogen text eol=lf tools/ci/inria/remove-sinh-primitive.patch text eol=lf tools/check-typo text eol=lf +tools/check-symbol-names text eol=lf tools/ci-build text eol=lf tools/msvs-promote-path text eol=lf tools/gdb-macros text eol=lf @@ -171,7 +176,6 @@ tools/magic text eol=lf tools/make-opcodes text eol=lf tools/make-package-macosx text eol=lf tools/ocaml-objcopy-macosx text eol=lf -tools/ocamlmktop.tpl text eol=lf tools/ocamlsize text eol=lf tools/pre-commit-githook text eol=lf tools/markdown-add-pr-links.sh text eol=lf @@ -189,73 +193,23 @@ manual/tools/texexpand text eol=lf # Tests which include references spanning multiple lines fail with \r\n # endings, so use \n endings only, even on Windows. +testsuite/tests/backtrace/names.ml text eol=lf testsuite/tests/basic-modules/anonymous.ml text eol=lf -testsuite/tests/basic-more/morematch.ml text eol=lf -testsuite/tests/basic-more/robustmatch.ml text eol=lf -testsuite/tests/parsing/*.ml text eol=lf -testsuite/tests/docstrings/empty.ml text eol=lf +testsuite/tests/formatting/test_locations.ml text eol=lf testsuite/tests/functors/functors.ml text eol=lf +testsuite/tests/lib-dynlink-initializers/test10_main.ml text eol=lf +testsuite/tests/parsing/attributes.ml text eol=lf +testsuite/tests/parsing/extensions.ml text eol=lf +testsuite/tests/parsing/hash_ambiguity.ml text eol=lf +testsuite/tests/parsing/int_and_float_with_modifier.ml text eol=lf +testsuite/tests/parsing/pr6865.ml text eol=lf +testsuite/tests/parsing/quotedextensions.ml text eol=lf +testsuite/tests/parsing/shortcut_ext_attr.ml text eol=lf testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_impl.ml text eol=lf testsuite/tests/tool-ocamlc-stop-after/stop_after_parsing_intf.mli text eol=lf testsuite/tests/tool-ocamlc-stop-after/stop_after_typing_impl.ml text eol=lf -testsuite/tests/tool-toplevel/error_highlighting.ml text eol=lf -testsuite/tests/tool-toplevel/error_highlighting_use4.ml text eol=lf testsuite/tests/translprim/module_coercion.ml text eol=lf -testsuite/tests/typing-objects-bugs/pr3968_bad.ml text eol=lf -testsuite/tests/typing-ocamlc-i/pr7402.ml text eol=lf -testsuite/tests/typing-ocamlc-i/pervasives_leitmotiv.ml text eol=lf -testsuite/tests/typing-recmod/t12bad.ml text eol=lf -testsuite/tests/typing-safe-linking/b_bad.ml text eol=lf -testsuite/tests/warnings/w04.ml text eol=lf -testsuite/tests/warnings/w04_failure.ml text eol=lf -testsuite/tests/warnings/w32.ml text eol=lf - -# These are forced to \n to allow the Cygwin testsuite to pass on a + +# This is forced to \n to allow the Cygwin testsuite to pass on a # Windows-checkout -testsuite/tests/formatting/margins.ml text eol=lf -testsuite/tests/letrec-check/pr7706.ml text eol=lf -testsuite/tests/letrec-disallowed/disallowed.ml text eol=lf -testsuite/tests/letrec-disallowed/extension_constructor.ml text eol=lf -testsuite/tests/letrec-disallowed/float_block_allowed.ml text eol=lf -testsuite/tests/letrec-disallowed/float_block_disallowed.ml text eol=lf -testsuite/tests/letrec-disallowed/generic_arrays.ml text eol=lf -testsuite/tests/letrec-disallowed/lazy_.ml text eol=lf -testsuite/tests/letrec-disallowed/module_constraints.ml text eol=lf -testsuite/tests/letrec-disallowed/unboxed.ml text eol=lf -testsuite/tests/letrec-disallowed/pr7215.ml text eol=lf -testsuite/tests/letrec-disallowed/pr7231.ml text eol=lf -testsuite/tests/letrec-disallowed/pr7706.ml text eol=lf -testsuite/tests/lexing/uchar_esc.ml text eol=lf -testsuite/tests/match-exception-warnings/exhaustiveness_warnings.ml text eol=lf -testsuite/tests/tool-toplevel/pr7060.ml text eol=lf -testsuite/tests/typing-extension-constructor/test.ml text eol=lf -testsuite/tests/typing-extensions/extensions.ml text eol=lf -testsuite/tests/typing-extensions/open_types.ml text eol=lf -testsuite/tests/typing-objects/Exemples.ml text eol=lf -testsuite/tests/typing-objects/pr5619_bad.ml text eol=lf -testsuite/tests/typing-objects/pr6123_bad.ml text eol=lf -testsuite/tests/typing-objects/pr6907_bad.ml text eol=lf -testsuite/tests/typing-objects/Tests.ml text eol=lf -testsuite/tests/typing-pattern_open/pattern_open.ml text eol=lf -testsuite/tests/typing-private/private.ml text eol=lf -testsuite/tests/typing-recordarg/recordarg.ml text eol=lf -testsuite/tests/typing-short-paths/pr5918.ml text eol=lf -testsuite/tests/typing-sigsubst/sigsubst.ml text eol=lf -testsuite/tests/typing-typeparam/newtype.ml text eol=lf -testsuite/tests/typing-unboxed/test.ml text eol=lf -testsuite/tests/typing-unboxed-types/test.ml text eol=lf -testsuite/tests/typing-unboxed-types/test_flat.ml text eol=lf -testsuite/tests/typing-unboxed-types/test_no_flat.ml text eol=lf -testsuite/tests/typing-warnings/ambiguous_guarded_disjunction.ml text eol=lf -testsuite/tests/typing-warnings/application.ml text eol=lf -testsuite/tests/typing-warnings/coercions.ml text eol=lf -testsuite/tests/typing-warnings/exhaustiveness.ml text eol=lf -testsuite/tests/typing-warnings/pr6587.ml text eol=lf -testsuite/tests/typing-warnings/pr6872.ml text eol=lf -testsuite/tests/typing-warnings/pr7085.ml text eol=lf -testsuite/tests/typing-warnings/pr7115.ml text eol=lf -testsuite/tests/typing-warnings/pr7261.ml text eol=lf -testsuite/tests/typing-warnings/pr7297.ml text eol=lf -testsuite/tests/typing-warnings/pr7553.ml text eol=lf -testsuite/tests/typing-warnings/records.ml text eol=lf -testsuite/tests/typing-warnings/unused_types.ml text eol=lf +testsuite/tests/parsetree/locations_test.ml text eol=lf diff --git a/.github/workflows/build.yml b/.github/workflows/build.yml new file mode 100644 index 00000000..8a508ad0 --- /dev/null +++ b/.github/workflows/build.yml @@ -0,0 +1,93 @@ +name: Build + +on: [push, pull_request] + +jobs: + no-naked-pointers: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: configure tree + run: ./configure --disable-naked-pointers --disable-stdlib-manpages --disable-dependency-generation --enable-ocamltest + - name: Build + run: | + make -j world.opt + - name: Run the testsuite + run: | + make -C testsuite USE_RUNTIME=d all + i386-static: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + - name: Packages + run: | + sudo apt-get update -y && sudo apt-get install -y gcc-multilib gfortran-multilib + - name: configure tree + run: | + XARCH=i386 CONFIG_ARG='--disable-stdlib-manpages --disable-shared --enable-cmm-invariants' bash -xe tools/ci/actions/runner.sh configure + - name: Build + run: | + bash -xe tools/ci/actions/runner.sh build + - name: Run the testsuite + run: | + bash -xe tools/ci/actions/runner.sh test + - name: Install + run: | + bash -xe tools/ci/actions/runner.sh install + - name: Other checks + run: | + bash -xe tools/ci/actions/runner.sh other-checks + full-flambda: + runs-on: ubuntu-latest + steps: + - name: Checkout + uses: actions/checkout@v2 + with: + fetch-depth: 50 + - name: Packages + run: | + sudo apt-get update -y && sudo apt-get install -y texlive-latex-extra texlive-fonts-recommended hevea sass + # Ensure that make distclean can be run from an empty tree + - name: distclean + run: | + MAKE_ARG=-j make distclean + - name: configure tree + run: | + MAKE_ARG=-j XARCH=x64 CONFIG_ARG='--enable-flambda --enable-cmm-invariants --enable-dependency-generation' OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh configure + - name: Build + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh build + - name: Run the testsuite + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh test + - name: Build API Documentation + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh api-docs + - name: Install + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh install + - name: Check for manual changes + id: manual + run: >- + tools/ci/actions/check-manual-modified.sh + '${{ github.ref }}' + '${{ github.event_name }}' + '${{ github.event.pull_request.base.ref }}' + '${{ github.event.pull_request.base.sha }}' + '${{ github.event.pull_request.head.ref }}' + '${{ github.event.pull_request.head.sha }}' + '${{ github.event.ref }}' + '${{ github.event.before }}' + '${{ github.event.ref }}' + '${{ github.event.after }}' + '${{ github.event.repository.full_name }}' + - name: Build the manual + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh manual + # Temporarily disabled 23-Apr-2021 while Dune isn't building + if: steps.manual.outputs.changed == 'disabled' + - name: Other checks + run: | + MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh other-checks diff --git a/.github/workflows/hygiene.yml b/.github/workflows/hygiene.yml new file mode 100644 index 00000000..e76ba6b9 --- /dev/null +++ b/.github/workflows/hygiene.yml @@ -0,0 +1,95 @@ +name: Hygiene +on: + push: + pull_request: + types: [opened, synchronize, reopened, labeled, unlabeled] + +jobs: + hygiene: + name: Checks + runs-on: ubuntu-latest + steps: + - name: GitHub Context + run: echo $GITHUB_CONTEXT + env: + GITHUB_CONTEXT: ${{ toJson(github) }} + # Comment out the line below to enable (debugging) display of the github + # context variable. + if: failure() + + - uses: actions/checkout@v2 + with: + fetch-depth: 50 + + - name: Changes updated + run: >- + tools/ci/actions/check-changes-modified.sh + '${{ github.ref }}' + 'pull_request' + '${{ github.event.pull_request.base.ref }}' + '${{ github.event.pull_request.base.sha }}' + '${{ github.event.pull_request.head.ref }}' + '${{ github.event.pull_request.head.sha }}' + if: >- + !contains(github.event.pull_request.labels.*.name, 'no-change-entry-needed') + && github.event_name == 'pull_request' + + - name: configure correctly generated + run: >- + tools/ci/actions/check-configure.sh + '${{ github.ref }}' + '${{ github.event_name }}' + '${{ github.event.pull_request.base.ref }}' + '${{ github.event.pull_request.base.sha }}' + '${{ github.event.pull_request.head.ref }}' + '${{ github.event.pull_request.head.sha }}' + '${{ github.event.ref }}' + '${{ github.event.before }}' + '${{ github.event.ref }}' + '${{ github.event.after }}' + if: ${{ always() }} + + - name: check-typo revered + run: >- + tools/ci/actions/check-typo.sh + '${{ github.ref }}' + '${{ github.event_name }}' + '${{ github.event.pull_request.base.ref }}' + '${{ github.event.pull_request.base.sha }}' + '${{ github.event.pull_request.head.ref }}' + '${{ github.event.pull_request.head.sha }}' + '${{ github.event.ref }}' + '${{ github.event.before }}' + '${{ github.event.ref }}' + '${{ github.event.after }}' + if: ${{ always() }} + + - name: check-typo on whole tree + run: tools/check-typo + if: >- + github.event_name == 'push' + && (startsWith(github.event.ref, 'refs/heads/4.') + || github.event.ref == 'refs/heads/trunk') + && always() + + - name: Check that labelled/unlabelled .mli files are in sync + run: tools/ci/actions/check-labelled-interfaces.sh + if: always() + + # This step records the build success in the variable build-status, + # allowing the last two steps to skip, rather than go beserk with a + # faulty compiler. + - name: Build a minimal compiler for alldepend + id: compiler + run: tools/ci/actions/runner.sh basic-compiler + if: always() + + - name: Check that dependency info is up-to-date + run: tools/ci/actions/check-alldepend.sh + if: steps.compiler.outputs.build-status == 'success' && always() + + - name: Check global structure of the reference manual + run: | + # Required configuration info is left-over from the previous step + make -C manual/tests check-stdlib check-case-collision + if: steps.compiler.outputs.build-status == 'success' && always() diff --git a/.github/workflows/main.yml b/.github/workflows/main.yml deleted file mode 100644 index 5dc0daeb..00000000 --- a/.github/workflows/main.yml +++ /dev/null @@ -1,71 +0,0 @@ -name: main - -on: [push, pull_request] - -jobs: - no-naked-pointers: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: configure tree - run: ./configure --disable-naked-pointers --disable-stdlib-manpages --disable-dependency-generation --enable-ocamltest - - name: Build - run: | - make -j world.opt - - name: Run the testsuite - run: | - make -C testsuite USE_RUNTIME=d all - i386-static: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Packages - run: | - sudo apt-get update -y && sudo apt-get install -y gcc-multilib gfortran-multilib - - name: configure tree - run: | - XARCH=i386 CONFIG_ARG='--disable-stdlib-manpages --disable-shared' bash -xe tools/ci/actions/runner.sh configure - - name: Build - run: | - bash -xe tools/ci/actions/runner.sh build - - name: Run the testsuite - run: | - bash -xe tools/ci/actions/runner.sh test - - name: Install - run: | - bash -xe tools/ci/actions/runner.sh install - - name: Other checks - run: | - bash -xe tools/ci/actions/runner.sh other-checks - full-flambda: - runs-on: ubuntu-latest - steps: - - name: Checkout - uses: actions/checkout@v2 - - name: Packages - run: | - sudo apt-get update -y && sudo apt-get install -y texlive-latex-extra texlive-fonts-recommended - # Ensure that make distclean can be run from an empty tree - - name: distclean - run: | - MAKE_ARG=-j make distclean - - name: configure tree - run: | - MAKE_ARG=-j XARCH=x64 CONFIG_ARG='--enable-flambda --enable-dependency-generation' OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh configure - - name: Build - run: | - MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh build - - name: Run the testsuite - run: | - MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh test - - name: Build API Documentation - run: | - MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh api-docs - - name: Install - run: | - MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh install - - name: Other checks - run: | - MAKE_ARG=-j OCAMLRUNPARAM=b,v=0 bash -xe tools/ci/actions/runner.sh other-checks diff --git a/.gitignore b/.gitignore index 466edf57..cd5bf11c 100644 --- a/.gitignore +++ b/.gitignore @@ -48,6 +48,7 @@ _build /ocaml-*.cache /config.log /config.status +/flexlink.opt /libtool /ocamlc.opt /expunge @@ -67,8 +68,10 @@ _build /asmcomp/CSE.ml /boot/ocamlrun +/boot/ocamlruns /boot/camlheader /boot/ocamlc.opt +/boot/flexlink.byte /bytecomp/opcodes.ml /bytecomp/opcodes.mli @@ -81,6 +84,8 @@ _build /emacs/ocamltags /emacs/*.elc +/flexdll-sources + /lambda/runtimedef.ml /lex/parser.ml @@ -90,8 +95,12 @@ _build /lex/ocamllex.opt /lex/parser.output -/manual/manual/cmds/warnings-help.etex -/manual/manual/warnings-help.etex +/manual/src/cmds/warnings-help.etex +/manual/src/warnings-help.etex + +/api_docgen/build +/api_docgen/odoc/build +/api_docgen/ocamldoc/build /ocamldoc/ocamldoc /ocamldoc/ocamldoc.opt @@ -105,10 +114,6 @@ _build /ocamldoc/odoc_text_lexer.ml /ocamldoc/odoc_text_parser.ml /ocamldoc/odoc_text_parser.mli -/ocamldoc/stdlib_man -/ocamldoc/stdlib_html -/ocamldoc/stdlib_latex -/ocamldoc/stdlib_texi /ocamldoc/*.output /ocamldoc/test_stdlib /ocamldoc/test_latex @@ -175,6 +180,7 @@ _build /parsing/parser.output /parsing/parser.automaton /parsing/parser.conflicts +/parsing/parser.auto.messages /parsing/camlinternalMenhirLib.ml /parsing/camlinternalMenhirLib.mli @@ -192,6 +198,8 @@ _build /runtime/ld.conf /runtime/.gdb_history /runtime/.dep +/runtime/build_config.h +/runtime/sak /runtime/domain_state32.inc /runtime/domain_state64.inc @@ -247,7 +255,6 @@ _build /tools/keywords /tools/ocamlmklib /tools/ocamlmklib.opt -/tools/ocamlmklibconfig.ml /tools/ocamlcmt /tools/ocamlcmt.opt /tools/cmpbyt @@ -259,6 +266,13 @@ _build /tools/caml-tex /tools/eventlog_metadata +/toplevel/byte/topeval.mli +/toplevel/byte/trace.mli +/toplevel/byte/topmain.mli +/toplevel/native/topeval.mli +/toplevel/native/trace.mli +/toplevel/native/topmain.mli + /utils/config.ml /utils/domainstate.ml /utils/domainstate.mli diff --git a/.mailmap b/.mailmap index 8eec8afa..730ac07b 100644 --- a/.mailmap +++ b/.mailmap @@ -28,10 +28,21 @@ cvs2svn Damien Doligez Some Name Damien Doligez doligez Mohamed Iguernelala -Jérémie Dimino +Jérémie Dimino +Jérémie Dimino Jeremy Yallop yallop Nicolás Ojeda Bär - +Nicolás Ojeda Bär +François Pottier +Jérôme Vouillon +Frédéric Bour +Frédéric Bour +Armaël Guéneau +Armaël Guéneau +Armaël Guéneau +Edwin Török +Edwin Török +Edwin Török ### Approved Approvers diff --git a/.travis.yml b/.travis.yml deleted file mode 100644 index a2373e87..00000000 --- a/.travis.yml +++ /dev/null @@ -1,30 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* Anil Madhavapeddy, OCaml Labs * -#* * -#* Copyright 2014 Institut National de Recherche en Informatique et * -#* en Automatique. * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -dist: bionic -language: c -git: - submodules: false -script: tools/ci/travis/travis-ci.sh -matrix: - include: - - env: CI_KIND=check-depend - - env: CI_KIND=changes - - env: CI_KIND=manual - - env: CI_KIND=check-typo - -notifications: - email: - - ocaml-ci-notifications@inria.fr diff --git a/BOOTSTRAP.adoc b/BOOTSTRAP.adoc index e73d01fe..70db0d0e 100644 --- a/BOOTSTRAP.adoc +++ b/BOOTSTRAP.adoc @@ -31,8 +31,8 @@ Here is how to perform a change that requires a bootstrap: safer. Similarly, `make world.opt` will also bring you to such a stable state but builds more things than actually required.) -4. Now, and only now, edit the sources. Changes here may include adding, - removing or renaming a primitive in the runtime, changing the magic +4. Now, and only now, edit the sources. Changes here may include removing + or renaming a primitive in the runtime, changing the magic number of bytecode executable files, changing the way types are represented or anything else in the format of .cmi files, etc. @@ -53,10 +53,57 @@ This will rebuild runtime/ocamlrun, ocamlc, etc. make bootstrap += Problems + If you notice that this procedure fails for a given change you are trying to implement, please report it so that the procedure can be updated to also cope with your change. += Upstreaming + If you want to upstream your changes, indicate in the message of the commit that the changes need a bootstrap. Perform the bootstrap and commit the result of the bootstrap separately, after that commit. + += Adding, removing and renaming primitives + +Primitives can be added without having to bootstrap, however it is necessary +to repeat `make coldstart` in order to use your new primitive in the standard +library. + +There are five steps to renaming a primitive: + +1. Rename the primitive and its uses + +2. Create a temporary stub with the old primitive's name. This stub simply + passes its arguments on to the new primitive: + + CAMLprim value caml_old_primitive(value a1, value a2) { + return caml_new_primitive(a1, a2); + } + +3. Deal with the addition of the new primitive: + + make coldstart + +4. Ensure the system still works: + + make coreall + +5. Now remove the old primitive stub and issue: + + make bootstrap + +It is desirable for bootstraps to be easily repeatable, so you should commit +changes after step 4. + += Bootstrap test script + +A script is provided (and used on Inria's continuous +integration infrastructure) to make sure the bootstrap works. This +script implements the bootstrap procedure described above and performs +two changes to the compiler: it updates the magic numbers and removes +a primitive from the runtime. It then makes sure the bootstrap still +works after these changes. This script can be run locally as follows: + + OCAML_ARCH=linux ./tools/ci/inria/bootstrap diff --git a/CONTRIBUTING.md b/CONTRIBUTING.md index 22e630b9..6663229e 100644 --- a/CONTRIBUTING.md +++ b/CONTRIBUTING.md @@ -66,10 +66,7 @@ contribution. You should not leave trailing whitespace; not have line longer than 80 columns, not use tab characters (spaces only), and not use non-ASCII characters. These typographical rules can be checked with the script -`tools/check-typo`. - -If you are working from a Git clone, you can automate this process by -copying the file `tools/pre-commit-githook` to `.git/hooks/pre-commit`. +`tools/check-typo`, see [HACKING.adoc: check-typo](HACKING.adoc#check-typo). Otherwise, there are no strongly enforced guidelines specific to the compiler -- and, as a result, the style may differ in the different @@ -341,51 +338,9 @@ log -u` to make sure the rebase patches make sense), but: ## Contributing to the standard library -Contributions to the standard library are very welcome. There is some -widespread belief in the community than the stdlib is somehow "frozen" -and that its evolutions are mostly driven by the need of the OCaml -compiler itself. Let's be clear: this is just plain wrong. The -compiler is happy with its own local utility functions, and many -recent additions to the stdlib are not used by the compiler. - -Another common and wrong idea is that core OCaml maintainers don't -really care about the standard library. This is not true, and won't -be unless one of the "alternative standard" libraries really gains -enough "market share" in the community. - -So: please contribute! - -Obviously, the proposals to evolve the standard library will be -evaluated with very high standards, similar to those applied to the -evolution of the surface langage, and much higher than those for -internal compiler changes (optimizations, etc). - -A key property of the standard library is its stability. Backward -compatibility is not an absolute technical requirement (any addition -to/of a module can break existing code, formally), but breakage should -be limited as much as possible (and assessed, when relevant). A -corollary is that any addition creates a long-term support commitment. -For instance, once a concrete type or function is made public, -changing the exposed definition cannot be done easily. - -There is no plan to extend dramatically the functional domain covered -by the standard library. For instance, proposals to include support -for XML, JSON, or network protocols are very likely to be rejected. Such -domains are better treated by external libraries. Small additions to -existing modules are much simpler to get in, even more so (but not -necessarily) when: - - - they cannot easily be implemented externally, or when - - they facilitate communication between independent external - libraries, or when - - they fill obvious gaps. - -Of course, standard guidelines apply as well: proper documentation, -proper tests, portability (yes, also Windows!), good justification for -why the change is desirable and why it should go into stdlib. - -So: be prepared for some serious review process! But yes, yes, -contributions are welcome and appreciated. Promised. +Contributions to the standard library are very welcome. +See the dedicated [stdlib/CONTRIBUTING.md](stdlib/CONTRIBUTING.md) +for more information. ## Contributing optimizations diff --git a/Changes b/Changes index f7e2b2cd..cf020c89 100644 --- a/Changes +++ b/Changes @@ -1,23 +1,654 @@ -OCaml 4.12.1 (24 September 2021) +OCaml 4.13.0 (24 September 2021) -------------------------------- -### Bug fixes: +### Progress towards Multicore: + +- #10039: Safepoints + Add poll points to native generated code. These are effectively + zero-sized allocations and fix some signal and remembered set + issues. Also multicore prerequisite. + (Sadiq Jaffer, Stephen Dolan, Damien Doligez, Xavier Leroy, + Anmol Sahoo, Mark Shinwell, review by Damien Doligez, Xavier Leroy, + and Mark Shinwell) + +- #9876: do not cache the young_limit GC variable in a processor register. + This affects the ARM64, PowerPC and RISC-V ports, making signal handling + and minor GC triggers more reliable, at the cost of a small slowdown. + (Xavier Leroy, review by Nicolás Ojeda Bär) + +### Language features (highlights): + +- #9584, #7074: Allow to name existentials in pattern-matching + One can now write '(Cstr (type a) (x, y : int * a))' to give a name to + existentials freshly introduced by GADT constructors. + (Jacques Garrigue, review by Leo White and Gabriel Scherer) + +### Compiler user-interface and warnings (highlights): + +- #9331: Improve error messages for functor application and functor types. + (Florian Angeletti and Gabriel Radanne, review by Leo White) + +* #10118, #10140: enable warning 6 [labels-omitted] by default. + The following now warns: + let f ~x y = ... in f 3 5 + the callsite (f 3 5) has to be turned into (f ~x:3 5). + This prevents mistakes where two arguments of the same types are swapped. + (Note: Dune already enables this warning by default.) + (Gabriel Scherer, review by Xavier Leroy and Florian Angeletti, + report by ygrek) + +### Manual and documentation (highlights): + +- #10247: Add initial tranche of examples to reference manual. + Adds some eighty examples to the reference manual, principally to the + expressions and patterns sections. + https://ocaml.org/releases/4.13/manual/patterns.html + (John Whitington, review by Xavier Leroy, Gabriel Scherer, @Fourchaux, and + Florian Angeletti) + +- #9987, #9988, #9996, #9997: add an odoc mode for the documentation + of the standard library and compiler library + (Florian Angeletti, review by David Allsopp, Sébastien Hinderer, + and Gabriel Scherer) + +### Standard library (highlights): + +- #944: Add some missing C99 float operations. `Stdlib` now contains + the inverse hyperbolic functions + `acosh`, `asinh`, and `atanh`. + These functions were also added to module `Stdlib.Float` together with + `exp2`, `log2`, `cbrt`, `erf`, and `erfc`. + Full support on MSVC requires VS2013+ but emulated versions are + still available (for now) for older compilers. + (Markus Mottl, review by David Allsopp, Olivier Andrieu, Florian Angeletti, + Nicolás Ojeda Bär, Daniel Bünzli, Fabian @copy, Pascal Cuoq, Damien + Doligez, Sébastien Hinderer, Jacques-Henri Jourdan, Xavier Leroy, Guillaume + Melquiond, Perry E. Metzger, Runhang Li, Gabriel Scherer, Mark Shinwell, + Bernhard Schommer and Christophe Troestler) + +- #9582: Add Array.{find_opt,find_map,split,combine}. + (Nicolás Ojeda Bär, review by Daniel Bünzli and Gabriel Scherer) + +- #9533: Added String.starts_with and String.ends_with. + (Bernhard Schommer, review by Daniel Bünzli, Gabriel Scherer and + Alain Frisch) + +### Code generation and optimizations (highlights): + +- #10404: Add a generic backward dataflow analyzer and use it to speed up + liveness analysis + (Xavier Leroy, review by Gabriel Scherer, Greta Yorsh, Mark Shinwell) + +- #10414: Avoid compilation times exponential in the nesting of loops + in the spilling and reloading passes + (Xavier Leroy, review by Vincent Laviron) + +### Internal typechecker changes (highlights): + +- #10170: Maintain more structural information in type-checking errors + A mostly-internal change that preserves more information in errors + during type checking; most significantly, it split the errors from + unification, moregen, and type equality into three different types. + (Antal Spector-Zabusky and Mekhrubon Tuarev, review by Leo White, + Florian Angeletti, and Jacques Garrigue) + +- #9994: Make Types.type_expr a private type, and abstract marking mechanism + (Jacques Garrigue and Takafumi Saikawa, + review by Gabriel Scherer and Leo White) + +### Runtime system (highlights): + +- #10188, #10213: Switch the default allocation policy to best-fit and adjust + the default overhead parameter accordingly. + (Damien Doligez, review by Josh Berdine and Xavier Leroy) + +- #10549: Stack overflow detection and naked pointers checking for ARM64 + (Xavier Leroy, review by Stephen Dolan) + +- #9934: Optimise sweeping using prefetching. + (Stephen Dolan and Will Hasenplaugh, review by David Allsopp, Xavier + Leroy and Damien Doligez, benchmarking by Shubham Kumar and KC + Sivaramakrishnan) + +- #10194: Change compaction-triggering heuristic: use the overhead measured + by the previous GC cycle instead of an indirect (and noisy) computation + of the current overhead. + (Damien Doligez, review by Stephen Dolan) + +- #10449: Fix major GC work accounting (the GC was running too fast). + (Damien Doligez, report by Stephen Dolan, review by Nicolás Ojeda Bär and + Sadiq Jaffer) + + +### Language features: + +- #10013: Let-punning + Allow 'let* x in ...' and 'let%ext x in ...' as shorthand for + 'let* x = x in ...' and 'let%ext x = x in ...' respectively. + (Stephen Dolan, review by Gabriel Scherer) + +- #10133: module type substitutions + Allow 'SIG with module type T = F(X).S', 'SIG with module type T := sig end' + and their local equivalent `module type T := sig type u end` + (Florian Angeletti, review by Gabriel Radanne and Leo White) + +### Type system: + +* #10081: Typecheck `x |> f` and `f @@ x` as `(f x)` + (Alain Frisch, review by Jacques Garrigue, Josh Berdine and Thomas Refis) + +### Runtime system: + +- #10318: Windows Unicode runtime functions are no longer marked as + experimental. + (Nicolás Ojeda Bär, review by David Allsopp) + +- #9284: Add -config option to display the configuration of ocamlrun on stdout, + including the search path for shared stub libraries. + (David Allsopp, review by Xavier Leroy) + +- #9919: Introduce caml_record_backtraces and update Interfacing with C to + refer to it (previous instruction to use caml_record_backtrace primitive was + not possible without defining CAML_INTERNALS) + (David Allsopp, review by Xavier Leroy) + +- #10102: Ignore PROFINFO_WIDTH if WITH_PROFINFO is not defined (technically + a breaking change if the configuration system was being abused before). + (David Allsopp, review by Xavier Leroy) - #10107: Ensure modules compiled with -afl-instrument can still link on platforms without AFL support. (David Allsopp, review by Xavier Leroy) +* #10098: Improve command-line parsing in ocamlrun: strictly recognise options, + be more informative for `ocamlrun -I` and support `--` for terminating options + parsing. + (David Allsopp, review by Xavier Leroy) + +- #10101: Add -help/--help option to ocamlrun. + (David Allsopp, review by Xavier Leroy) + +- #10136: Minor clean-ups in runtime/io.c and runtime/caml/io.h + (Xavier Leroy, review by David Allsopp and Guillaume Munch-Maccagnoni) + +- #10171: Tweak the naked pointers checker so that processes which trigger the + alarm always exit with non-zero status (i.e. exit(0) becomes exit(70)). + (David Allsopp, review by Xavier Leroy) + +- #10212: Simplify and improve the Windows-specific code that connects + to the debugger via a socket. + (Antonin Décimo, review by Xavier Leroy) + +- #10217: Fix a segfault in a corner case of compaction (reported in #9853) + (Damien Doligez, report by Sadiq Jaffer, review by Stephen Dolan) + +- #10250, #10266: Dynamically allocate alternate signal stacks to + accommodate changes in Glibc 2.34. + (Xavier Leroy, reports by Tomasz Kłoczko and R.W.M. Jones, review by Anil + Madhavapeddy, Stephen Dolan, and Florian Angeletti) + +### Code generation and optimizations: + +- #1400: Add an optional invariants check on Cmm, which can be activated + with the -dcmm-invariants flag + (Vincent Laviron, with help from Sebastien Hinderer, review by Stephen Dolan + and David Allsopp) + +- #9562, #367: Allow CSE of immutable loads across stores + (Stephen Dolan, review by Mark Shinwell) + +- #9937: improvements in ARM64 code generation (constants, sign extensions) + (Xavier Leroy, review by Stephen Dolan) + +- #10228: Better code-generation for inlined comparisons + (Stephen Dolan, review by Alain Frisch and Xavier Leroy) + +- #10244: Optimise Int32.unsigned_to_int + (Fabian Hemmer, review by Stephen Dolan and Xavier Leroy) + +- #10302, #10303: Fix incorrect instruction selection for string constant loads + on ppc. + (David Allsopp, review by Stephen Dolan) + +- #10349: Fix destroyed_at_c_call on RISC-V + (Mark Shinwell, review by Nicolás Ojeda Bär) + +- #10419: Add %frame_pointers primitive which is true only in native code with + frame pointers mode enabled. + (David Allsopp, review by Vincent Laviron and Mark Shinwell) + +### Standard library: + +- #9448: Add String.{empty,cat} as dual of Bytes.{empty,cat}, + String.{of,to}_bytes as aliases of Bytes.{to,of}_string, + Bytes.split_on_char as dual of String.split_on_char, and binary decoding + functions in String to match those in Bytes. + (David Allsopp, review by Damien Doligez, Gabriel Scherer and others) + +- #9487, #9489: Add Random.full_int which allows 62-bit bounds on 64-bit + systems. + (David Allsopp, request by Francois Berenger, review by Xavier Leroy and + Damien Doligez) + +- #9961: Add Array.fold_left_map. + (Craig Ferguson, review by Damien Doligez) + +- #10097: Lazy.map, Lazy.map_val: ('a -> 'b) -> 'a Lazy.t -> 'b Lazy.t + (map f x) is always (lazy (f (force x))), whereas (map_val f x) + applies f directly if x is already forced. + (Gabriel Scherer, review by Nicolás Ojeda Bär, Alain Frisch, Xavier Leroy, + Daniel Bünzli and Stephen Dolan) + +- #10242: Added convenience pretty printer for Either.t in the Format module. + (Oghenevwogaga Ebresafe, review by Nicolás Ojeda Bär, + Gabriel Scherer and Xavier Van de Woestyne) + +- #10352: Seq.(concat : 'a t t -> 'a t) + Seq.concat_map as an alias to Seq.flat_map, + (Gabriel Scherer, review by Ulugbek Abdullaev and Daniel Bünzli + and Nicolás Ojeda Bär and Florian Angeletti) + +- #882: Add fold_left, fold_right, exists and for_all to String/Bytes + (Yotam Barnoy, review by Alain Frisch and Jeremy Yallop) + +- #4070, #10398: small optimization of Stdlib.{frexp,modf}. + (Markus Mottl, Nicolás Ojeda Bär, review by Gabriel Scherer) + +- #10389, #10391, #10392: Add {Int,Int32,Int64,Nativeint}.{min,max}. + (Nicolás Ojeda Bär and Alain Frisch, review by Xavier Leroy) + +- #10430: Add Format.print_bytes and Format.pp_print_bytes. + (Gabriel Radanne, review by Gabriel Scherer and David Allsopp) + +### Other libraries: + +* #10084: Unix.open_process_args* functions now look up the program in the PATH. + This was already the case under Windows, but this is now also done under + Unix. Note that previously the program was interpreted relative to the current + directory. + (Nicolás Ojeda Bär, review by Gabriel Scherer and Xavier Leroy) + +- #10047: Add `Unix.realpath` + (Daniel Bünzli, review by David Allsopp, Josh Berdine and Gabriel Scherer) + +- #10184: Remove expensive debug assertion from dynlink. + (Leo White, review by David Allsopp and Xavier Leroy) + +- #10185: Consider that IPv6 is always enabled on Windows. + (Antonin Décimo, review by David Allsopp and Xavier Leroy) + +- #10306: Map WSA error code to Unix errno for sockopt and getsockname + functions (Antonin Décimo, review by David Allsopp) + +- #10309: Properly return EBADF on error in Unix.descr_of_{in,out}_channel on + Win32 and map Windows error correctly in Unix.truncate and Unix.ftruncate on + Win32. + (David Allsopp, review by Nicolás Ojeda Bär) + +### Tools: + +- #10139: Adds a -nonavbar option to ocamldoc, to remove confusing + 'Up', 'Previous' and 'Next' links + (John Whitington, review by David Allsopp) + +- #8645, #10363: ocamldoc: escape `<`, `>`, and `&` in html backend. + (Florian Angeletti, report by Wim Lewis, review by Gabriel Scherer) + +### Manual and documentation: + +- #9525, #10402: document that ocamldoc only creates paragraphs + at the toplevel of documentation comments + (Florian Angeletti, report by Hendrik Tews, review by Gabriel Scherer) + +- #10206: Split labels and polymorphic variants tutorials in two. + Moves the GADTs tutorial from the Language Extensions chapter + to the tutorials. + (John Whitington, review by Florian Angeletti and Xavier Leroy) + +- #9786, #10181: improved documentation of Unix.{in,out}_channel_of_descr + with respect to closing. + (Xavier Leroy, report by Jacques-Henri Jourdan, review by Guillaume + Munch-Maccagnoni, Gabriel Scherer, Jacques-Henri Jourdan) + +- #10139: Use the new -nonavbar option to improve navigation within + the reference manual stdlib documentation. + (John Whitington, review by David Allsopp) + +- #1351: Document `-output-complete-obj` option in the manual. + (François Bobot, Nicolás Ojeda Bär, review by Daniel Bünzli and Damien + Doligez) + +- #9632: Document incremental build solutions with opam + (Vincent Laviron, review by Daniel Bünzli and Gabriel Scherer) + +- #10497: Styling changes in the post-processed HTML manual (webman) + (Wiktor Kuchta, review by Florian Angeletti) + +- #10605: manual, name few css classes to ease styling and maintainability. + (Florian Angeletti, review by Wiktor Kuchta and Gabriel Scherer) + +### Compiler user-interface and warnings: + +- #1737, #2092, #7852, #7859, #10405, #10417: Update locations during + destructive substitutions + (Thomas Refis, review by Gabriel Radanne, report by Hugo Heuzard) + +- #2245: Improve error message for link order error in bytecode + (Pierre Chambart, review by Jérémie Dimino and Gabriel Scherer) + +- #8732, improved error messages for invalid private row type definitions. + For instance, [ type t = private [< `A > `A ] ] . + (Florian Angeletti, review by Jacques Garrigue, Thomas Refis, + and Gabriel Scherer) + +- #9407: optional warning for missing mli interface file + (Anukriti Kumar, review by Florian Angeletti) + +- #9960, #10619: extend ocamlc/ocamlopt's -o option to work when + compiling C files + (Sébastien Hinderer, reported by Daniel Bünzli, review by + Florian Angeletti and Gabriel Scherer) + +- #10095: minor simplifications to some syntax error messages. + (François Pottier, review by Gabriel Scherer and Frédéric Bour.) + +- #10196, #10197: better error message on empty character literals ''. + (Gabriel Scherer, review by David Allsopp and Florian Angeletti + and Daniel Bünzli, report by Robin Björklin) + +- #8877: Call the linker when ocamlopt is invoked with .o and .a files only. + (Greta Yorsh, review by Leo White) + +- #10207, #10312: deprecate consecutive letters in warning + specifications. + The form `-w aBcD` was equivalent to `-w -a+b-c+d`. + It is now deprecated to improve the coexistence with warning mnemonics. + However, using isolated single letter is not deprecated to allow the form + `-w "A-32..50-45"`. + (Florian Angeletti, review by Damien Doligez and Gabriel Scherer) + +- #10232: Warning for unused record fields. + (Leo White, review by Florian Angeletti) + +### Internal/compiler-libs changes: + +- #9243, simplify parser rules for array indexing operations + (Florian Angeletti, review by Damien Doligez and Gabriel Scherer) + +- #9650, #9651: keep refactoring the pattern-matching compiler + (Gabriel Scherer, review by Thomas Refis and Florian Angeletti) + +- #9827: Replace references with functions arguments in Simplif + (Anukriti Kumar, review by Vincent Laviron and David Allsop) + +- #10007: Driver.compile_common: when typing a .ml file, return the + compilation unit signature (inferred or from the .cmi) in addition + to the implementation and the coercion. + (Leandro Ostera, review by Gabriel Scherer and Thomas Refis) + +- #10045: Add libext variable to ocamltest and enable C# tests on on mingw + (David Allsopp, review by Gabriel Scherer) + +* #10061, #10078, #10187: remove library `ocamlopttoplevel`, remove modules + `Opttoploop`, `Opttopstart`, which are replaced by `Toploop` and `Topstart` in + library `ocamltoplevel`, made available in native code. + (Louis Gesbert, review by Jeremie Dimino, Mark Shinwell and Gabriel Radanne) + +- #10124: remove duplicated code from the native toplevel, split toplevel + implementation into the shared part (`Topcommon`, etc.) and specific ones + (`Topeval`, `Trace`, `Topmain`). + (Louis Gesbert, review by Jeremie Dimino and Gabriel Radanne) + +- #10086: add the commands `make list-parse-errors` and `make + generate-parse-errors` to generate a set of syntactically incorrect + sentences that covers all error states of the LR automaton. Add these + sentences to the test suite. This can be used to evaluate the quality of the + parser's syntax error messages and (in the future) to evaluate the impact of + changes in the parser. + (François Pottier, review by Gabriel Scherer and Xavier Leroy.) + +- #10090: Distinguished constructors for ref variables at lambda level + (Keryan Didier, review by Gabriel Scherer and Vincent Laviron) + +- #10113: add a `-timeout` option to ocamltest and use it in the test suite. + (Xavier Leroy and Gabriel Scherer, review by Sébastien Hinderer + and David Allsopp) + +* #10169, #10270, #10301, #10451: Use capitalized module names in the Standard + Library prefixing scheme to match Dune, e.g. Stdlib__String instead of + Stdlib__string. This is a breaking change only to code which attempted to use + the internal names before. The Standard Library generated by the Dune rules is + now equivalent to the main build (the Dune rules still do not generate a + distributable compiler). + (David Allsopp and Mark Shinwell, review by Gabriel Scherer) + +- #10327: Add a subdirectories variable and a copy action to ocamltest + (Sébastien Hinderer, review by David Allsopp) + +- #10358: Use a hash table for the load path. + (Leo White, review by Gabriel Scherer) + +- #8936: Per-function environment for Emit + (Greta Yorsh, review by Vincent Laviron and Florian Angeletti) + +- #10543: Fix Ast_mapper to apply the mapping function to the constants in + "interval" patterns `c1..c2`. + (Guillaume Petiot, review by Gabriel Scherer and Nicolás Ojeda Bär) + +### Internal typechecker changes: + +- #10174: Make Tsubst more robust by avoiding strange workarounds + (Takafumi Saikawa and Jacques Garrigue, review by Gabriel Scherer and + Florian Angeletti) + +- #10265: Move type_unboxed.unboxed into type_kind + (Stephen Dolan, review by Gabriel Scherer) + +- #10307: Refactor type_description in the typing env + (Nicolas Chataing, review by Takafumi Saikawa, Florian Angeletti and Thomas + Refis) + +- #10311: Separate the constraint-solving part of Typecore.type_pat into + specific solver functions. + (Jacques Garrigue and Takafumi Saikawa, review by Gabriel Scherer) + +- #10428: Make build_other_constrs work with names instead of tags. + (Nicolas Chataing, review by Florian Angeletti) + +### Build system: + +- #10332, #10333: Generate lambda/runtimedef.ml correctly in Swedish locale. + (the letter 'w' is not included in '[a-z]' in sv_SE.UTF-8) + (David Allsopp, report by Anders Jackson, review by Florian Angeletti and + Gabriel Scherer) + +- #10289, #10406: Do not print option documentation in usage messages. + (Pavlo Khrystenko, review by Gabriel Scherer, fix by Kate Deplaix) + +- #9191, #10091, #10182: take the LDFLAGS variable into account, except on + flexlink-using systems. + (Gabriel Scherer, review by Sébastien Hinderer and David Allsopp, + report by Ralph Seichter) + +- #10135: Overhaul the FlexDLL bootstrap process. It's now fully integrated + with the default build target and controlled by --with-flexdll which allows + externally downloaded sources for FlexDLL to be specified. A separate + non-shared version of the runtime is built, and shared artefacts are no longer + built twice. When bootstrapping, any flexlink in PATH is now ignored and the + Cygwin port also supports bootstrapping FlexDLL. flexlink.opt is automatically + built and installed as part of opt.opt/world.opt. + (David Allsopp, review by Sébastien Hinderer) + +- #10156: configure script: fix sockets feature detection. + (Lucas Pluvinage, review by David Allsopp and Damien Doligez) + +- #10176, #10632: By default, call the assembler through the C compiler driver + (Sébastien Hinderer, review by Gabriel Scherer, David Allsopp and Xavier + Leroy) + +- #10186: configure wasn't using library link flags when searching for + network functions on systems where they're not in libc. Fix IPv6 and + socklen_t detection on Windows. + (Antonin Décimo, review by David Allsopp and Sébastien Hinderer) + +- #10366: Make it possible to use the OCAMLRUN variable to specify + which runtime to use while building the compilers (Sébastien Hinderer, + review by David Allsopp) + +- #10451, #10635: Replace the use of iconv with a C utility to convert $(LIBDIR) + to a C string constant on Windows when building the runtime. Hardens the + generation of the constant on Unix for paths with backslashes, double-quotes + and newlines. + (David Allsopp, review by Florian Angeletti and Sébastien Hinderer) + +- #10471: Fix detection of arm32 architectures with musl in configure. + (Louis Gesbert, review by David Allsopp) + +### Bug fixes: + +- #6654, #9774, #10401: make `include` and with `constraints` handle correctly + the ghost components of signatures. For instance, in + + include struct class c = object end end type c + + the type `c` shadows the `class c` to avoid shadowing only the ghost type + c introduced by the class. + (Florian Angeletti, report by Eduardo Rafael, review by Gabriel Scherer) + +- #6985, #10385: remove all ghost row types from included modules + (Florian Angeletti, review by Gabriel Scherer) + +- #7453, #9828, #10416: fix #show for recursive types and modules + (Florian Angeletti, review by Gabriel Scherer) + +* #7469, #10408: Sys.time now returns processor time on Windows (previously + returned wall-clock time) + (David Allsopp, review by Nicolás Ojeda Bär) + +* #8857, #10220: Don't clobber GetLastError() in caml_leave_blocking_section + when the systhreads library is loaded. + (David Allsopp, report by Anton Bachin, review by Xavier Leroy) + +- #8575, #10362: Surprising interaction between polymorphic variants and + constructor disambiguation. + (Jacques Garrigue, report and review by Thomas Refis) + +- #8917, #8929, #9889, #10219: fix printing of nested recursive definitions + in presence of a name collision. + (Florian Angeletti, report by Thomas Refis, review by Gabriel Scherer) + +- #10005: Try expanding aliases in Ctype.nondep_type_rec + (Stephen Dolan, review by Gabriel Scherer, Leo White and Xavier Leroy) + +- #10072, #10085: Check that sizes and offsets in stack frame descriptors + do not overflow the 16-bit fields where they are stored. + (Xavier Leroy, report by Github user pveber, review by Gabriel Scherer) + +- #10087, #10138: In the toplevel REPL, don't use the cache + of included directories, so that files created or deleted while + the REPL is running are correctly handled. + (Xavier Leroy, report by Github user quakerquickoats, review by + Jeremie Dimino) + - #10294, #10295: fix an assert-failure in pattern-matching compilation (Gabriel Scherer, review by Thomas Refis and Luc Maranget, report by Nicolás Ojeda Bär) -- #10310: configure's --enable-spacetime option now causes an error rather than - being silently ignored. - (David Allsopp, review by Gabriel Scherer) +- #10147, #10148: Fix building runtime with GCC on macOS. + (David Allsopp, report by John Skaller) + +- #10166: Fix illegal permutation error reporting in module aliases. + (Matthew Ryan, review by Florian Angeletti) + +- #10189, #10190, #10347: Universal variables leaking through GADT equations + (Jacques Garrigue, report and review by Leo White) + +- #10205: Avoid overwriting closures while initialising recursive modules + (Stephen Dolan, review by Xavier Leroy, Hugo Heuzard and Vincent Laviron) + +- #10253, #10373: tweak error message for unknown variant constructors + or record fields in type-directed disambiguation + (Florian Angeletti, report by Hongbo Zhang, review by Gabriel Scherer) + +* #10277, #10383: Need to detect ambiguity recursively inside types to + guarantee principality (affects only principal mode) + (Jacques Garrigue, review by Thomas Refis, Leo White and Kate Deplaix) + +- #10283, #10284: Enforce right-to-left evaluation order for Lstaticraise + (Vincent Laviron, report by Github user Ngoguey42, review by Gabriel Scherer) + +- #10298, #10305: Incorrect propagation of type equalities in functor + application + (Jacques Garrigue, report and review by Didier Remy) + +- #10324, #10325: Prevent generation of Lsend(Cached, _) in bytecode + (Vincent Laviron, report by Yawar Amin and Nicolás Ojeda Bär, review by + Jacques Garrigue) + +- #10338, #10340: Translcore.push_defaults does not respect scoping + (Jacques Garrigue, report and review by Stephen Dolan) - #10351: Fix DLL loading with binutils 2.36+ on mingw-w64 (David Allsopp, review by Nicolás Ojeda Bär) +- #10339, #10354, #10387: Fix handling of exception-raising specific + operations during spilling and liveness analysis. + (This bug affects ARM and ARM64.) + In passing, refactor Proc.op_is_pure and Mach.operation_can_raise. + (Xavier Leroy, report by Richard Bornat, review by Stephen Dolan + and Mark Shinwell) + +- #10371: no longer generatd useless `.cds` file when using + `-output-complete-exe`. + (Nicolás Ojeda Bär, review by David Allsopp) + +- #10376: Link runtime libraries correctly on msvc64 in -output-complete-obj + (David Allsopp, review by Gabriel Scherer) + +- #10380: Correct handling of UTF-8 paths in configure on Windows + (David Allsopp, review by Sébastien Hinderer) + +- #10450, #10558: keep %apply and %revapply primitives working with abstract + types. This breach of backward compatibility was only present in the alpha + releases of OCaml 4.13.0 . + (Florian Angeletti, review by Thomas Refis and Leo White) + +- #10454: Check row_more in nondep_type_rec. + (Leo White, review by Thomas Refis) + +- #10468: Correctly pretty print local type substitution, e.g. type t := ..., + with -dsource + (Matt Else, review by Florian Angeletti) + +- #10461, #10498: `caml_send*` helper functions take derived pointers + as arguments. Those must be declared with type Addr instead of Val. + Moreover, poll point insertion must be disabled for `caml_send*`, + otherwise the derived pointer is live across a poll point. + (Vincent Laviron and Xavier Leroy, review by Xavier Leroy and Sadiq Jaffer) + +- #10511: Cygwin ports now correctly configure when flexdll is not available. + (David Allsopp, review by Florian Angeletti) + +- #10550, #10551: fix pretty-print of gadt-pattern-with-type-vars + (Chet Murthy, review by Gabriel Scherer) + +- #10584, #10856: Standard Library documentation build no longer fails if + optional libraries have been disabled. + (David Allsopp, report by Yuri Victorovich review by Florian Angeletti) + +- #10593: Fix untyping of patterns without named existential quantifiers. This + bug was only present in the beta version of OCaml 4.13.0. + (Ulysse Gérard, review by Florian Angeletti) + +- #10603, #10611: Fix if condition marked as inconstant in flambda + (Vincent Laviron and Pierre Chambart, report by Marcello Seri) + + +OCaml 4.12, maintenance version +------------------------------- + +### Bug fixes: + - #10442, #10446: Fix regression in the toplevel to #directory caused by corrections and improvements to the Load_path in #9611. #directory now adds the path to the start of the load path again (so files in the newly @@ -25,10 +656,6 @@ OCaml 4.12.1 (24 September 2021) (David Allsopp, report by Vasile Rotaru, review by Florian Angeletti and Nicolás Ojeda Bär) -- #10449: Fix major GC work accounting (the GC was running too fast). - (Damien Doligez, report by Stephen Dolan, review by Nicolás Ojeda Bär - and Sadiq Jaffer) - - #10478: Fix segfault under Windows due to a mistaken initialization of thread ID when a thread starts. (David Allsopp, Nicolás Ojeda Bär, review by Xavier Leroy) @@ -38,12 +665,6 @@ OCaml 4.12.1 (24 September 2021) reject the ocamlopt-generated code. (Xavier Leroy, report by Dave Aitken, review by Vincent Laviron) -### Manual and documentation - -- #10497: Styling changes in the post-processed HTML manual (webman) - (Wiktor Kuchta, review by Florian Angeletti) - - OCaml 4.12.0 (24 February 2021) ------------------------------- @@ -895,6 +1516,9 @@ OCaml 4.11.0 (19 August 2020) - #9392: Visit registers at most once in Coloring.iter_preferred. (Stephen Dolan, review by Pierre Chambart and Xavier Leroy) +- #9412: Keep Sys.opaque_identity in Cmm and Mach + (Stephen Dolan, review by Mark Shinwell and Gabriel Scherer) + - #9549, #9557: Make -flarge-toc the default for PowerPC and introduce -fsmall-toc to enable the previous behaviour. (David Allsopp, report by Nathaniel Wesley Filardo, review by Xavier Leroy) diff --git a/HACKING.adoc b/HACKING.adoc index a3212b3c..21ab534d 100644 --- a/HACKING.adoc +++ b/HACKING.adoc @@ -144,7 +144,7 @@ result by running make html_doc ---- -and then opening link:./ocamldoc/stdlib_html/index.html[] in a web browser. +and then opening link:./api_docgen/build/html/libref/index.html[] in a web browser. === Tools @@ -167,7 +167,6 @@ has excellent documentation. LICENSE:: license and copyright notice Makefile:: main Makefile Makefile.common:: common Makefile definitions - Makefile.tools:: used by manual/ and testsuite/ Makefiles README.adoc:: general information on the compiler distribution README.win32.adoc:: general information on the Windows ports of OCaml VERSION:: version string. Run `make configure` after changing. @@ -189,6 +188,7 @@ has excellent documentation. ocamltest/:: test driver otherlibs/:: several additional libraries parsing/:: syntax analysis -- see link:parsing/HACKING.adoc[] + release-info/:: documentation and tools to prepare releases runtime/:: bytecode interpreter and runtime systems stdlib/:: standard library testsuite/:: tests -- see link:testsuite/HACKING.adoc[] @@ -224,8 +224,8 @@ If you are working on a development version of the compiler, you can create an opam switch from it by running the following from the development repository: ----- --opam switch create . --empty --opam install . +opam switch create . --empty +opam install . ----- If you want to test someone else's development version from a public @@ -238,6 +238,142 @@ opam switch create my-switch-name --empty opam pin add ocaml-variants.$VERSION+branch git+https://$REPO#branch ---- +==== Incremental builds with `opam` + +This section documents some tips to speed up your workflow when you need to +alternate between testing your branch and patching the compiler. +We'll assume that you're currently in a clone of the compiler's source code. + +===== Initial setup + +For the rest of the section to work, you'll need your compiler to be +configured in the same way as `opam` would have configured it. The simplest +way is to run the normal commands for the switch initialization, with the extra +`--inplace-build` flag: + +----- +opam switch create . --empty +opam install . --inplace-build +----- + +However, if you need specific configuration options, you can also configure it +manually, as long as you make sure that the configuration prefix is the one +where `opam` would install the compiler. +You will then need to install the compiler, either from the working directory +(that you must build yourself) or using the regular sandboxed builds. + +----- +# Example with regular opam build +opam switch create . --empty +opam install . +./configure --prefix=$(opam var prefix) # put extra configuration args here +----- + +----- +# Example with installation from the current directory, installing only the +# bytecode versions of the tools +opam switch create . --empty +./configure --prefix=$(opam var prefix) # put extra configuration args here +make world && make opt +opam install . --assume-built +----- + +===== Basic workflow + +We will assume that the workflow alternates between work on the compiler and +external (`opam`-related) commands. +As an example, debugging an issue in the compiler can be done by a first step +that triggers the issue (by installing a given `opam` package), then adding +some logging to the compiler, re-trigger the issue, and based on the logs either +add more logging, or try a patch, and so on. + +The part of this workflow that we're going to optimize is when we switch from +working on the compiler to using the compiler. The basic way to do this is to +run `opam install .` again, but this will recompile the compiler from scratch +and also trigger a recompilation of all the packages in the switch. + +===== Using `opam-custom-install` + +The `opam-custom-install` plugin allows you to install a package using a custom +command instead of the package-supplied one. It can be installed following +instructions https://gitlab.ocamlpro.com/louis/opam-custom-install[here]. + +In our case, we need to build the compiler, and when we've built everything +that we need then we run `opam custom-install ocaml-variants -- make install`. +This will make `opam` remove the previously installed version of the compiler +(if any), then install the new one in its stead. + +----- +# reinstall the compiler, and rebuild all opam packages +opam custom-install ocaml-variants -- make install +----- + +Since most `opam` packages depend on the compiler, this will trigger a +reinstallation of all the packages in the switch. +If you want to avoid that (for instance, your patch only adds some logging +so you expect the core libraries and all the already compiled packages to be +identical), you can use the additional `--no-recompilations` flag. +There are no checks that it's safe to do so, so if your patch ends up +changing even slightly one of the core libraries' files, you will likely +get inconsistent assumptions errors later. + +----- +# reinstall the compiler, leaving the opam packages untouched -- unsafe! +opam custom-install --no-recompilations ocaml-variants -- make install +----- + +Note aout the first installation: +When you start from an empty switch, and install a compiler (in our case, +tha `ocaml-variants` package provided by the compiler's `opam` file), then +a number of additional packages are installed to ensure that the switch +will work correctly. Mainly, the `ocaml` package needs to be installed, +and while it's done automatically when using regular `opam` commands, the +`custom-install` plugin will not force installation of dependencies. +Moreover, if you try to fix the problem by manually installing the `ocaml` +package, `opam` will try to recompile `ocaml-variants`, using the default +instructions. You can get around this by running +`opam reinstall --forget-pending` just after the `opam custom-install` command +and just before the `opam install ocaml command`. +Full example: + +----- +opam switch create . --empty +./configure --prefix=$(opam var prefix) --disable-ocamldoc --disable-ocamltest +make world && make opt +opam custom-install ocaml-variants -- make install +opam reinstall --forget-pending --yes +opam install ocaml +# You now have a working switch, in which you can start installing packages +----- + +One advantage of this plugin over a plain `make install` is that it +correctly tracks the files associated with the compiler, so if your +`make install` command only installs the bytecode versions of the tools, +then with `opam-custom-install` you will end up in a state where only the +bytecode tools are installed, whereas with a raw `make install` you will have +stale native binaries remaining in your switch. +Since it's significantly faster to build the bytecode version of the tools, +and many `opam` packages will pick the native version of the compilers if +present and the bytecode version otherwise, you can build your initial switch +with the native versions (to get quickly to a state where a bug appears), +then clean your working directory and start building bytecode tools only +for the actual debugging phase. + +===== Without `opam-custom-install` + +You can achieve some improvements using built-in `opam` commands. + +Using `opam install . --assume-built` will simply remove the +package for the compiler, then run the installation instructions +(`make install`) in the working directory, tracking the installed files +correctly. The main difference with the `opam-custom-install` version +is that there's no way to prevent this command from triggering a full +recompilation of your switch. + +You can also run `make install` manually, which will not trigger a +recompilation, but will not remove the previous version either and can +mess with `opam`'s tracking of installed files. + === Useful Makefile targets Besides the targets listed in link:INSTALL.adoc[] for build and @@ -361,33 +497,77 @@ most packages are incompatible with the in-progress development version. === Continuous integration -==== Github's CI: Travis and AppVeyor +[#check-typo] +==== check-typo + +The `tools/check-typo` script enforces various typographical rules in the +OCaml compiler codebase. + +Running `./tools/check-typo` from the repository root will check all +source files. This can be fairly slow (2 minutes for example). Use +`./tools/check-typo ` to run it on some file or directory +(recursively) only. + +Running `./tools/check-typo-since trunk` checks all files that changed +in the commits since `trunk` -- this work with any git reference. It +runs much faster than a full `./tools/check-typo`, typically instantly. -The script that is run on Travis continuous integration servers is -link:tools/ci/travis/travis-ci.sh[]; its configuration can be found as -a Travis configuration file in link:.travis.yml[]. +You can also setup a git commit-hook to automatically run `check-typo` +on the changes you commit, by copying the file +`tools/pre-commit-githook` to `.git/hooks/pre-commit`. If changes in a commit +alter the `configure` script, the hook also checks that committed `configure` +script is up-to-date. + +Some files need special rules to opt out of `check-typo` checks; this +is specified in the `.gitattributes` file at the root of the +repository, using `typo.foo` attributes. + +==== GitHub's Continuous Integration: GitHub Actions and AppVeyor + +The scripts that are run on GitHub Actions are described in +link:.github/workflows/build.yml[]. For example, if you want to reproduce the default build on your machine, you can use the configuration values and run command taken from -link:.travis.yml[]: +link:tools/ci/actions/runner.sh[]: ---- -CI_KIND=build XARCH=x64 bash -ex tools/ci/travis/travis-ci.sh +XARCH=x64 bash -ex tools/ci/actions/runner.sh configure ---- -The scripts support two other kinds of tests (values of the -`CI_KIND` variable) which both inspect the patch submitted as part of -a pull request. `tests` checks that the testsuite has been modified -(hopefully, improved) by the patch, and `changes` checks that the -link:Changes[] file has been modified (hopefully to add a new entry). - -These tests rely on the `$TRAVIS_COMMIT_RANGE` variable which you can +The link:.github/workflows/hygiene.yml[] script supports other kinds of +tests which inspect the patch submitted as part of a pull request. These +tests rely on ancillary data generated by GitHub Actions which you have to set explicitly to reproduce them locally. -The `changes` check can be disabled by including "(no change -entry needed)" in one of your commit messages -- but in general all -patches submitted should come with a Changes entry; see the guidelines -in link:CONTRIBUTING.md[]. +`Changes updated` checks that the link:Changes[] file has been modified +(hopefully to add a new entry). It can be disabled by including "_(no change +entry needed)_" in one of your commit messages -- but in general all patches +submitted should come with a Changes entry; see the guidelines in +link:CONTRIBUTING.md[]. + +The Windows ports take a long time to test - INRIA's precheck service is the +best to use when all 6 Windows ports need testing for a branch, but the +AppVeyor scripts also support the other ports. The matrix is controlled by +the following environment variables, which should be set in link:appveyor.yml[]: + +- `PORT` - this must be set on each job. Either `mingw`, `msvc` or `cygwin` + followed by `32` or `64`. +- `BOOTSTRAP_FLEXDLL` - must be set on each job. Either `true` or `false`. + At present, must be `false` for Cygwin builds. Controls whether flexlink + is bootstrapped as part of the test or installed from a binary archive. +- `FORCE_CYGWIN_UPGRADE`. Default: `0`. Set to `1` to force an upgrade of + Cygwin packages as part of the build. Normally a full upgrade is only + triggered if the packages installed require it. +- `BUILD_MODE`. Default: `world.opt`. Either `world.opt`, `steps`, or `C`. + Controls whether the build uses the `world.opt` target or the classic + `world`, `opt`, `opt.opt` targets. The `C` build is a fast test used to + build just enough of the tree to cover the C sources (it's used to test + old MSVC compilers). +- `SDK`. Defaults to Visual Studio 2015. Specifies the exact command to run + to set-up the Microsoft build environment. +- `CYGWIN_DIST`. Default: `64`. Either `64` or `32`, selects 32-bit or 64-bit + Cygwin as the build environment. ==== INRIA's Continuous Integration (CI) diff --git a/INSTALL.adoc b/INSTALL.adoc index 0ad38fc6..42d9f59d 100644 --- a/INSTALL.adoc +++ b/INSTALL.adoc @@ -33,7 +33,7 @@ The `configure` script accepts options that can be discovered by running: ./configure --help + -Some options or variables like (LDFLAGS) may not be taken into account +Some options or variables like LDLIBS may not be taken into account by the OCaml build system at the moment. Please report an issue if you discover such a variable or option and this causes troubles to you. + @@ -45,9 +45,7 @@ Examples: * On a Linux x86-64 host, to build a 32-bit version of OCaml: - ./configure --build=x86_64-pc-linux-gnu --host=i386-linux \ - CC='gcc -m32' AS='as --32' ASPP='gcc -m32 -c' \ - PARTIALLD='ld -r -melf_i386' + ./configure --build=x86_64-pc-linux-gnu --host=i686-linux-gnu * For AIX 7.x with the IBM compiler `xlc`: @@ -166,3 +164,12 @@ and sanity checks that could help you pinpoint the problem. * On HP 9000/700 machines under HP/UX 9, some versions of `cc` are unable to compile correctly the runtime system (wrong code is generated for `(x - y)` where `x` is a pointer and `y` an integer). Fix: use `gcc`. + +* In the unlikely case that a platform does not offer all C99 float operations + that the runtime needs, a configuration error will result. Users + can work around this problem by calling `configure` with the flag + `--enable-imprecise-c99-float-ops`. This will enable simple but potentially + imprecise implementations of C99 float operations. Users with exacting + requirements for mathematical accuracy, numerical precision, and proper + handling of mathematical corner cases and error conditions may need to + consider running their code on a platform with better C99 support. diff --git a/Makefile b/Makefile index 41d8e263..8d8f1b41 100644 --- a/Makefile +++ b/Makefile @@ -16,6 +16,10 @@ # The main Makefile ROOTDIR = . +# NOTE: it is important that OCAMLLEX is defined *before* Makefile.common +# gets included, so that its definition here takes precedence +# over the one there. +OCAMLLEX ?= $(BOOT_OCAMLLEX) include Makefile.common .PHONY: defaultentry @@ -34,16 +38,17 @@ endif include stdlib/StdlibModules CAMLC=$(BOOT_OCAMLC) -g -nostdlib -I boot -use-prims runtime/primitives -CAMLOPT=$(CAMLRUN) ./ocamlopt$(EXE) -g -nostdlib -I stdlib -I otherlibs/dynlink +CAMLOPT=$(OCAMLRUN) ./ocamlopt$(EXE) -g -nostdlib -I stdlib -I otherlibs/dynlink ARCHES=amd64 i386 arm arm64 power s390x riscv INCLUDES=-I utils -I parsing -I typing -I bytecomp -I file_formats \ -I lambda -I middle_end -I middle_end/closure \ -I middle_end/flambda -I middle_end/flambda/base_types \ - -I asmcomp -I asmcomp/debug \ + -I asmcomp \ -I driver -I toplevel -COMPFLAGS=-strict-sequence -principal -absname -w +a-4-9-40-41-42-44-45-48-66 \ - -warn-error A \ +COMPFLAGS=-strict-sequence -principal -absname \ + -w +a-4-9-40-41-42-44-45-48-66-70 \ + -warn-error +a \ -bin-annot -safe-string -strict-formats $(INCLUDES) LINKFLAGS= @@ -53,8 +58,7 @@ else OCAML_NATDYNLINKOPTS = -ccopt "$(NATDYNLINKOPTS)" endif -CAMLLEX=$(CAMLRUN) boot/ocamllex -CAMLDEP=$(CAMLRUN) boot/ocamlc -depend +CAMLDEP=$(OCAMLRUN) boot/ocamlc -depend DEPFLAGS=-slash DEPINCLUDES=$(INCLUDES) @@ -67,8 +71,10 @@ OPTSTART=driver/optmain.cmo TOPLEVELSTART=toplevel/topstart.cmo -OPTTOPLEVELSTART=toplevel/opttopstart.cmo +TOPLEVELINIT=toplevel/toploop.cmo +# This list is passed to expunge, which accepts both uncapitalized and +# capitalized module names. PERVASIVES=$(STDLIB_MODULES) outcometree topdirs toploop LIBFILES=stdlib.cma std_exit.cmo *.cmi camlheader @@ -76,29 +82,20 @@ LIBFILES=stdlib.cma std_exit.cmo *.cmi camlheader COMPLIBDIR=$(LIBDIR)/compiler-libs TOPINCLUDES=$(addprefix -I otherlibs/,$(filter-out %threads,$(OTHERLIBRARIES))) -RUNTOP=./runtime/ocamlrun$(EXE) ./ocaml$(EXE) \ - -nostdlib -I stdlib -I toplevel \ - -noinit $(TOPFLAGS) $(TOPINCLUDES) -NATRUNTOP=./ocamlnat$(EXE) \ - -nostdlib -I stdlib -I toplevel \ - -noinit $(TOPFLAGS) $(TOPINCLUDES) ifeq "$(UNIX_OR_WIN32)" "unix" EXTRAPATH= else EXTRAPATH = PATH="otherlibs/win32unix:$(PATH)" endif -BOOT_FLEXLINK_CMD= -ifeq "$(UNIX_OR_WIN32)" "win32" -FLEXDLL_SUBMODULE_PRESENT := $(wildcard flexdll/Makefile) -ifeq "$(FLEXDLL_SUBMODULE_PRESENT)" "" +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" + COLDSTART_DEPS = BOOT_FLEXLINK_CMD = else + COLDSTART_DEPS = boot/ocamlruns$(EXE) BOOT_FLEXLINK_CMD = \ - FLEXLINK_CMD="../boot/ocamlrun$(EXE) ../flexdll/flexlink.exe" -endif -else + FLEXLINK_CMD="../boot/ocamlruns$(EXE) ../boot/flexlink.byte$(EXE)" endif expunge := expunge$(EXE) @@ -135,13 +132,51 @@ programs := expunge ocaml ocamlc ocamlc.opt ocamlnat ocamlopt ocamlopt.opt $(foreach program, $(programs), $(eval $(call PROGRAM_SYNONYM,$(program)))) +USE_RUNTIME_PRIMS = -use-prims ../runtime/primitives +USE_STDLIB = -nostdlib -I ../stdlib + +FLEXDLL_OBJECTS = \ + flexdll_$(FLEXDLL_CHAIN).$(O) flexdll_initer_$(FLEXDLL_CHAIN).$(O) +FLEXLINK_BUILD_ENV = \ + MSVC_DETECT=0 OCAML_CONFIG_FILE=../Makefile.config \ + CHAINS=$(FLEXDLL_CHAIN) ROOTDIR=.. + +boot/ocamlruns$(EXE): + $(MAKE) -C runtime ocamlruns$(EXE) + cp runtime/ocamlruns$(EXE) boot/ocamlruns$(EXE) + # Start up the system from the distribution compiler +# The process depends on whether FlexDLL is also being bootstrapped. +# Normal procedure: +# - Build the runtime +# - Build the standard library using runtime/ocamlrun +# FlexDLL procedure: +# - Build ocamlruns +# - Build the standard library using boot/ocamlruns +# - Build flexlink and FlexDLL support objects +# - Build the runtime +# runtime/ocamlrun is then installed to boot/ocamlrun and the stdlib artefacts +# are copied to boot/ .PHONY: coldstart -coldstart: +coldstart: $(COLDSTART_DEPS) +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" + $(MAKE) -C runtime all + $(MAKE) -C stdlib \ + OCAMLRUN='$$(ROOTDIR)/runtime/ocamlrun$(EXE)' \ + CAMLC='$$(BOOT_OCAMLC) $(USE_RUNTIME_PRIMS)' all +else + $(MAKE) -C stdlib OCAMLRUN='$$(ROOTDIR)/boot/ocamlruns$(EXE)' \ + CAMLC='$$(BOOT_OCAMLC)' all + $(MAKE) -C $(FLEXDLL_SOURCES) $(FLEXLINK_BUILD_ENV) \ + OCAMLRUN='$$(ROOTDIR)/boot/ocamlruns$(EXE)' NATDYNLINK=false \ + OCAMLOPT='$(value BOOT_OCAMLC) $(USE_RUNTIME_PRIMS) $(USE_STDLIB)' \ + flexlink.exe support + mv $(FLEXDLL_SOURCES)/flexlink.exe boot/flexlink.byte$(EXE) + cp $(addprefix $(FLEXDLL_SOURCES)/, $(FLEXDLL_OBJECTS)) boot/ $(MAKE) -C runtime $(BOOT_FLEXLINK_CMD) all +endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) - $(MAKE) -C stdlib $(BOOT_FLEXLINK_CMD) \ - CAMLC='$$(BOOT_OCAMLC) -use-prims ../runtime/primitives' all + cd boot; rm -f $(LIBFILES) cd stdlib; cp $(LIBFILES) ../boot cd boot; $(LN) ../runtime/libcamlrun.$(A) . @@ -158,7 +193,7 @@ core: coldstart # Check if fixpoint reached -CMPBYT := $(CAMLRUN) tools/cmpbyt$(EXE) +CMPBYT := $(OCAMLRUN) tools/cmpbyt$(EXE) .PHONY: compare compare: @@ -188,7 +223,7 @@ promote-cross: promote-common # Promote the newly compiled system to the rank of bootstrap compiler # (Runs on the new runtime, produces code for the new runtime) .PHONY: promote -promote: PROMOTE = $(CAMLRUN) tools/stripdebug +promote: PROMOTE = $(OCAMLRUN) tools/stripdebug promote: promote-common cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) @@ -209,10 +244,12 @@ opt: checknative .PHONY: opt.opt opt.opt: checknative $(MAKE) checkstack - $(MAKE) runtime - $(MAKE) core + $(MAKE) coreall $(MAKE) ocaml $(MAKE) opt-core +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" + $(MAKE) flexlink.opt$(EXE) +endif $(MAKE) ocamlc.opt $(MAKE) otherlibraries $(WITH_DEBUGGER) $(WITH_OCAMLDOC) \ $(WITH_OCAMLTEST) @@ -237,7 +274,7 @@ coreboot: # Rebuild the library (using runtime/ocamlrun ./ocamlc) $(MAKE) library-cross # Promote the new compiler and the new runtime - $(MAKE) CAMLRUN=runtime/ocamlrun$(EXE) promote + $(MAKE) OCAMLRUN=runtime/ocamlrun$(EXE) promote # Rebuild the core system $(MAKE) partialclean $(MAKE) core @@ -278,11 +315,15 @@ world.opt: checknative # Different git mechanism displayed depending on whether this source tree came # from a git clone or a source tarball. -flexdll/Makefile: - @echo In order to bootstrap FlexDLL, you need to place the sources in - @echo flexdll. +.PHONY: flexdll flexlink flexlink.opt + +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" +flexdll flexlink flexlink.opt: + @echo It is no longer necessary to bootstrap FlexDLL with a separate + @echo make invocation. Simply place the sources for FlexDLL in a + @echo sub-directory. @echo This can either be done by downloading a source tarball from - @echo \ http://alain.frisch.fr/flexdll.html + @echo \ https://github.com/alainfrisch/flexdll/releases @if [ -d .git ]; then \ echo or by checking out the flexdll submodule with; \ echo \ git submodule update --init; \ @@ -290,60 +331,42 @@ flexdll/Makefile: echo or by cloning the git repository; \ echo \ git clone https://github.com/alainfrisch/flexdll.git; \ fi + @echo "Then pass --with-flexdll= to configure and build as normal." @false -.PHONY: flexdll -flexdll: flexdll/Makefile flexlink - $(MAKE) -C flexdll \ - OCAML_CONFIG_FILE=../Makefile.config \ - MSVC_DETECT=0 CHAINS=$(FLEXDLL_CHAIN) NATDYNLINK=false support +else -# Bootstrapping flexlink - leaves a bytecode image of flexlink.exe in flexdll/ -FLEXLINK_OCAMLOPT = \ - ../boot/ocamlrun$(EXE) ../boot/ocamlc \ - -use-prims ../runtime/primitives -nostdlib -I ../boot +.PHONY: flexdll +flexdll: flexdll/Makefile + @echo WARNING! make flexdll is no longer required + @echo This target will be removed in a future release. .PHONY: flexlink -flexlink: flexdll/Makefile - $(MAKE) -C runtime BOOTSTRAPPING_FLEXLINK=yes ocamlrun$(EXE) - cp runtime/ocamlrun$(EXE) boot/ocamlrun$(EXE) - $(MAKE) -C stdlib \ - COMPILER="../boot/ocamlc -use-prims ../runtime/primitives" \ - $(filter-out *.cmi,$(LIBFILES)) - cd stdlib && cp $(LIBFILES) ../boot/ - $(MAKE) -C flexdll MSVC_DETECT=0 OCAML_CONFIG_FILE=../Makefile.config \ - CHAINS=$(FLEXDLL_CHAIN) NATDYNLINK=false \ - OCAMLOPT="$(FLEXLINK_OCAMLOPT)" \ - flexlink.exe - $(MAKE) -C runtime clean - $(MAKE) partialclean +flexlink: + @echo Bootstrapping just flexlink.exe is no longer supported + @echo Bootstrapping FlexDLL is now enabled with + @echo ./configure --with-flexdll + @false -.PHONY: flexlink.opt -flexlink.opt: - cd flexdll && \ - mv flexlink.exe flexlink && \ - ($(MAKE) OCAML_FLEXLINK="../boot/ocamlrun$(EXE) ./flexlink" \ - MSVC_DETECT=0 OCAML_CONFIG_FILE=../Makefile.config \ - OCAMLOPT="../ocamlopt.opt$(EXE) -nostdlib -I ../stdlib" \ - flexlink.exe || \ - (mv flexlink flexlink.exe && false)) && \ - mv flexlink.exe flexlink.opt && \ - mv flexlink flexlink.exe - -INSTALL_COMPLIBDIR=$(DESTDIR)$(COMPLIBDIR) -INSTALL_FLEXDLLDIR=$(INSTALL_LIBDIR)/flexdll - -.PHONY: install-flexdll -install-flexdll: - $(INSTALL_PROG) flexdll/flexlink.exe "$(INSTALL_BINDIR)/flexlink$(EXE)" -ifneq "$(filter-out mingw,$(TOOLCHAIN))" "" - $(INSTALL_DATA) flexdll/default$(filter-out _i386,_$(ARCH)).manifest \ - "$(INSTALL_BINDIR)/" +ifeq "$(wildcard ocamlopt.opt$(EXE))" "" + FLEXLINK_OCAMLOPT=../runtime/ocamlrun$(EXE) ../ocamlopt$(EXE) +else + FLEXLINK_OCAMLOPT=../ocamlopt.opt$(EXE) endif - if test -n "$(wildcard flexdll/flexdll_*.$(O))" ; then \ - $(MKDIR) "$(INSTALL_FLEXDLLDIR)" ; \ - $(INSTALL_DATA) flexdll/flexdll_*.$(O) "$(INSTALL_FLEXDLLDIR)" ; \ - fi + +flexlink.opt$(EXE): + $(MAKE) -C $(FLEXDLL_SOURCES) $(FLEXLINK_BUILD_ENV) \ + OCAML_FLEXLINK='$(value OCAMLRUN) $$(ROOTDIR)/boot/flexlink.byte$(EXE)' \ + OCAMLOPT="$(FLEXLINK_OCAMLOPT) -nostdlib -I ../stdlib" flexlink.exe + mv $(FLEXDLL_SOURCES)/flexlink.exe $@ + +partialclean:: + rm -f flexlink.opt$(EXE) +endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" + +INSTALL_COMPLIBDIR = $(DESTDIR)$(COMPLIBDIR) +INSTALL_FLEXDLLDIR = $(INSTALL_LIBDIR)/flexdll +FLEXDLL_MANIFEST = default$(filter-out _i386,_$(ARCH)).manifest # Installation .PHONY: install @@ -373,6 +396,9 @@ endif driver/*.cmi \ toplevel/*.cmi \ "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + toplevel/byte/*.cmi \ + "$(INSTALL_COMPLIBDIR)" ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" $(INSTALL_DATA) \ utils/*.cmt utils/*.cmti utils/*.mli \ @@ -384,6 +410,9 @@ ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" driver/*.cmt driver/*.cmti driver/*.mli \ toplevel/*.cmt toplevel/*.cmti toplevel/*.mli \ "$(INSTALL_COMPLIBDIR)" + $(INSTALL_DATA) \ + toplevel/byte/*.cmt \ + "$(INSTALL_COMPLIBDIR)" endif $(INSTALL_DATA) \ compilerlibs/*.cma \ @@ -397,8 +426,8 @@ endif "$(INSTALL_LIBDIR)" ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" $(INSTALL_DATA) \ - toplevel/topdirs.cmt toplevel/topdirs.cmti \ - toplevel/topdirs.mli \ + toplevel/topdirs.cmt \ + toplevel/topdirs.cmti toplevel/topdirs.mli \ "$(INSTALL_LIBDIR)" endif $(MAKE) -C tools install @@ -411,21 +440,34 @@ endif done ifneq "$(WITH_OCAMLDOC)" "" $(MAKE) -C ocamldoc install +endif +ifeq "$(WITH_OCAMLDOC)-$(STDLIB_MANPAGES)" "ocamldoc-true" + $(MAKE) -C api_docgen install endif if test -n "$(WITH_DEBUGGER)"; then \ $(MAKE) -C debugger install; \ fi -ifeq "$(UNIX_OR_WIN32)" "win32" - if test -n "$(FLEXDLL_SUBMODULE_PRESENT)"; then \ - $(MAKE) install-flexdll; \ - fi +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" +ifeq "$(TOOLCHAIN)" "msvc" + $(INSTALL_DATA) $(FLEXDLL_SOURCES)/$(FLEXDLL_MANIFEST) \ + "$(INSTALL_BINDIR)/" endif +ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" + $(INSTALL_PROG) \ + boot/flexlink.byte$(EXE) "$(INSTALL_BINDIR)/flexlink.byte$(EXE)" +endif # ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" + $(MKDIR) "$(INSTALL_FLEXDLLDIR)" + $(INSTALL_DATA) $(addprefix stdlib/flexdll/, $(FLEXDLL_OBJECTS)) \ + "$(INSTALL_FLEXDLLDIR)" +endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" $(INSTALL_DATA) Makefile.config "$(INSTALL_LIBDIR)" ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" if test -f ocamlopt$(EXE); then $(MAKE) installopt; else \ cd "$(INSTALL_BINDIR)"; \ $(LN) ocamlc.byte$(EXE) ocamlc$(EXE); \ $(LN) ocamllex.byte$(EXE) ocamllex$(EXE); \ + (test -f flexlink.byte$(EXE) && \ + $(LN) flexlink.byte$(EXE) flexlink$(EXE)) || true; \ fi else if test -f ocamlopt$(EXE); then $(MAKE) installopt; fi @@ -454,9 +496,6 @@ endif $(INSTALL_DATA) \ asmcomp/*.cmi \ "$(INSTALL_COMPLIBDIR)" - $(INSTALL_DATA) \ - asmcomp/debug/*.cmi \ - "$(INSTALL_COMPLIBDIR)" ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" $(INSTALL_DATA) \ middle_end/*.cmt middle_end/*.cmti \ @@ -479,10 +518,6 @@ ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" asmcomp/*.cmt asmcomp/*.cmti \ asmcomp/*.mli \ "$(INSTALL_COMPLIBDIR)" - $(INSTALL_DATA) \ - asmcomp/debug/*.cmt asmcomp/debug/*.cmti \ - asmcomp/debug/*.mli \ - "$(INSTALL_COMPLIBDIR)" endif $(INSTALL_DATA) \ $(OPTSTART) \ @@ -499,15 +534,13 @@ ifeq "$(INSTALL_BYTECODE_PROGRAMS)" "true" $(LN) ocamlc.byte$(EXE) ocamlc$(EXE); \ $(LN) ocamlopt.byte$(EXE) ocamlopt$(EXE); \ $(LN) ocamllex.byte$(EXE) ocamllex$(EXE); \ + (test -f flexlink.byte$(EXE) && \ + $(LN) flexlink.byte$(EXE) flexlink$(EXE)) || true; \ fi else if test -f ocamlopt.opt$(EXE); then $(MAKE) installoptopt; fi endif $(MAKE) -C tools installopt - if test -f ocamlopt.opt$(EXE) -a -f flexdll/flexlink.opt ; then \ - $(INSTALL_PROG) \ - flexdll/flexlink.opt "$(INSTALL_BINDIR)/flexlink$(EXE)" ; \ - fi .PHONY: installoptopt installoptopt: @@ -518,6 +551,11 @@ installoptopt: $(LN) ocamlc.opt$(EXE) ocamlc$(EXE); \ $(LN) ocamlopt.opt$(EXE) ocamlopt$(EXE); \ $(LN) ocamllex.opt$(EXE) ocamllex$(EXE) +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" + $(INSTALL_PROG) flexlink.opt$(EXE) "$(INSTALL_BINDIR)" + cd "$(INSTALL_BINDIR)"; \ + $(LN) flexlink.opt$(EXE) flexlink$(EXE) +endif $(INSTALL_DATA) \ utils/*.cmx parsing/*.cmx typing/*.cmx bytecomp/*.cmx \ file_formats/*.cmx \ @@ -526,7 +564,6 @@ installoptopt: middle_end/closure/*.cmx \ middle_end/flambda/*.cmx \ middle_end/flambda/base_types/*.cmx \ - asmcomp/debug/*.cmx \ "$(INSTALL_COMPLIBDIR)" $(INSTALL_DATA) \ compilerlibs/*.cmxa compilerlibs/*.$(A) \ @@ -538,10 +575,9 @@ installoptopt: if test -f ocamlnat$(EXE) ; then \ $(INSTALL_PROG) ocamlnat$(EXE) "$(INSTALL_BINDIR)"; \ $(INSTALL_DATA) \ - toplevel/opttopdirs.cmi \ - "$(INSTALL_LIBDIR)"; \ - $(INSTALL_DATA) \ - $(OPTTOPLEVELSTART:.cmo=.cmx) $(OPTTOPLEVELSTART:.cmo=.$(O)) \ + toplevel/*.cmx \ + toplevel/native/*.cmx \ + $(TOPLEVELSTART:.cmo=.$(O)) \ "$(INSTALL_COMPLIBDIR)"; \ fi cd "$(INSTALL_COMPLIBDIR)" && \ @@ -555,7 +591,8 @@ ifeq "$(INSTALL_SOURCE_ARTIFACTS)" "true" utils/*.ml parsing/*.ml typing/*.ml bytecomp/*.ml driver/*.ml \ file_formats/*.ml \ lambda/*.ml \ - toplevel/*.ml middle_end/*.ml middle_end/closure/*.ml \ + toplevel/*.ml toplevel/byte/*.ml \ + middle_end/*.ml middle_end/closure/*.ml \ middle_end/flambda/*.ml middle_end/flambda/base_types/*.ml \ asmcomp/*.ml \ asmcmp/debug/*.ml \ @@ -611,38 +648,43 @@ ocaml_dependencies := \ .INTERMEDIATE: ocaml.tmp ocaml.tmp: $(ocaml_dependencies) - $(CAMLC) $(LINKFLAGS) -linkall -o $@ $^ + $(CAMLC) $(LINKFLAGS) -I toplevel/byte -linkall -o $@ $^ ocaml$(EXE): $(expunge) ocaml.tmp - - $(CAMLRUN) $^ $@ $(PERVASIVES) + - $(OCAMLRUN) $^ $@ $(PERVASIVES) partialclean:: rm -f ocaml$(EXE) +# Use TOPFLAGS to pass additional flags to the bytecode or native toplevel +# when running make runtop or make natruntop +TOPFLAGS ?= +OC_TOPFLAGS = -nostdlib -I stdlib -I toplevel -noinit $(TOPINCLUDES) $(TOPFLAGS) + +# Note: Beware that, since this rule begins with a coldstart, both +# boot/ocamlrun and runtime/ocamlrun will be the same when the toplevel +# is run. .PHONY: runtop runtop: $(MAKE) coldstart $(MAKE) ocamlc $(MAKE) otherlibraries $(MAKE) ocaml - @$(EXTRAPATH) $(RLWRAP) $(RUNTOP) + @$(EXTRAPATH) $(RLWRAP) $(OCAMLRUN) ./ocaml$(EXE) $(OC_TOPFLAGS) .PHONY: natruntop natruntop: $(MAKE) core $(MAKE) opt $(MAKE) ocamlnat - @$(FLEXLINK_ENV) $(EXTRAPATH) $(RLWRAP) $(NATRUNTOP) + @$(FLEXLINK_ENV) $(EXTRAPATH) $(RLWRAP) ./ocamlnat$(EXE) $(OC_TOPFLAGS) # Native dynlink otherlibs/dynlink/dynlink.cmxa: otherlibs/dynlink/native/dynlink.ml $(MAKE) -C otherlibs/dynlink allopt -# The lexer - -parsing/lexer.ml: parsing/lexer.mll - $(CAMLLEX) $(OCAMLLEX_FLAGS) $< +# Cleanup the lexer partialclean:: rm -f parsing/lexer.ml @@ -709,7 +751,7 @@ cvt_emit := tools/cvt_emit$(EXE) asmcomp/emit.ml: asmcomp/$(ARCH)/emit.mlp $(cvt_emit) echo \# 1 \"$(ARCH)/emit.mlp\" > $@ - $(CAMLRUN) $(cvt_emit) < $< >> $@ \ + $(OCAMLRUN) $(cvt_emit) < $< >> $@ \ || { rm -f $@; exit 2; } partialclean:: @@ -731,9 +773,20 @@ partialclean:: # The runtime system for the bytecode compiler +$(SAK): + $(MAKE) -C runtime sak$(EXE) + .PHONY: runtime runtime: stdlib/libcamlrun.$(A) +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "true" +runtime: $(addprefix stdlib/flexdll/, $(FLEXDLL_OBJECTS)) +stdlib/flexdll/flexdll%.$(O): $(FLEXDLL_SOURCES)/flexdll%.$(O) | stdlib/flexdll + cp $< $@ +stdlib/flexdll: + $(MKDIR) $@ +endif + .PHONY: makeruntime makeruntime: $(MAKE) -C runtime $(BOOT_FLEXLINK_CMD) all @@ -778,7 +831,7 @@ library: ocamlc .PHONY: library-cross library-cross: $(MAKE) -C stdlib \ - $(BOOT_FLEXLINK_CMD) CAMLRUN=../runtime/ocamlrun$(EXE) all + $(BOOT_FLEXLINK_CMD) OCAMLRUN=../runtime/ocamlrun$(EXE) all .PHONY: libraryopt libraryopt: @@ -846,7 +899,7 @@ parsing/parser.mli: boot/menhir/parser.mli beforedepend:: parsing/camlinternalMenhirLib.ml \ parsing/camlinternalMenhirLib.mli \ - parsing/parser.ml parsing/parser.mli + parsing/parser.ml parsing/parser.mli partialclean:: partialclean-menhir @@ -875,16 +928,19 @@ partialclean:: .PHONY: html_doc html_doc: ocamldoc - $(MAKE) -C ocamldoc $@ - @echo "documentation is in ./ocamldoc/stdlib_html/" + $(MAKE) -C api_docgen html + @echo "documentation is in ./api_docgen/html/" .PHONY: manpages manpages: - $(MAKE) -C ocamldoc $@ + $(MAKE) -C api_docgen man partialclean:: $(MAKE) -C ocamldoc clean +partialclean:: + $(MAKE) -C api_docgen clean + # The extra libraries .PHONY: otherlibraries @@ -926,13 +982,12 @@ endif # Check that the stack limit is reasonable (Unix-only) .PHONY: checkstack ifeq "$(UNIX_OR_WIN32)" "unix" -checkstack := tools/checkstack -checkstack: $(checkstack)$(EXE) +checkstack: tools/checkstack$(EXE) $< -.INTERMEDIATE: $(checkstack)$(EXE) $(checkstack).$(O) -$(checkstack)$(EXE): $(checkstack).$(O) - $(MKEXE) $(OUTPUTEXE)$@ $< +.INTERMEDIATE: tools/checkstack$(EXE) tools/checkstack.$(O) +tools/checkstack$(EXE): tools/checkstack.$(O) + $(MAKE) -C tools $(BOOT_FLEXLINK_CMD) checkstack$(EXE) else checkstack: @ @@ -1004,21 +1059,33 @@ endif ocamlnat$(EXE): compilerlibs/ocamlcommon.cmxa compilerlibs/ocamloptcomp.cmxa \ compilerlibs/ocamlbytecomp.cmxa \ otherlibs/dynlink/dynlink.cmxa \ - compilerlibs/ocamlopttoplevel.cmxa \ - $(OPTTOPLEVELSTART:.cmo=.cmx) - $(CAMLOPT_CMD) $(LINKFLAGS) -linkall -o $@ $^ + compilerlibs/ocamltoplevel.cmxa \ + $(TOPLEVELSTART:.cmo=.cmx) + $(CAMLOPT_CMD) $(LINKFLAGS) -linkall -I toplevel/native -o $@ $^ + + +toplevel/topdirs.cmx: toplevel/topdirs.ml + $(CAMLOPT_CMD) $(COMPFLAGS) $(OPTCOMPFLAGS) -I toplevel/native -c $< + +$(TOPLEVELINIT:.cmo=.cmx): $(TOPLEVELINIT:.cmo=.ml) \ + toplevel/native/topeval.cmx + $(CAMLOPT_CMD) $(COMPFLAGS) $(OPTCOMPFLAGS) -I toplevel/native -c $< + +$(TOPLEVELSTART:.cmo=.cmx): $(TOPLEVELSTART:.cmo=.ml) \ + toplevel/native/topmain.cmx + $(CAMLOPT_CMD) $(COMPFLAGS) $(OPTCOMPFLAGS) -I toplevel/native -c $< partialclean:: rm -f ocamlnat ocamlnat.exe -toplevel/opttoploop.cmx: otherlibs/dynlink/dynlink.cmxa +toplevel/native/topeval.cmx: otherlibs/dynlink/dynlink.cmxa # The numeric opcodes make_opcodes := tools/make_opcodes$(EXE) bytecomp/opcodes.ml: runtime/caml/instruct.h $(make_opcodes) - runtime/ocamlrun$(EXE) $(make_opcodes) -opcodes < $< > $@ + $(NEW_OCAMLRUN) $(make_opcodes) -opcodes < $< > $@ bytecomp/opcodes.mli: bytecomp/opcodes.ml $(CAMLC) -i $< > $@ @@ -1038,22 +1105,20 @@ endif # Default rules -.SUFFIXES: .ml .mli .cmo .cmi .cmx - -.ml.cmo: - $(CAMLC) $(COMPFLAGS) -c $< +%.cmo: %.ml + $(CAMLC) $(COMPFLAGS) -c $< -I $(@D) -.mli.cmi: +%.cmi: %.mli $(CAMLC) $(COMPFLAGS) -c $< -.ml.cmx: - $(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -c $< +%.cmx: %.ml + $(CAMLOPT) $(COMPFLAGS) $(OPTCOMPFLAGS) -c $< -I $(@D) partialclean:: for d in utils parsing typing bytecomp asmcomp middle_end file_formats \ lambda middle_end/closure middle_end/flambda \ - middle_end/flambda/base_types asmcomp/debug \ - driver toplevel tools; do \ + middle_end/flambda/base_types \ + driver toplevel toplevel/byte toplevel/native tools; do \ rm -f $$d/*.cm[ioxt] $$d/*.cmti $$d/*.annot $$d/*.s $$d/*.asm \ $$d/*.o $$d/*.obj $$d/*.so $$d/*.dll; \ done @@ -1062,18 +1127,23 @@ partialclean:: depend: beforedepend (for d in utils parsing typing bytecomp asmcomp middle_end \ lambda file_formats middle_end/closure middle_end/flambda \ - middle_end/flambda/base_types asmcomp/debug \ - driver toplevel; \ - do $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) $$d/*.mli $$d/*.ml || exit; \ + middle_end/flambda/base_types \ + driver toplevel toplevel/byte toplevel/native; \ + do \ + $(CAMLDEP) $(DEPFLAGS) -I $$d $(DEPINCLUDES) $$d/*.mli $$d/*.ml \ + || exit; \ done) > .depend .PHONY: distclean distclean: clean rm -f boot/ocamlrun boot/ocamlrun.exe boot/camlheader \ - boot/*.cm* boot/libcamlrun.a boot/libcamlrun.lib boot/ocamlc.opt + boot/ocamlruns boot/ocamlruns.exe \ + boot/flexlink.byte boot/flexlink.byte.exe \ + boot/flexdll_*.o boot/flexdll_*.obj \ + boot/*.cm* boot/libcamlrun.a boot/libcamlrun.lib boot/ocamlc.opt rm -f Makefile.config Makefile.build_config rm -f runtime/caml/m.h runtime/caml/s.h - rm -rf autom4te.cache + rm -rf autom4te.cache flexdll-sources rm -f config.log config.status libtool rm -f tools/eventlog_metadata rm -f tools/*.bak @@ -1088,8 +1158,8 @@ config.status: @echo "- In file README.win32.adoc for Windows systems." @echo "On Unix systems, if you've just unpacked the distribution," @echo "something like" - @echo " ./configure" - @echo " make" - @echo " make install" + @echo " ./configure" + @echo " make" + @echo " make install" @echo "should work." @false diff --git a/Makefile.best_binaries b/Makefile.best_binaries index fb3402b2..4f05f698 100644 --- a/Makefile.best_binaries +++ b/Makefile.best_binaries @@ -40,7 +40,7 @@ choose_best = $(strip $(if \ $(and $(USE_BEST_BINARIES),$(wildcard $(ROOTDIR)/$1.opt$(EXE)),$(strip \ $(call check_not_stale,$1$(EXE),$1.opt$(EXE)))), \ $(ROOTDIR)/$1.opt$(EXE), \ - $(CAMLRUN) $(ROOTDIR)/$1$(EXE))) + $(OCAMLRUN) $(ROOTDIR)/$1$(EXE))) BEST_OCAMLC := $(call choose_best,ocamlc) BEST_OCAMLOPT := $(call choose_best,ocamlopt) @@ -50,7 +50,7 @@ BEST_OCAMLLEX := $(call choose_best,lex/ocamllex) # is not built yet, using the bootstrap compiler. # Unlike other tools, there is no risk of mixing incompatible -# bootrap-compiler and host-compiler object files, as ocamldep only +# bootstrap-compiler and host-compiler object files, as ocamldep only # produces text output. BEST_OCAMLDEP := $(strip $(if \ $(and $(USE_BEST_BINARIES),$(wildcard $(ROOTDIR)/ocamlc.opt$(EXE)),$(strip \ diff --git a/Makefile.build_config.in b/Makefile.build_config.in index 0dce5574..eb96306e 100644 --- a/Makefile.build_config.in +++ b/Makefile.build_config.in @@ -34,3 +34,12 @@ OC_DLL_LDFLAGS=@oc_dll_ldflags@ # The rlwrap command (for the *runtop targets) RLWRAP=@rlwrap@ + +# Which document generator: odoc or ocamldoc? +DOCUMENTATION_TOOL=@documentation_tool@ +DOCUMENTATION_TOOL_CMD=@documentation_tool_cmd@ + +# The location of the FlexDLL sources to use (usually provided as the flexdll +# Git submodule) +FLEXDLL_SOURCES=@flexdir@ +BOOTSTRAPPING_FLEXDLL=@bootstrapping_flexdll@ diff --git a/Makefile.common b/Makefile.common index f3e428a1..b3b418e5 100644 --- a/Makefile.common +++ b/Makefile.common @@ -23,29 +23,41 @@ DEPDIR=.dep D=d MKDIR=mkdir -p +# $(EMPTY) is defined in Makefile.config, but may not have been loaded +EMPTY := +# $(SPACE) contains a single space +SPACE := $(EMPTY) $(EMPTY) + DESTDIR ?= INSTALL_BINDIR := $(DESTDIR)$(BINDIR) INSTALL_LIBDIR := $(DESTDIR)$(LIBDIR) INSTALL_STUBLIBDIR := $(DESTDIR)$(STUBLIBDIR) INSTALL_MANDIR := $(DESTDIR)$(MANDIR) -ifeq "$(UNIX_OR_WIN32)" "win32" FLEXDLL_SUBMODULE_PRESENT := $(wildcard $(ROOTDIR)/flexdll/Makefile) -else -FLEXDLL_SUBMODULE_PRESENT = -endif -# Use boot/ocamlc.opt if available -CAMLRUN ?= $(ROOTDIR)/boot/ocamlrun$(EXE) -ifeq (0,$(shell \ +# Variables used to represent the OCaml runtime system +# Most of the time, boot/ocamlrun and runtime/ocamlrun are the same. +# However, under some circumstances it is important to be able to +# distinguish one from the other, hence these two variables. +# Boot/ocamlrun is the most frequently used in the build system, so +# we use OCAMLRUN to designate it and keep NEW_OCAMLRUN to refer +# to runtime/ocamlrun, because it's less frequently used. +OCAMLRUN ?= $(ROOTDIR)/boot/ocamlrun$(EXE) +NEW_OCAMLRUN ?= $(ROOTDIR)/runtime/ocamlrun$(EXE) + +TEST_BOOT_OCAMLC_OPT = $(shell \ test $(ROOTDIR)/boot/ocamlc.opt -nt $(ROOTDIR)/boot/ocamlc; \ - echo $$?)) + echo $$?) + +# Use boot/ocamlc.opt if available +ifeq "$(TEST_BOOT_OCAMLC_OPT)" "0" BOOT_OCAMLC = $(ROOTDIR)/boot/ocamlc.opt else - BOOT_OCAMLC = $(CAMLRUN) $(ROOTDIR)/boot/ocamlc + BOOT_OCAMLC = $(OCAMLRUN) $(ROOTDIR)/boot/ocamlc endif -ifeq "$(FLEXDLL_SUBMODULE_PRESENT)" "" +ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" FLEXLINK_ENV = CAMLOPT_CMD = $(CAMLOPT) OCAMLOPT_CMD = $(OCAMLOPT) @@ -53,21 +65,25 @@ ifeq "$(FLEXDLL_SUBMODULE_PRESENT)" "" ocamlc_cmd = $(ocamlc) ocamlopt_cmd = $(ocamlopt) else +ifeq "$(wildcard $(ROOTDIR)/flexlink.opt$(EXE))" "" FLEXLINK_ENV = \ - OCAML_FLEXLINK="$(ROOTDIR)/boot/ocamlrun $(ROOTDIR)/flexdll/flexlink.exe" + OCAML_FLEXLINK="$(ROOTDIR)/boot/ocamlrun$(EXE) \ + $(ROOTDIR)/boot/flexlink.byte$(EXE)" +else + FLEXLINK_ENV = \ + OCAML_FLEXLINK="$(ROOTDIR)/flexlink.opt$(EXE) -I $(ROOTDIR)/stdlib/flexdll" +endif # ifeq "$(wildcard $(ROOTDIR)/flexlink.opt$(EXE))" "" CAMLOPT_CMD = $(FLEXLINK_ENV) $(CAMLOPT) OCAMLOPT_CMD = $(FLEXLINK_ENV) $(OCAMLOPT) MKLIB_CMD = $(FLEXLINK_ENV) $(MKLIB) ocamlc_cmd = $(FLEXLINK_ENV) $(ocamlc) ocamlopt_cmd = $(FLEXLINK_ENV) $(ocamlopt) -endif +endif # ifeq "$(BOOTSTRAPPING_FLEXDLL)" "false" OPTCOMPFLAGS= ifeq "$(FUNCTION_SECTIONS)" "true" OPTCOMPFLAGS += -function-sections endif -# By default, request ocamllex to be quiet -OCAMLLEX_FLAGS ?= -q # Escape special characters in the argument string. # There are four characters that need escaping: @@ -120,3 +136,39 @@ ifneq ($(EXE),) $(1): $(1)$(EXE) endif endef # PROGRAM_SYNONYM + +# Lexer generation + +BOOT_OCAMLLEX ?= $(OCAMLRUN) $(ROOTDIR)/boot/ocamllex + +# Default value for OCAMLLEX +# In those directories where this needs to be overriden, the overriding +# should take place *before* Makefile.common is included. + +OCAMLLEX ?= $(BEST_OCAMLLEX) + +OCAMLLEXFLAGS ?= -q + +%.ml: %.mll + $(OCAMLLEX) $(OCAMLLEXFLAGS) $< + +# Parser generation + +OCAMLYACC ?= $(ROOTDIR)/yacc/ocamlyacc$(EXE) + +OCAMLYACCFLAGS ?= + +%.ml %.mli: %.mly + $(OCAMLYACC) $(OCAMLYACCFLAGS) $< + +SAK = $(ROOTDIR)/runtime/sak$(EXE) + +# stdlib/StdlibModules cannot be include'd unless $(SAK) has been built. These +# two rules add that dependency. They have to be pattern rules since +# Makefile.common is included before default targets. +$(ROOTDIR)/%/sak$(EXE): + $(MAKE) -C $(ROOTDIR)/$* sak$(EXE) + +ifneq "$(REQUIRES_CONFIGURATION)" "" +$(ROOTDIR)/%/StdlibModules: $(SAK) ; +endif diff --git a/Makefile.config.in b/Makefile.config.in index 652a1c5b..08ac80ff 100644 --- a/Makefile.config.in +++ b/Makefile.config.in @@ -76,6 +76,8 @@ AS_HAS_DEBUG_PREFIX_MAP=@as_has_debug_prefix_map@ # our own symbols): OC_LDFLAGS=@oc_ldflags@ +LDFLAGS?=@LDFLAGS@ + ### How to invoke the C preprocessor through the C compiler CPP=@CPP@ @@ -170,9 +172,8 @@ OTHERLIBRARIES=@otherlibraries@ ### Link-time options to ocamlc or ocamlopt for linking with POSIX threads # Needed for the "systhreads" package -PTHREAD_LINK=@pthread_link@ -PTHREAD_CAML_LINK=$(addprefix -cclib ,$(PTHREAD_LINK)) -PTHREAD_CFLAGS=@PTHREAD_CFLAGS@ +PTHREAD_LIBS=@PTHREAD_LIBS@ +PTHREAD_CAML_LIBS=$(addprefix -cclib ,$(PTHREAD_LIBS)) UNIX_OR_WIN32=@unix_or_win32@ UNIXLIB=@unixlib@ @@ -202,7 +203,7 @@ OCAMLOPT_CPPFLAGS=@ocamlc_cppflags@ NATIVECCLIBS=@nativecclibs@ SYSTHREAD_SUPPORT=@systhread_support@ PACKLD=@PACKLD@ -IFLEXDIR=@iflexdir@ +FLEXDLL_CHAIN=@flexdll_chain@ EXTRALIBS=@extralibs@ CCOMPTYPE=@ccomptype@ TOOLCHAIN=@toolchain@ @@ -218,7 +219,8 @@ MKMAINDLL=@mkmaindll@ MKEXEDEBUGFLAG=@mkexedebugflag@ RUNTIMED=@debug_runtime@ -RUNTIMEI=@instrumented_runtime@ +INSTRUMENTED_RUNTIME=@instrumented_runtime@ +INSTRUMENTED_RUNTIME_LIBS=@instrumented_runtime_libs@ WITH_DEBUGGER=@with_debugger@ WITH_CAMLTEX=@with_camltex@ WITH_OCAMLDOC=@ocamldoc@ @@ -232,6 +234,7 @@ TARGET=@target@ HOST=@host@ FLAMBDA=@flambda@ WITH_FLAMBDA_INVARIANTS=@flambda_invariants@ +WITH_CMM_INVARIANTS=@cmm_invariants@ FORCE_SAFE_STRING=@force_safe_string@ DEFAULT_SAFE_STRING=@default_safe_string@ WINDOWS_UNICODE=@windows_unicode@ @@ -248,10 +251,11 @@ ifeq "$(TOOLCHAIN)" "msvc" MERGEMANIFESTEXE=test ! -f $(1).manifest \ || mt -nologo -outputresource:$(1) -manifest $(1).manifest \ && rm -f $(1).manifest - MKEXE_BOOT=$(CC) $(OC_CFLAGS) $(CFLAGS) $(OUTPUTEXE)$(1) $(2) \ - /link /subsystem:console $(OC_LDFLAGS) && ($(MERGEMANIFESTEXE)) + MKEXE_USING_COMPILER=$(CC) $(OC_CFLAGS) $(CFLAGS) $(OUTPUTEXE)$(1) $(2) \ + /link /subsystem:console $(OC_LDFLAGS) $(LDFLAGS) && ($(MERGEMANIFESTEXE)) else - MKEXE_BOOT=$(CC) $(OC_CFLAGS) $(CFLAGS) $(OC_LDFLAGS) $(OUTPUTEXE)$(1) $(2) + MKEXE_USING_COMPILER=$(CC) $(OC_CFLAGS) $(CFLAGS) $(OC_LDFLAGS) $(LDFLAGS) \ + $(OUTPUTEXE)$(1) $(2) endif # ifeq "$(TOOLCHAIN)" "msvc" # The following variables were defined only in the Windows-specific makefiles. @@ -261,20 +265,34 @@ endif # ifeq "$(TOOLCHAIN)" "msvc" # in the future their definition may be moved to a more private part of # the compiler's build system ifeq "$(UNIX_OR_WIN32)" "win32" - OTOPDIR=$(WINTOPDIR) - CTOPDIR=$(WINTOPDIR) CYGPATH=cygpath -m DIFF=/usr/bin/diff -q --strip-trailing-cr FIND=/usr/bin/find SORT=/usr/bin/sort SET_LD_PATH=PATH="$(PATH):$(LD_PATH)" - FLEXLINK_CMD=flexlink - FLEXDLL_CHAIN=@flexdll_chain@ - # FLEXLINK_FLAGS must be safe to insert in an OCaml string - # (see ocamlmklibconfig.ml in tools/Makefile) - FLEXLINK_FLAGS=@flexlink_flags@ - FLEXLINK=$(FLEXLINK_CMD) $(FLEXLINK_FLAGS) else # ifeq "$(UNIX_OR_WIN32)" "win32" # On Unix, make sure FLEXLINK is defined but empty - FLEXLINK = + SORT=sort + CYGPATH=echo + SET_LD_PATH=CAML_LD_LIBRARY_PATH="$(LD_PATH)" endif # ifeq "$(UNIX_OR_WIN32)" "win32" + +FLEXLINK_FLAGS=@flexlink_flags@ +FLEXLINK_CMD=flexlink +FLEXLINK=$(FLEXLINK_CMD) $(FLEXLINK_FLAGS) + +# Deprecated variables + +## Variables renamed in OCaml 4.13 + +RUNTIMEI=$(INSTRUMENTED_RUNTIME) + +### pthread-related variables + +PTHREAD_LINK=$(PTHREAD_LIBS) +PTHREAD_CAML_LINK=$(PTHREAD_CAML_LIBS) + +### It is expected that the value of PTHREAD_LINK changes between OCaml +### 4.12 and 4.13. Indeed, for OCaml 4.12 most of the time the variable +### contained -lpthread. From 4.13 onward it will most of the time be +### empty since we have -pthread in CFLAGS which implies -lpthread. diff --git a/Makefile.config_if_required b/Makefile.config_if_required index cc84164b..a25ffeb6 100644 --- a/Makefile.config_if_required +++ b/Makefile.config_if_required @@ -13,9 +13,7 @@ #* * #************************************************************************** -ifeq "$(MAKECMDGOALS)" "" -MAKECMDGOALS += defaultentry -endif +MAKECMDGOALS ?= defaultentry CLEAN_TARGET_NAMES=clean partialclean distclean diff --git a/Makefile.dev b/Makefile.dev index 90a69dec..1e1eab9a 100644 --- a/Makefile.dev +++ b/Makefile.dev @@ -27,8 +27,8 @@ build-all-asts: @$(MAKE) --no-print-directory $(AST_FILES) CAMLC_DPARSETREE := \ - $(CAMLRUN) ./ocamlc -nostdlib -nopervasives \ - -stop-after parsing -dparsetree + $(OCAMLRUN) ./ocamlc -nostdlib -nopervasives \ + -stop-after parsing -dparsetree %.ml.ast: %.ml ocamlc $(CAMLC_DPARSETREE) $< 2> $@ || exit 0 diff --git a/Makefile.menhir b/Makefile.menhir index c2068d23..c46fcaa0 100644 --- a/Makefile.menhir +++ b/Makefile.menhir @@ -48,7 +48,7 @@ MENHIR ?= menhir ## Unused tokens -# tokens COMMENT, DOCSTRING and EOL are produced by special lexer +# The tokens COMMENT, DOCSTRING and EOL are produced by special lexer # modes used by other consumers than the parser. # GREATERBRACKET ">]" was added by the parser by symmetry with "[<" @@ -57,11 +57,29 @@ MENHIR ?= menhir unused_tokens := COMMENT DOCSTRING EOL GREATERRBRACKET -## Menhir compilation flags +## Menhir's flags. -MENHIRFLAGS := --explain --dump --ocamlc "$(CAMLC) $(COMPFLAGS)" --infer \ - --lalr --strict --table -lg 1 -la 1 \ - $(addprefix --unused-token ,$(unused_tokens)) --fixed-exception +# The basic flags influence the analysis of the grammar and the construction +# of the automaton. The complete set of flags includes extra flags that +# influence type inference and code production. + +MENHIRBASICFLAGS := \ + --lalr \ + --explain \ + --dump \ + --require-aliases \ + --strict \ + -lg 1 \ + -la 1 \ + $(addprefix --unused-token ,$(unused_tokens)) \ + +MENHIRFLAGS := \ + $(MENHIRBASICFLAGS) \ + --infer \ + --ocamlc "$(CAMLC) $(COMPFLAGS)" \ + --fixed-exception \ + --table \ + --strategy simplified \ ## promote-menhir @@ -132,7 +150,9 @@ test-menhir: parsing/parser.mly partialclean-menhir:: rm -f \ $(addprefix parsing/parser.,ml mli) \ - $(addprefix parsing/camlinternalMenhirLib.,ml mli) + $(addprefix parsing/camlinternalMenhirLib.,ml mli) \ + $(addprefix parsing/parser.,automaton conflicts) \ + $(addprefix parsing/parser.,auto.messages) \ clean-menhir: partialclean-menhir @@ -157,7 +177,126 @@ include .depend.menhir interpret-menhir: @ echo "Please wait, I am building the LALR automaton..." - @ $(MENHIR) $(MENHIRFLAGS) parsing/parser.mly \ + @ $(MENHIR) $(MENHIRBASICFLAGS) parsing/parser.mly \ --interpret \ --interpret-show-cst \ --trace \ + +## list-parse-errors + +# This rule runs Menhir's reachability analysis, which produces a list of all +# states where a syntax error can be detected (and a corresponding list of of +# erroneous sentences). This data is stored in parsing/parser.auto.messages. +# This analysis requires about 3 minutes and 6GB of RAM. + +# The analysis is performed on a copy of the grammar where every block +# of text comprised between the markers BEGIN AVOID and END AVOID has +# been removed. This allows us to avoid certain syntactic forms in the +# sentences that we produce. See parser.mly for more explanations. + +# Because of this, we must run Menhir twice: once on a modified copy of the +# grammar to produce the sentences, and once on the original grammar to update +# the auto-comments (which would otherwise be incorrect). + +.PHONY: list-parse-errors +list-parse-errors: + @ tmp=`mktemp -d /tmp/parser.XXXX` && \ + sed -e '/BEGIN AVOID/,/END AVOID/d' \ + parsing/parser.mly > $$tmp/parser.mly && \ + $(MENHIR) $(MENHIRBASICFLAGS) $$tmp/parser.mly \ + --list-errors -la 2 \ + > parsing/parser.auto.messages && \ + rm -rf $$tmp + @ cp parsing/parser.auto.messages parsing/parser.auto.messages.bak + @ $(MENHIR) $(MENHIRBASICFLAGS) parsing/parser.mly \ + --update-errors parsing/parser.auto.messages.bak \ + > parsing/parser.auto.messages + @ rm -f parsing/parser.auto.messages.bak + +## generate-parse-errors + +# This rule assumes that [make list-parse-errors] has been run first. + +# This rule turns the error sentences stored in parsing/parser.auto.messages +# into one .ml file. + +# (It would in principle be preferable to create one file per sentence, but +# that would be much slower. We abuse the ability of the OCaml toplevel to +# resynchronize after an error, and put all sentences into a single file.) + +# This requires Menhir 20201214 or newer. + +GPE_DIR := tests/generated-parse-errors +GPE_ML := errors.ml +GPE_REF := errors.compilers.reference +GPE_START := implementation use_file toplevel_phrase + +.PHONY: generate-parse-errors +generate-parse-errors: + @ \ + mkdir -p testsuite/$(GPE_DIR) && \ + $(MENHIR) $(MENHIRBASICFLAGS) parsing/parser.mly \ + --echo-errors-concrete parsing/parser.auto.messages 2>/dev/null | \ + (cd testsuite/$(GPE_DIR) && touch $(GPE_REF) && ( \ + echo "(* TEST\n * toplevel\n*)" && \ + while IFS= read -r symbolic ; do \ + IFS= read -r concrete ; \ + concrete=$${concrete#### Concrete syntax: } ; \ + : '$$symbolic is the sentence in symbolic form' ; \ + : '$$concrete is the sentence in concrete form' ; \ + case "$$symbolic" in \ + *": SEMISEMI"*) \ + : 'If the sentence begins with SEMISEMI, ignore it. Our hack' ; \ + : 'does not support these sentences, and there are only 6 of' ; \ + : 'them anyway.' ; \ + continue ;; \ + *) \ + case "$$symbolic" in \ + *"EOF") \ + : 'If the sentence ends with EOF, replace it on the fly' ; \ + : 'with some other token (say, WHEN).' ; \ + echo "#0 \"$${symbolic%%EOF}WHEN\"" ; \ + echo "$$concrete when" ; \ + echo ";;" ;; \ + *) \ + : 'Emit a # directive containing the symbolic sentence.' ; \ + echo "#0 \"$$symbolic\"" ; \ + : 'Emit the concrete sentence.' ; \ + echo "$$concrete" ; \ + : 'Emit a double semicolon to allow resynchronization.' ; \ + echo ";;" ;; \ + esac \ + esac \ + done) \ + > $(GPE_ML) && \ + : 'Count how many sentences we have emitted, per start symbol.' ; \ + for symbol in $(GPE_START) ; do \ + count=$$(grep -h -e "$$symbol:" $(GPE_ML) | wc -l) && \ + echo "$$count sentences whose start symbol is $$symbol." ; \ + done \ + ) + @ \ + read -p "Re-generate the expected output for this test? " -n 1 -r && \ + echo && \ + if [[ $$REPLY =~ ^[Yy]$$ ]] ; then \ + make -C testsuite promote DIR=$(GPE_DIR) >/dev/null 2>&1 && \ + echo "Done." ; \ + make classify-parse-errors ; \ + else \ + echo "OK, stop." ; \ + fi + +.PHONY: classify-parse-errors +classify-parse-errors: + @ ( \ + cd testsuite/$(GPE_DIR) && \ + echo "The parser's output can be described as follows:" && \ + c=$$(grep "^Error: Syntax error" $(GPE_REF) | wc -l) && \ + echo "$${c} syntax errors reported." && \ + c=$$(grep "^Error: Syntax error$$" $(GPE_REF) | wc -l) && \ + echo "$${c} errors without an explanation." && \ + c=$$(grep "^Error: Syntax" $(GPE_REF) | grep expected | wc -l) && \ + echo "$${c} errors with an indication of what was expected." && \ + c=$$(grep "might be unmatched" $(GPE_REF) | wc -l) && \ + echo "$${c} errors with an indication of an unmatched delimiter." && \ + true) diff --git a/Makefile.tools b/Makefile.tools deleted file mode 100644 index 75fa9bb4..00000000 --- a/Makefile.tools +++ /dev/null @@ -1,110 +0,0 @@ -#************************************************************************** -#* * -#* OCaml * -#* * -#* Xavier Clerc, SED, INRIA Rocquencourt * -#* * -#* Copyright 2010 Institut National de Recherche en Informatique et * -#* en Automatique. * -#* * -#* All rights reserved. This file is distributed under the terms of * -#* the GNU Lesser General Public License version 2.1, with the * -#* special exception on linking described in the file LICENSE. * -#* * -#************************************************************************** - -# This makefile provides variables for using the in-tree compiler, -# interpreter, lexer and other associated tools. It is intended to be -# included within other makefiles. -# See manual/tools/Makefile and manual/manual/tutorials/Makefile as examples. -# Note that these makefile should define the $(TOPDIR) variable on their -# own. - -WINTOPDIR=`cygpath -m "$(TOPDIR)"` - -# TOPDIR is the root directory of the OCaml sources, in Unix syntax. -# WINTOPDIR is the same directory, in Windows syntax. - -OTOPDIR=$(TOPDIR) -CTOPDIR=$(TOPDIR) -CYGPATH=echo -DIFF=diff -q -SORT=sort -SET_LD_PATH=CAML_LD_LIBRARY_PATH="$(LD_PATH)" - -# The variables above may be overridden by .../Makefile.config -# OTOPDIR is either TOPDIR or WINTOPDIR, whichever is appropriate for -# arguments given to the OCaml compiler. -# CTOPDIR is either TOPDIR or WINTOPDIR, whichever is appropriate for -# arguments given to the C and Fortran compilers. -# CYGPATH is the command that translates unix-style file names into -# whichever syntax is appropriate for arguments of OCaml programs. -# DIFF is a "diff -q" command that ignores trailing CRs under Windows. -# SORT is the Unix "sort" command. Usually a simple command, but may be an -# absolute name if the Windows "sort" command is in the PATH. -# SET_LD_PATH is a command prefix that sets the path for dynamic libraries -# (CAML_LD_LIBRARY_PATH for Unix, PATH for Windows) using the LD_PATH shell -# variable. Note that for Windows we add Unix-syntax directory names in -# PATH, and Cygwin will translate it to Windows syntax. - -# TOPDIR is legacy, our makefiles should use ROOTDIR now -ROOTDIR=$(TOPDIR) -include $(ROOTDIR)/Makefile.config_if_required - -# Make sure USE_RUNTIME is defined -USE_RUNTIME ?= - -ifneq ($(USE_RUNTIME),) -#Check USE_RUNTIME value -ifeq ($(findstring $(USE_RUNTIME),d i),) -$(error If set, USE_RUNTIME must be equal to "d" (debug runtime) \ - or "i" (instrumented runtime)) -endif - -RUNTIME_VARIANT=-I $(OTOPDIR)/runtime \ - -runtime-variant $(USE_RUNTIME) -export OCAMLRUNPARAM?=v=0 -endif - -OCAMLRUN=$(TOPDIR)/runtime/ocamlrun$(USE_RUNTIME)$(EXE) - -OCFLAGS=-nostdlib -I $(OTOPDIR)/stdlib $(COMPFLAGS) -OCOPTFLAGS= - -ifeq ($(SUPPORTS_SHARED_LIBRARIES),false) - CUSTOM = -custom -else - CUSTOM = -endif - -OCAML=$(OCAMLRUN) $(OTOPDIR)/ocaml$(EXE) $(OCFLAGS) -noinit -ifeq "$(FLEXLINK)" "" - FLEXLINK_PREFIX= -else - ifeq "$(wildcard $(TOPDIR)/flexdll/Makefile)" "" - FLEXLINK_PREFIX= - else - EMPTY= - FLEXLINK_PREFIX=OCAML_FLEXLINK="$(WINTOPDIR)/boot/ocamlrun$(EXE) \ - $(WINTOPDIR)/flexdll/flexlink.exe" $(EMPTY) - endif -endif -OCAMLC=$(FLEXLINK_PREFIX)$(OCAMLRUN) $(OTOPDIR)/ocamlc$(EXE) \ - $(CUSTOM) $(OCFLAGS) $(RUNTIME_VARIANT) -OCAMLOPT=$(FLEXLINK_PREFIX)$(OCAMLRUN) $(OTOPDIR)/ocamlopt$(EXE) $(OCFLAGS) \ - $(RUNTIME_VARIANT) -OCAMLDOC=$(OCAMLRUN) $(OTOPDIR)/ocamldoc/ocamldoc$(EXE) -OCAMLLEX=$(OCAMLRUN) $(OTOPDIR)/lex/ocamllex$(EXE) -OCAMLMKLIB=$(FLEXLINK_PREFIX)$(OCAMLRUN) $(OTOPDIR)/tools/ocamlmklib$(EXE) \ - -ocamlc "$(OTOPDIR)/runtime/ocamlrun$(USE_RUNTIME)$(EXE) \ - $(OTOPDIR)/ocamlc$(EXE) $(OCFLAGS) $(RUNTIME_VARIANT)" \ - -ocamlopt "$(OTOPDIR)/runtime/ocamlrun$(USE_RUNTIME)$(EXE) \ - $(OTOPDIR)/ocamlopt$(EXE) $(OCFLAGS) $(RUNTIME_VARIANT)" -OCAMLYACC=$(TOPDIR)/yacc/ocamlyacc$(EXE) -DUMPOBJ=$(OCAMLRUN) $(OTOPDIR)/tools/dumpobj$(EXE) -OBJINFO=$(OCAMLRUN) $(OTOPDIR)/tools/ocamlobjinfo$(EXE) - -#FORTRAN_COMPILER= -#FORTRAN_LIBRARY= - -UNIXLIBVAR=`case "$(OTHERLIBRARIES)" in *win32unix*) echo win32;; esac` diff --git a/README.adoc b/README.adoc index e4f5b7ab..0ac4b2f4 100644 --- a/README.adoc +++ b/README.adoc @@ -1,10 +1,16 @@ |===== -| Branch `trunk` | Branch `4.11` | Branch `4.10` | Branch `4.09` | Branch `4.08` | Branch `4.07` | Branch `4.06` | Branch `4.05` +| Branch `trunk` | Branch `4.12` | Branch `4.11` | Branch `4.10` -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=trunk["TravisCI Build Status (trunk branch)", - link="https://travis-ci.org/ocaml/ocaml"] +| image:https://github.com/ocaml/ocaml/workflows/Build/badge.svg?branch=trunk["Github CI Build Status (trunk branch)", + link="https://github.com/ocaml/ocaml/actions?query=workflow%3ABuild"] + image:https://github.com/ocaml/ocaml/workflows/Hygiene/badge.svg?branch=trunk["Github CI Hygiene Status (trunk branch)", + link="https://github.com/ocaml/ocaml/actions?query=workflow%3AHygiene"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=trunk&svg=true["AppVeyor Build Status (trunk branch)", link="https://ci.appveyor.com/project/avsm/ocaml"] +| image:https://github.com/ocaml/ocaml/workflows/main/badge.svg?branch=4.12["Github CI Build Status (4.12 branch)", + link="https://github.com/ocaml/ocaml/actions?query=workflow%3Amain"] + image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.12&svg=true["AppVeyor Build Status (4.12 branch)", + link="https://ci.appveyor.com/project/avsm/ocaml"] | image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.11["TravisCI Build Status (4.11 branch)", link="https://travis-ci.org/ocaml/ocaml"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.11&svg=true["AppVeyor Build Status (4.11 branch)", @@ -13,43 +19,23 @@ link="https://travis-ci.org/ocaml/ocaml"] image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.10&svg=true["AppVeyor Build Status (4.10 branch)", link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.09["TravisCI Build Status (4.09 branch)", - link="https://travis-ci.org/ocaml/ocaml"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.09&svg=true["AppVeyor Build Status (4.09 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.08["TravisCI Build Status (4.08 branch)", - link="https://travis-ci.org/ocaml/ocaml"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.08&svg=true["AppVeyor Build Status (4.08 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.07["TravisCI Build Status (4.07 branch)", - link="https://travis-ci.org/ocaml/ocaml"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.07&svg=true["AppVeyor Build Status (4.07 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.06["TravisCI Build Status (4.06 branch)", - link="https://travis-ci.org/ocaml/ocaml"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.06&svg=true["AppVeyor Build Status (4.06 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] -| image:https://travis-ci.org/ocaml/ocaml.svg?branch=4.05["TravisCI Build Status (4.05 branch)", - link="https://travis-ci.org/ocaml/ocaml"] - image:https://ci.appveyor.com/api/projects/status/github/ocaml/ocaml?branch=4.05&svg=true["AppVeyor Build Status (4.05 branch)", - link="https://ci.appveyor.com/project/avsm/ocaml"] |===== = README = == Overview -OCaml is an implementation of the ML language, based on the Caml Light -dialect extended with a complete class-based object system and a powerful -module system in the style of Standard ML. +OCaml is a functional, statically-typed programming language from the +ML family, offering a powerful module system extending that of +Standard ML and a feature-rich, class-based object system. OCaml comprises two compilers. One generates bytecode which is then -interpreted by a C program. This compiler runs quickly, generates compact -code with moderate memory requirements, and is portable to essentially any -32 or 64 bit Unix platform. Performance of generated programs is quite good -for a bytecoded implementation. This compiler can be used either as a -standalone, batch-oriented compiler that produces standalone programs, or as -an interactive, toplevel-based system. +interpreted by a C program. This compiler runs quickly, generates +compact code with moderate memory requirements, and is portable to +many 32 or 64 bit platforms. Performance of generated programs is +quite good for a bytecoded implementation. This compiler can be used +either as a standalone, batch-oriented compiler that produces +standalone programs, or as an interactive REPL system. The other compiler generates high-performance native code for a number of processors. Compilation takes longer and generates bigger code, but the @@ -65,7 +51,7 @@ compiler currently runs on the following platforms: | ARM 64 bits | Linux, macOS | FreeBSD | ARM 32 bits | Linux | FreeBSD, NetBSD, OpenBSD | Power 64 bits | Linux | -| Power 32 bits | | Linux +| Power 32 bits | Linux | | RISC-V 64 bits | Linux | | IBM Z (s390x) | Linux | |==== @@ -77,14 +63,14 @@ the compiler may work under other operating systems with little work. == Copyright All files marked "Copyright INRIA" in this distribution are -Copyright (C) 1996-2020 Institut National de Recherche en Informatique et +Copyright (C) 1996-2021 Institut National de Recherche en Informatique et en Automatique (INRIA) and distributed under the conditions stated in file LICENSE. == Installation See the file link:INSTALL.adoc[] for installation instructions on -machines running Unix, Linux, OS X and Cygwin. For native Microsoft +machines running Unix, Linux, macOS and Cygwin. For native Microsoft Windows, see link:README.win32.adoc[]. == Documentation @@ -102,6 +88,10 @@ https://ocaml.org/docs/install.html == Keeping in Touch with the Caml Community +There is an active and friendly discussion forum at + +https://discuss.ocaml.org/ + The OCaml mailing list is the longest-running forum for OCaml users. You can email it at @@ -115,10 +105,6 @@ An alternative archive of the mailing list is also available at https://inbox.ocaml.org/ -You can also access a newer discussion forum at - -https://discuss.ocaml.org/ - There also exist other mailing lists, chat channels, and various other forums around the internet for getting in touch with the OCaml and ML family language community. These can be accessed at diff --git a/README.win32.adoc b/README.win32.adoc index d6da9138..bfd1d0cd 100644 --- a/README.win32.adoc +++ b/README.win32.adoc @@ -62,9 +62,10 @@ methods are available, the officially supported environment for doing this is Only the `make` Cygwin package is required. `diffutils` is required if you wish to be able to run the test suite. -Unless you are also compiling the Cygwin port of OCaml, you should not install -the `gcc-core` or `flexdll` packages. If you do, care may be required to ensure -that a particular build is using the correct installation of `flexlink`. +Unless you are also compiling the Cygwin port of OCaml, you do not need the +`gcc-core` or `flexdll` packages. If you do install them, care may be required +to ensure that a particular build is using the correct installation of +`flexlink`. [[bmflex]] In addition to Cygwin, FlexDLL must also be installed, which is available from @@ -75,7 +76,7 @@ bootstrap FlexDLL, you will need to ensure that the directory to which you install FlexDLL is included in your `PATH` environment variable. Note: binary distributions of FlexDLL are compatible only with Visual Studio 2013 and earlier; for Visual Studio 2015 and later, you will need to compile the C -objects from source, or build ocaml using the flexdll target. +objects from source, or configure ocaml with the `--with-flexdll` option. The base bytecode system (ocamlc, ocaml, ocamllex, ocamlyacc, ...) of all three ports runs without any additional tools. @@ -200,7 +201,7 @@ Now run: for 32-bit, or: - ./configure --build=x86_64-unknown-cygwin --host=x86_64-pc-windows + ./configure --build=x86_64-pc-cygwin --host=x86_64-pc-windows for 64-bit. @@ -245,7 +246,7 @@ C code (`ocamlc -custom`) require the appropriate Mingw-w64 gcc and the `mingw64-i686-gcc-core` package for 32-bit and the `mingw64-x86_64-gcc-core` package for 64-bit. - - Do not try to use the Cygwin version of flexdll for this port. + - The Cygwin version of flexdll does not work with this port. - The standalone mingw toolchain from the Mingw-w64 project (http://mingw-w64.org/) is not supported. Please use the version packaged in @@ -265,7 +266,7 @@ Now run: for 32-bit, or: - ./configure --build=x86_64-unknown-cygwin --host=x86_64-w64-mingw32 + ./configure --build=x86_64-pc-cygwin --host=x86_64-w64-mingw32 for 64-bit. @@ -290,11 +291,9 @@ is, naturally, written in OCaml. This creates a circular dependency if you wish to build entirely from sources. Since OCaml 4.03 and FlexDLL 0.35, it is now possible to bootstrap the two programs simultaneously. The process is identical for both ports. If you choose to compile this way, it is not necessary to -install FlexDLL separately -- indeed, if you do install FlexDLL separately, you -may need to be careful to ensure that `ocamlopt` picks up the correct `flexlink` -in your `PATH`. +install FlexDLL separately. -You must place the FlexDLL sources for Version 0.35 or later in the directory +You must extract the FlexDLL sources for Version 0.35 or later in the directory `flexdll/` at the top-level directory of the OCaml distribution. This can be done in one of three ways: @@ -309,25 +308,18 @@ done in one of three ways: + git submodule update --init -OCaml is then compiled as normal for the port you require, except that before -building the compiler itself, you must compile `flexdll`, i.e.: +OCaml is then compiled normally for the port you require. - make flexdll make - make flexlink.opt make install - * You should ignore the error messages that say ocamlopt was not found. * `make install` will install FlexDLL by placing `flexlink.exe` (and the default manifest file for the Microsoft port) in `bin/` and the FlexDLL object files in `lib/`. - * If you don't include `make flexlink.opt`, `flexlink.exe` will be a - bytecode program. `make install` always installs the "best" - `flexlink.exe` (i.e. there is never a `flexlink.opt.exe` installed). - * If you have populated `flexdll/`, you *must* run - `make flexdll`. If you wish to revert to using an externally - installed FlexDLL, you must erase the contents of `flexdll/` before - compiling. + * If you have populated `flexdll/`, the build will always use it, ignoring + any externally installed FlexDLL. You can override this behaviour by either + erasing the contents of `flexdll/` or passing the `--without-flexdll` option + to `configure`. == Unicode support diff --git a/VERSION b/VERSION index 89a99f03..3cc34799 100644 --- a/VERSION +++ b/VERSION @@ -1,4 +1,4 @@ -4.12.1 +4.13.0 # The version string is the first line of this file. # It must be in the format described in stdlib/sys.mli diff --git a/aclocal.m4 b/aclocal.m4 index 33873178..6db770c4 100644 --- a/aclocal.m4 +++ b/aclocal.m4 @@ -58,7 +58,8 @@ unknown #endif] )], [AC_CACHE_VAL([ocaml_cv_cc_vendor], - [ocaml_cv_cc_vendor=`grep ['^[a-z]'] conftest.i | tr -s ' ' '-'`])], + [ocaml_cv_cc_vendor=`grep ['^[a-z]'] conftest.i | tr -s ' ' '-' \ + | tr -d '\r'`])], [AC_MSG_FAILURE([unexpected preprocessor failure])]) AC_MSG_RESULT([$ocaml_cv_cc_vendor]) ]) @@ -130,6 +131,7 @@ AC_DEFUN([OCAML_CC_SAVE_VARIABLES], [ saved_CC="$CC" saved_CFLAGS="$CFLAGS" saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" saved_ac_ext="$ac_ext" saved_ac_compile="$ac_compile" # Move the content of confdefs.h to another file so it does not @@ -147,6 +149,7 @@ AC_DEFUN([OCAML_CC_RESTORE_VARIABLES], [ CPPFLAGS="$saved_CPPFLAGS" CFLAGS="$saved_CFLAGS" CC="$saved_CC" + LIBS="$saved_LIBS" ]) AC_DEFUN([OCAML_AS_HAS_DEBUG_PREFIX_MAP], [ @@ -290,3 +293,179 @@ AC_DEFUN([OCAML_CHECK_LIBUNWIND], [ LDFLAGS="$SAVED_LDFLAGS" CFLAGS="$SAVED_CFLAGS" ]) + +AC_DEFUN([OCAML_TEST_FLEXLINK], [ + OCAML_CC_SAVE_VARIABLES + + AC_MSG_CHECKING([whether $1 works]) + + AC_COMPILE_IFELSE( + [AC_LANG_SOURCE([int answer = 42;])], + [# Create conftest1.$ac_objext as a symlink on Cygwin to ensure that native + # flexlink can cope. The reverse test is unnecessary (a Cygwin-compiled + # flexlink can read anything). + mv conftest.$ac_objext conftest1.$ac_objext + AS_CASE([$4],[*-pc-cygwin], + [ln -s conftest1.$ac_objext conftest2.$ac_objext], + [cp conftest1.$ac_objext conftest2.$ac_objext]) + + CC="$1 -chain $2 -exe" + LIBS="conftest2.$ac_objext" + CPPFLAGS="$3 $CPPFLAGS" + AC_LINK_IFELSE( + [AC_LANG_SOURCE([int main() { return 0; }])], + [AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no]) + AC_MSG_ERROR([$1 does not work])])], + [AC_MSG_RESULT([unexpected compile error]) + AC_MSG_ERROR([error calling the C compiler])]) + + OCAML_CC_RESTORE_VARIABLES +]) + +AC_DEFUN([OCAML_TEST_FLEXDLL_H], [ + OCAML_CC_SAVE_VARIABLES + + AS_IF([test -n "$1"],[CPPFLAGS="-I $1 $CPPFLAGS"]) + have_flexdll_h=no + AC_CHECK_HEADER([flexdll.h],[have_flexdll_h=yes],[have_flexdll_h=no]) + AS_IF([test x"$have_flexdll_h" = 'xno'], + [AS_IF([test -n "$1"], + [AC_MSG_ERROR([$1/flexdll.h appears unusable])])]) + + OCAML_CC_RESTORE_VARIABLES +]) + +AC_DEFUN([OCAML_TEST_FLEXLINK_WHERE], [ + OCAML_CC_SAVE_VARIABLES + + AC_MSG_CHECKING([if "$1 -where" includes flexdll.h]) + flexlink_where="$($1 -where | tr -d '\r')" + CPPFLAGS="$CPPFLAGS -I \"$flexlink_where\"" + cat > conftest.c <<"EOF" +#include +int main (void) {return 0;} +EOF + cat > conftest.Makefile </dev/null 2>/dev/null], + [have_flexdll_h=yes + AC_MSG_RESULT([yes])], + [AC_MSG_RESULT([no])]) + + OCAML_CC_RESTORE_VARIABLES +]) + +AC_DEFUN([OCAML_HOST_IS_EXECUTABLE], [ + AC_MSG_CHECKING([whether host executables can be run in the build]) + old_cross_compiling="$cross_compiling" + cross_compiling='no' + AC_RUN_IFELSE( + [AC_LANG_SOURCE([[int main (void) {return 0;}]])], + [AC_MSG_RESULT([yes]) + host_runnable=true], + [AC_MSG_RESULT([no]) + host_runnable=false], + # autoconf displays a warning if this parameter is missing, but + # cross-compilation mode was disabled above. + [assert=false]) + cross_compiling="$old_cross_compiling" +]) + +# This is AC_RUN_IFELSE but taking $host_runnable into account (i.e. if the +# program can be run, then it is run) +AC_DEFUN([OCAML_RUN_IFELSE], [ + old_cross_compiling="$cross_compiling" + AS_IF([test "x$host_runnable" = 'xtrue'], [cross_compiling='no']) + AC_RUN_IFELSE([$1],[$2],[$3],[$4]) + cross_compiling="$old_cross_compiling" +]) + +AC_DEFUN([OCAML_C99_CHECK_ROUND], [ + AC_MSG_CHECKING([whether round works]) + OCAML_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include +int main (void) { + static volatile double d = 0.49999999999999994449; + return (fpclassify(round(d)) != FP_ZERO); +} + ]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAS_WORKING_ROUND])], + [AC_MSG_RESULT([no]) + AS_CASE([$enable_imprecise_c99_float_ops,$target], + [no,*], [hard_error=true], + [yes,*], [hard_error=false], + [*,x86_64-w64-mingw32], [hard_error=false], + [hard_error=true]) + AS_IF([test x"$hard_error" = "xtrue"], + [AC_MSG_ERROR(m4_normalize([ + round does not work, enable emulation with + --enable-imprecise-c99-float-ops]))], + [AC_MSG_WARN(m4_normalize([ + round does not work; emulation enabled]))])], + [AS_CASE([$target], + [x86_64-w64-mingw32],[AC_MSG_RESULT([cross-compiling; assume not])], + [AC_MSG_RESULT([cross-compiling; assume yes]) + AC_DEFINE([HAS_WORKING_ROUND])])]) +]) + +AC_DEFUN([OCAML_C99_CHECK_FMA], [ + AC_MSG_CHECKING([whether fma works]) + OCAML_RUN_IFELSE( + [AC_LANG_SOURCE([[ +#include +int main (void) { + /* Tests 264-266 from testsuite/tests/fma/fma.ml. These tests trigger the + broken implementations of Cygwin64, mingw-w64 (x86_64) and VS2013-2017. + The static volatile variables aim to thwart GCC's constant folding. */ + static volatile double x, y, z; + double t264, t265, t266; + x = 0x3.bd5b7dde5fddap-496; + y = 0x3.bd5b7dde5fddap-496; + z = -0xd.fc352bc352bap-992; + t264 = fma(x, y, z); + x = 0x3.bd5b7dde5fddap-504; + y = 0x3.bd5b7dde5fddap-504; + z = -0xd.fc352bc352bap-1008; + t265 = fma(x, y, z); + x = 0x8p-540; + y = 0x4p-540; + z = 0x4p-1076; + t266 = fma(x, y, z); + return (!(t264 == 0x1.0989687cp-1044 || + t264 == 0x0.000004277ca1fp-1022 || /* Acceptable emulated values */ + t264 == 0x0.00000428p-1022) + || !(t265 == 0x1.0988p-1060 || + t265 == 0x0.0000000004278p-1022 || /* Acceptable emulated values */ + t265 == 0x0.000000000428p-1022) + || !(t266 == 0x8p-1076)); +} + ]])], + [AC_MSG_RESULT([yes]) + AC_DEFINE([HAS_WORKING_FMA])], + [AC_MSG_RESULT([no]) + AS_CASE([$enable_imprecise_c99_float_ops,$target], + [no,*], [hard_error=true], + [yes,*], [hard_error=false], + [*,x86_64-w64-mingw32|*,x86_64-*-cygwin*], [hard_error=false], + [AS_CASE([$ocaml_cv_cc_vendor], + [msvc-*], [AS_IF([test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 ], + [hard_error=false], + [hard_error=true])], + [hard_error=true])]) + AS_IF([test x"$hard_error" = "xtrue"], + [AC_MSG_ERROR(m4_normalize([ + fma does not work, enable emulation with + --enable-imprecise-c99-float-ops]))], + [AC_MSG_WARN(m4_normalize([ + fma does not work; emulation enabled]))])], + [AS_CASE([$target], + [x86_64-w64-mingw32|x86_64-*-cygwin*], + [AC_MSG_RESULT([cross-compiling; assume not])], + [AC_MSG_RESULT([cross-compiling; assume yes]) + AC_DEFINE([HAS_WORKING_FMA])])]) +]) diff --git a/api_docgen/Compiler_libs.pre.mld b/api_docgen/Compiler_libs.pre.mld new file mode 100644 index 00000000..9c479b78 --- /dev/null +++ b/api_docgen/Compiler_libs.pre.mld @@ -0,0 +1,6 @@ +{1 Warning} + This library is part of the internal OCaml compiler API, and is +not the language standard library. + There are no compatibility guarantees between releases, so code written +against these modules must be willing to depend on specific OCaml compiler +versions. diff --git a/api_docgen/Format_tutorial.mld b/api_docgen/Format_tutorial.mld new file mode 100644 index 00000000..7da5f732 --- /dev/null +++ b/api_docgen/Format_tutorial.mld @@ -0,0 +1,425 @@ +{1 Principles} + +Line breaking is based on three concepts: + +{ul {- {b boxes} : a box is a logical pretty-printing unit, which + defines a behaviour of the pretty-printing engine to display the + material inside the box.} + {- {b break hints}: a break hint is a directive to the + pretty-printing engine that proposes to break the line here, if it is + necessary to properly print the rest of the material. + Otherwise, the pretty-printing engine never break lines (except + "in case of emergency" to avoid very bad output). + In short, a break hint tells the pretty printer that a line break here + may be appropriate.} + {- {b indentation rules}: + When a line break occurs, the pretty-printing engines fixes the + indentation (or amount of leading spaces) of the new line using + indentation rules, as follows: + {ul {- A box can state the extra indentation of every new line opened in + its scope. This extra indentation is named + {b box breaking indentation}.} + {- A break hint can also set the additional indentation of the new line + it may fire. This extra indentation is named {b hint breaking + indentation}.} + {- If break hint [bh] fires a new line within box + [b], then the indentation of the new line is simply the sum of: + the current indentation of box [b] + + + the additional box breaking indentation, as defined by box [b] + + + the additional hint breaking indentation, as defined by break + hint [bh].}}}} + +{1 Boxes} + +There are 4 types of boxes. (The most often used is the "hov" box type, so skip +the rest at first reading). + + - {b horizontal box} ({i h} box, as obtained by the + {!open_hbox} procedure): within this box, break hints do not + lead to line breaks. + - {b vertical box} ({i v} box, as obtained by the + {!open_vbox} procedure): within this box, every break hint lead + to a new line. + - {b vertical/horizontal box} ({i hv} box, as obtained by + the {!open_hvbox} procedure): if it is possible, the entire box + is written on a single line; otherwise, every break hint within the box + leads to a new line. + - {b vertical or horizontal box} ({i hov} box, as obtained + by the {!open_box} or {!open_hovbox} procedures): within this box, break + hints are used to cut the line when there is no more room on the line. + There are two kinds of "hov" boxes, you can find the details + below. In first approximation, let me + consider these two kinds of "hov" boxes as equivalent and + obtained by calling the {!open_box} procedure. + +Let me give an example. Suppose we can write 10 chars before +the right margin (that indicates no more room). We represent any +char as a [-] sign; characters [\[] and [\]] +indicates the opening and closing of a box and [b] stands +for a break hint given to the pretty-printing engine. + +The output "--b--b--" is displayed like this (the [b] symbol +stands for the value of the break that is explained below): + +Within a "h" box: + +{[ +--b--b-- +]} + +Within a "v" box: + +{[ +--b +--b +-- +]} + +Within a "hv" box: + +If there is enough room to print the box on the line: + +{[ +--b--b-- +]} + +But "---b---b---" that cannot fit on the line is written + +{[ +---b +---b +--- +]} + +Within a "hov" box: + +If there is enough room to print the box on the line: + +{[ +--b--b-- +]} + +But if "---b---b---" cannot fit on the line, it is written as + +{[ +---b---b +--- +]} + +The first break hint does not lead to a new line, since there is enough room on +the line. The second one leads to a new line since there is no more room to +print the material following it. If the room left on the line were even +shorter, the first break hint may lead to a new line and "---b---b---" is +written as: + +{[ +---b +---b +--- +]} + +{1 Printing spaces} + +Break hints are also used to output spaces (if the line is not split when the +break is encountered, otherwise the new line indicates properly the separation +between printing items). You output a break hint using [print_break sp indent], +and this sp integer is used to print "sp" spaces. Thus [print_break sp ...] may +be thought as: print [sp] spaces or output a new line. + +For instance, if b is [break 1 0] in the output "--b--b--", we get + +within a "h" box: + +{[ +-- -- -- +]} + +within a "v" box: + +{[ +-- +-- +-- +]} + +within a "hv" box: +{[ +-- -- -- +]} + +or, according to the remaining room on the line: + +{[ +-- +-- +-- +]} + +and similarly for "hov" boxes. + +Generally speaking, a printing routine using "format", should not directly +output white spaces: the routine should use break hints instead. (For instance +[print_space ()] that is a convenient abbreviation for [print_break 1 0] and +outputs a single space or break the line.) + +{1 Indentation of new lines} + +The user gets 2 ways to fix the indentation of new lines: + +{b When defining the box}: when you open a box, you can fix the indentation +added to each new line opened within that box. + +For instance: [open_hovbox 1] opens a "hov" box with new lines indented 1 more +than the initial indentation of the box. With output "---\[--b--b--b--", we +get: + +{[ +---\[--b--b + --b-- +]} + +with open_hovbox 2, we get + +{[ +---\[--b--b + --b-- +]} + +Note: the \[ sign in the display is not visible on the screen, it is just there +to materialise the aperture of the pretty-printing box. Last "screen" stands +for: + +{[ +-----b--b + --b-- +]} + +{b When defining the break that makes the new line}. As said above, you output +a break hint using [print_break sp indent]. The [indent] integer is used to fix +the additional indentation of the new line. Namely, it is added to the default +indentation offset of the box where the break occurs. + +For instance, if \[ stands for the opening of a "hov" box with 1 as extra +indentation (as obtained by [open_hovbox 1]), and b is [print_break 1 2], then + from output "---\[--b--b--b--", we get: + +{[ + ---\[-- -- + -- + -- +]} + +{1 Refinement on "hov" boxes} + +The "hov" box type is refined into two categories. + +- {b the vertical or horizontal {i packing} box} (as obtained by the +{!open_hovbox} procedure): break hints are used to cut the line when there is no +more room on the line; no new line occurs if there is enough room on the line. +- {b vertical or horizontal {i structural} box} (as obtained by the {!open_box} +procedure): similar to the "hov" packing box, the break hints are used to cut +the line when there is no more room on the line; in addition, break hints that +can show the box structure lead to new lines even if there is enough room on +the current line. + +The difference between a packing and a structural "hov" box is shown by a +routine that closes boxes and parentheses at the end of printing: with packing +boxes, the closure of boxes and parentheses do not lead to new lines if there +is enough room on the line, whereas with structural boxes each break hint will +lead to a new line. For instance, when printing +"\[(---\[(----\[(---b)\]b)\]b)\]", where "b" is a break hint without extra +indentation ([print_cut ()]). If "\[" means opening of a packing "hov" box +({!open_hovbox}), "\[(---\[(----\[(---b)\]b)\]b)\]" is printed as follows: + +{[ +(--- + (---- + (---))) +]} + +If we replace the packing boxes by structural boxes ({!open_box}), each break +hint that precedes a closing parenthesis can show the boxes structure, if it +leads to a new line; hence "\[(---\[(----\[(---b)\]b)\]b)\]" is printed like +this: + +{[ +(--- + (---- + (--- + ) + ) +) +]} + +{1 Practical advice} + +When writing a pretty-printing routine, follow these simple rules: + ++ Boxes must be opened and closed consistently ([open_*] and {!close_box} must +be nested like parentheses). ++ Never hesitate to open a box. ++ Output many break hints, otherwise the pretty-printer is in a bad situation +where it tries to do its best, which is always "worse than your bad". ++ Do not try to force spacing using explicit spaces in the character strings. +For each space you want in the output emit a break hint ([print_space ()]), +unless you explicitly don't want the line to be broken here. For instance, +imagine you want to pretty print an OCaml definition, more precisely a [let rec +ident = expression] value definition. You will probably treat the first three +spaces as "unbreakable spaces" and write them directly in the string constants +for keywords, and print ["let rec"] before the identifier, and similarly write +[=] to get an unbreakable space after the identifier; in contrast, the space +after the [=] sign is certainly a break hint, since breaking the line after [=] +is a usual (and elegant) way to indent the expression part of a definition. In +short, it is often necessary to print unbreakable spaces; however, most of the +time a space should be considered a break hint. ++ Do not try to force new lines, let the pretty-printer do it for you: that's +its only job. In particular, do not use {!force_newline}: this procedure +effectively leads to a newline, but it also as the unfortunate side effect to +partially reinitialise the pretty-printing engine, so that the rest of the +printing material is noticeably messed up. ++ Never put newline characters directly in the strings to be printed: pretty +printing engine will consider this newline character as any other character +written on the current line and this will completely mess up the output. +Instead of new line characters use line break hints: if those break hints must +always result in new lines, it just means that the surrounding box must be a +vertical box! ++ End your main program by a [print_newline ()] call, that flushes the +pretty-printer tables (hence the output). (Note that the top-level loop of the +interactive system does it as well, just before a new input.) + +{1 Printing to stdout: using printf} + +The format module provides a general printing facility "a la" printf. In +addition to the usual conversion facility provided by printf, you can write +pretty-printing indications directly inside the format string (opening and +closing boxes, indicating breaking hints, etc). + +Pretty-printing annotations are introduced by the [@] symbol, directly into the +string format. Almost any function of the [Format] module can be called from +within a [printf] format string. For instance + +- "[@\[]" open a box (open_box 0). You may precise the type as an extra +argument. For instance [@\[] is equivalent to [open_hovbox n]. +- "[@\]]" close a box ([close_box ()]). +- "[@ ]" output a breakable space ([print_space ()]). +- "[@,]" output a break hint ([print_cut ()]). +- "[@;]" emit a "full" break hint ([print_break n m]). +- "[@.]" end the pretty-printing, closing all the boxes still opened +([print_newline ()]). + +For instance + +{v +printf "@\[<1>%s@ =@ %d@ %s@\]@." "Prix TTC" 100 "Euros";; +Prix TTC = 100 Euros +- : unit = () +v} + +{1 A concrete example} + +Let me give a full example: the shortest non trivial example you could imagine, +that is the lambda calculus :) + +Thus the problem is to pretty-print the values of a concrete data type that +models a language of expressions that defines functions and their applications +to arguments. + +First, I give the abstract syntax of lambda-terms: + +{v +type lambda = + | Lambda of string * lambda + | Var of string + | Apply of lambda * lambda +;; +v} + +I use the format library to print the lambda-terms: + +{v +open Format;; + +let ident = print_string;; +let kwd = print_string;; +val ident : string -> unit = +val kwd : string -> unit = + +let rec print_exp0 = function +| Var s -> ident s +| lam -> open_hovbox 1; kwd "("; print_lambda lam; kwd ")"; close_box () + +and print_app = function +| e -> open_hovbox 2; print_other_applications e; close_box () + +and print_other_applications f = + match f with + | Apply (f, arg) -> print_app f; print_space (); print_exp0 arg + | f -> print_exp0 f + +and print_lambda = function +| Lambda (s, lam) -> + open_hovbox 1; + kwd "\\"; ident s; kwd "."; print_space(); print_lambda lam; + close_box() + | e -> print_app e;; +val print_app : lambda -> unit = +val print_other_applications : lambda -> unit = +val print_lambda : lambda -> unit = +v} + +{2 Most general pretty-printing: using fprintf} + +We use the [fprintf] function to write the most versatile version of the +pretty-printing functions for lambda-terms. Now, the functions get an extra +argument, namely a pretty-printing formatter (the ppf argument) where printing +will occur. This way the printing routines are more general, since they can +print on any formatter defined in the program (either printing to a file, or to +[stdout], to [stderr], or even to a string). Furthermore, the pretty-printing +functions are now compositional, since they may be used in conjunction with the +special [%a] conversion, that prints a [fprintf] argument with a user's supplied +function (these user's supplied functions also have a formatter as first +argument). + +Using [fprintf], the lambda-terms printing routines can be written as follows: + +{v +open Format;; + +let ident ppf s = fprintf ppf "%s" s;; +let kwd ppf s = fprintf ppf "%s" s;; +val ident : Format.formatter -> string -> unit +val kwd : Format.formatter -> string -> unit + +let rec pr_exp0 ppf = function +| Var s -> fprintf ppf "%a" ident s +| lam -> fprintf ppf "@\[<1>(%a)@\]" pr_lambda lam + +and pr_app ppf = function +| e -> fprintf ppf "@\[<2>%a@\]" pr_other_applications e + +and pr_other_applications ppf f = +match f with +| Apply (f, arg) -> fprintf ppf "%a@ %a" pr_app f pr_exp0 arg +| f -> pr_exp0 ppf f + +and pr_lambda ppf = function +| Lambda (s, lam) -> +fprintf ppf "@\[<1>%a%a%a@ %a@\]" kwd "\\" ident s kwd "." pr_lambda lam +| e -> pr_app ppf e +;; +val pr_app : Format.formatter -> lambda -> unit +val pr_other_applications : Format.formatter -> lambda -> unit +val pr_lambda : Format.formatter -> lambda -> unit +v} + +Given those general printing routines, procedures to print to [stdout] or +[stderr] is just a matter of partial application: + +{v +let print_lambda = pr_lambda std_formatter;; +let eprint_lambda = pr_lambda err_formatter;; +val print_lambda : lambda -> unit +val eprint_lambda : lambda -> unit +v} diff --git a/api_docgen/Makefile b/api_docgen/Makefile new file mode 100644 index 00000000..f00cfccf --- /dev/null +++ b/api_docgen/Makefile @@ -0,0 +1,31 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Florian Angeletti, projet Cambium, Inria Paris * +#* * +#* Copyright 2020 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** +ROOTDIR = .. +-include $(ROOTDIR)/Makefile.build_config + +ifeq ($(DOCUMENTATION_TOOL),odoc) + include odoc/Makefile +else + include ocamldoc/Makefile +endif + +odoc-%: + $(MAKE) -C odoc $* ROOTDIR=../.. + +ocamldoc-%: + $(MAKE) -C ocamldoc $* ROOTDIR=../.. + +clean: + rm -rf build odoc/build ocamldoc/build diff --git a/api_docgen/Makefile.common b/api_docgen/Makefile.common new file mode 100644 index 00000000..e360da66 --- /dev/null +++ b/api_docgen/Makefile.common @@ -0,0 +1,56 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Florian Angeletti, projet Cambium, Inria Paris * +#* * +#* Copyright 2020 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** +ROOTDIR = .. +DOCGEN= $(ROOTDIR)/api_docgen + +include $(ROOTDIR)/Makefile.common +include $(ROOTDIR)/stdlib/StdlibModules +include $(ROOTDIR)/Makefile.best_binaries +include $(DOCGEN)/Makefile.docfiles + +DOC_COMPILERLIBS_DIRS= $(addprefix $(ROOTDIR)/,\ + parsing utils typing bytecomp driver file_formats lambda) + +DOC_STDLIB_DIRS = $(addprefix $(ROOTDIR)/, stdlib \ + otherlibs/str otherlibs/$(UNIXLIB) otherlibs/dynlink \ + otherlibs/systhreads) + +.PHONY: all +all: html pdf man + +DIRS = $(addprefix build/,libref compilerlibref man latex texi \ + html html/libref html/compilerlibref) + +$(DIRS): + $(MKDIR) $@ + +pdf: build/latex/alldoc.pdf +latex: +man: +html: +build/latex/alldoc.pdf: build/latex/stdlib_input.tex \ + build/latex/compilerlibs_input.tex | build/latex/ifocamldoc.tex + +$(DOCGEN)/build/Compiler_libs.mld: $(DOCGEN)/Compiler_libs.pre.mld + cp $< $@ && echo "{!modules:$(compilerlibref_C)}" >> $@ + +build/latex/ifocamldoc.tex: $(ROOTDIR)/Makefile.config | build/latex + +build/latex/alldoc.tex:$(DOCGEN)/alldoc.tex | build/latex + cp $< $@ + +$(compilerlibref_TEXT:%=build/%.mld) $(libref_TEXT:%=build/%.mld): \ +build/%.mld:$(DOCGEN)/%.mld + cp $< $@ diff --git a/api_docgen/Makefile.docfiles b/api_docgen/Makefile.docfiles new file mode 100644 index 00000000..14a3b183 --- /dev/null +++ b/api_docgen/Makefile.docfiles @@ -0,0 +1,81 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Florian Angeletti, projet Cambium, Inria Paris * +#* * +#* Copyright 2020 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** + +# Capitalize first letter of argument +define up +$(shell echo $(1) | cut -c1 | tr '[:lower:]' '[:upper:]') +endef + +define capitalize_one +$(call up,$(1))$(shell echo $(1) | cut -c2-) +endef + +define capitalize +$(foreach m,$(1),$(call capitalize_one,$m)) +endef + +define sort +$(shell $(BEST_OCAMLDEP) -sort $(1)) +endef + + +str_MLIS := str.mli +unix_MLIS := unix.mli unixLabels.mli +dynlink_MLIS := dynlink.mli +thread_MLIS := \ + thread.mli condition.mli mutex.mli event.mli \ + threadUnix.mli semaphore.mli + +STDLIB=$(filter-out stdlib__Pervasives, $(STDLIB_MODULES)) + +stdlib_UNPREFIXED=$(filter-out pervasives, $(STDLIB_MODULE_BASENAMES)) + +otherlibref := $(dynlink_MLIS:%.mli=%) + +ifneq "$(filter str,$(OTHERLIBRARIES))" "" +otherlibref += $(str_MLIS:%.mli=%) +endif + +ifneq "$(filter %unix,$(OTHERLIBRARIES))" "" +otherlibref += $(unix_MLIS:%.mli=%) +endif + +ifneq "$(filter systhreads,$(OTHERLIBRARIES))" "" +otherlibref += $(thread_MLIS:%.mli=%) +endif + +libref_EXTRA=stdlib__pervasives +libref_TEXT=Ocaml_operators Format_tutorial +libref_C=$(call capitalize,$(libref) $(libref_EXTRA)) + +PARSING_MLIS := $(call sort, \ + $(notdir $(wildcard $(ROOTDIR)/parsing/*.mli))\ +) +UTILS_MLIS := $(call sort,$(notdir $(wildcard $(ROOTDIR)/utils/*.mli))) +DRIVER_MLIS := pparse.mli + +compilerlibref_MLIS= \ + $(PARSING_MLIS) \ + $(UTILS_MLIS) \ + $(DRIVER_MLIS) +compilerlibref=$(compilerlibref_MLIS:%.mli=%) +compilerlibref_TEXT=Compiler_libs +compilerlibref_C=$(call capitalize,$(compilerlibref)) + +ALL_LIBREF= $(libref_TEXT:%=libref/%) $(libref:%=libref/%) +ALL_COMPILERLIBREF= \ + $(compilerlibref_TEXT:%=compilerlibref/%) \ + $(compilerlibref:%=compilerlibref/%) +ALL_DOC= $(ALL_LIBREF) $(ALL_COMPILERLIBREF) diff --git a/api_docgen/Ocaml_operators.mld b/api_docgen/Ocaml_operators.mld new file mode 100644 index 00000000..68393d74 --- /dev/null +++ b/api_docgen/Ocaml_operators.mld @@ -0,0 +1,100 @@ +Precedence level and associativity of operators + +The following table lists the precedence level of all operator classes +from the highest to the lowest precedence. A few other syntactic constructions +are also listed as references. + +{%latex: +% +% Note: the tables below should be kept in sync with the one in +% manual/src/refman/expr.etex . +% +\begin{tabular}{cc} +\hline +Operator class & Associativity \\ +\hline +$!\ldots$ $\tilde{}\ldots$ & -- \\ +$.\cdots()$ $.\cdots[]$ $.\cdots$\textbraceleft\textbraceright& -- \\ +\#\ldots & left \\ +function application & left \\ +- -. & -- \\ +$**\ldots$ lsl lsr asr & right \\ +$*\ldots$ /\ldots \%\ldots mod land lor lxor & left \\ ++\ldots -\ldots & left \\ +:: & right \\ +@\ldots \textasciicircum\ldots & right \\ +=\ldots <\ldots >\ldots |\ldots \&\ldots \$\ldots != & left \\ +\& \&\& & right \\ +or || & right \\ +, & -- \\ +<- := & right \\ +if & -- \\ +; & right \\ +\hline +\end{tabular} +%} + +{%html: + + + + + + + + + + + + + + + + + + + +
Operator classAssociativity
!… ~…
.…() .…[] .…{} +
#… left
function application left
- -.
**… lsl lsr asr right
*… /… %… mod land lor lxor + left
+… -… left
:: right
@… ^… right
=… <… +>… |… &… $… != left
& && right
or || right
,
<- := right
if
; right
+%} + +{%man: +.IP Associativity +Operator class +.IP - +!.. ~.. +.IP - +\&.() .[] .{} +.IP left +#.. +.IP left +function application +.IP - +- -. +.IP right +**.. lsl lsr asr +.IP left +*.. /.. %.. mod land lor lxor +.IP left ++.. -.. +.IP right +:: +.IP right +@.. ^.. +.IP left +=.. <.. >.. |.. &.. $.. != +.IP right +& && +.IP right +or || +.IP - +, +.IP right +<- := +.IP - +if +.IP right +; +%} diff --git a/api_docgen/alldoc.tex b/api_docgen/alldoc.tex new file mode 100644 index 00000000..ce782e72 --- /dev/null +++ b/api_docgen/alldoc.tex @@ -0,0 +1,93 @@ +\documentclass{book} + +\usepackage[colorlinks=true,breaklinks=true]{hyperref} +\usepackage{color} +\usepackage{lmodern} +\usepackage[T1]{fontenc} +\usepackage[strings,nohyphen]{underscore} +\input{ifocamldoc} +\ifocamldoc +\usepackage{ocamldoc} +\usepackage{textcomp} +\else +\usepackage{changepage} +\usepackage{longtable} +\usepackage{listings} +\newcommand{\ocamlcodefragment}[1]{{\ttfamily\setlength{\parindent}{0cm}% +\raggedright#1}} +\newcommand{\ocamlinlinecode}[1]{{\ttfamily#1}} +\newcommand{\bold}[1]{{\bfseries#1}} +\newenvironment{ocamlexception}{\bfseries}{} +\newenvironment{ocamlextension}{\bfseries}{} +\newenvironment{ocamlarrow}{} + +\newcommand{\ocamltag}[2]{\begin{ocaml#1}#2\end{ocaml#1}} +\newenvironment{ocamlkeyword}{\bfseries}{} +\newenvironment{ocamlconstructor}{\bfseries}{} +\newenvironment{ocamltype-var}{\itshape\ttfamily}{} + +\newcommand{\ocamlhighlight}{\bfseries\uline} +\newcommand{\ocamlerror}{\bfseries} +\newcommand{\ocamlwarning}{\bfseries} + +\definecolor{lightgray}{gray}{0.97} +\definecolor{gray}{gray}{0.5} +\newcommand{\ocamlcomment}{\color{gray}\normalfont\small} +\newcommand{\ocamlstring}{\color{gray}\bfseries} +\newenvironment{ocamlindent}{\begin{adjustwidth}{2em}{0pt}}{\end{adjustwidth}} +\newenvironment{ocamltabular}[2][l]{\begin{tabular}{#2}}% +{\end{tabular}} + +\lstnewenvironment{ocamlcodeblock}{ + \lstset{ + backgroundcolor = \color{lightgray}, + basicstyle=\ttfamily, + showstringspaces=false, + language=caml, + escapeinside={$}{$}, + columns=fullflexible, + stringstyle=\ocamlstring, + commentstyle=\ocamlcomment, + keepspaces=true, + keywordstyle=\ocamlkeyword, + moredelim=[is][\ocamlhighlight]{<<}{>>}, + moredelim=[s][\ocamlstring]{\{|}{|\}}, + moredelim=[s][\ocamlstring]{\{delimiter|}{|delimiter\}}, + keywords={[2]{val,initializer,nonrec}}, keywordstyle={[2]\ocamlkeyword}, + belowskip=0\baselineskip, + upquote=true, + literate={'"'}{\textquotesingle "\textquotesingle}3 + {'\\"'}{\textquotesingle \textbackslash"\textquotesingle}4, + } +}{} +\fi + +\ifocamldoc +\newcommand{\docitem}[2]{\input{#2}} +\else +\newcommand{\docitem}[2]{\input{#1/#2}} +\fi + +\begin{document} +\chapter{Stdlib} +\docitem{libref}{Stdlib.tex} +\input{stdlib_input} +\docitem{libref}{Ocaml_operators.tex} +\chapter{Dynlink} +\docitem{libref}{Dynlink.tex} +\chapter{Str} +\docitem{libref}{Str.tex} +\chapter{Thread} +\docitem{libref}{Condition.tex} +\docitem{libref}{Event.tex} +\docitem{libref}{Mutex.tex} +\docitem{libref}{Thread.tex} +\docitem{libref}{ThreadUnix.tex} +\docitem{libref}{Semaphore.tex} +\chapter{Unix} +\docitem{libref}{UnixLabels.tex} +\docitem{libref}{Unix.tex} +\chapter{Compilerlibs} +\docitem{compilerlibref}{Compiler_libs.tex} +\input{compilerlibs_input.tex} +\end{document} diff --git a/api_docgen/ocamldoc/Makefile b/api_docgen/ocamldoc/Makefile new file mode 100644 index 00000000..87cd9cdb --- /dev/null +++ b/api_docgen/ocamldoc/Makefile @@ -0,0 +1,126 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Florian Angeletti, projet Cambium, Inria Paris * +#* * +#* Copyright 2020 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** +include $(ROOTDIR)/api_docgen/Makefile.common +include $(ROOTDIR)/ocamldoc/Makefile.best_ocamldoc +vpath %.mli $(ROOTDIR)/stdlib $(DOC_COMPILERLIBS_DIRS) $(DOC_STDLIB_DIRS) + + +man: build/man/Stdlib.3o +latex: build/latex/Stdlib.tex +html: \ + build/html/libref/Stdlib.html \ + build/html/compilerlibref/Compiler_libs.html +texi: build/texi/stdlib.texi + +DOC_STDLIB_INCLUDES= $(addprefix -I , $(DOC_STDLIB_DIRS)) + +DOC_ALL_INCLUDES = \ + $(DOC_STDLIB_INCLUDES) \ + $(addprefix -I ,$(DOC_COMPILERLIBS_DIRS)) + +libref=$(stdlib_UNPREFIXED) $(otherlibref) + +ALL_MAN= $(ALL_DOC:%=build/man/%.3o) +ALL_LATEX= $(ALL_DOC:%=build/latex/%.tex) + +build/latex/ifocamldoc.tex: | build/latex + printf '\\newif\ifocamldoc\ocamldoctrue\n' > $@ + +$(libref:%=build/libref/%.odoc): build/libref/%.odoc: %.mli | build/libref + $(OCAMLDOC_RUN) -nostdlib -hide Stdlib -lib Stdlib \ + -pp \ +"$(AWK) -v ocamldoc=true -f $(ROOTDIR)/stdlib/expand_module_aliases.awk" \ + $(DOC_STDLIB_INCLUDES) $< -dump $@ + +$(compilerlibref:%=build/compilerlibref/%.odoc):\ +build/compilerlibref/%.odoc: %.mli | build/compilerlibref + $(OCAMLDOC_RUN) -nostdlib -hide Stdlib \ + $(DOC_ALL_INCLUDES) $< -dump $@ + +$(compilerlibref_TEXT:%=build/compilerlibref/%.odoc):\ +build/compilerlibref/%.odoc: $(DOCGEN)/build/%.mld | build/compilerlibref + $(OCAMLDOC_RUN) $(DOC_ALL_INCLUDES) -text $< -dump $@ + +$(libref_TEXT:%=build/libref/%.odoc):\ +build/libref/%.odoc: $(DOCGEN)/%.mld | build/libref + $(OCAMLDOC_RUN) $(DOC_STDLIB_INCLUDES) -text $< -dump $@ + +ALL_COMPILED_DOC=$(ALL_DOC:%=build/%.odoc) +build/man/Stdlib.3o: $(ALL_COMPILED_DOC) | build/man + $(OCAMLDOC_RUN) -man -d build/man -man-mini \ + -nostdlib -hide Stdlib -lib Stdlib -t "OCaml library" \ + $(addprefix -load , $(ALL_COMPILED_DOC)) + +HTML_OPTIONS= -charset="utf8" -colorize-code -nonavbar + +build/html/libref/Stdlib.html: $(ALL_LIBREF:%=build/%.odoc) | build/html/libref + $(OCAMLDOC_RUN) -html -d build/html/libref \ + $(HTML_OPTIONS) \ + -nostdlib -hide Stdlib -lib Stdlib -t "OCaml library" \ + $(addprefix -load , $(ALL_LIBREF:%=build/%.odoc)) + +build/html/compilerlibref/Compiler_libs.html: \ + $(ALL_COMPILERLIBREF:%=build/%.odoc) | build/html/compilerlibref + $(OCAMLDOC_RUN) -html -d build/html/compilerlibref \ + -nostdlib -hide Stdlib -t "OCaml compiler library" \ + $(HTML_OPTIONS) \ + -intro $(DOCGEN)/build/Compiler_libs.mld \ + $(addprefix -load , $(ALL_COMPILERLIBREF:%=build/%.odoc)) + +build/texi/stdlib.texi: $(ALL_COMPILED_DOC) | build/texi + $(OCAMLDOC_RUN) -texi -o $@ \ + -nostdlib -hide Stdlib -lib Stdlib -t "OCaml library" \ + $(addprefix -load , $(ALL_COMPILED_DOC)) + +build/latex/Stdlib.tex: $(ALL_COMPILED_DOC) | build/latex + $(OCAMLDOC_RUN) -latex -o build/latex/all.tex \ + -hide Stdlib -lib Stdlib $(DOC_ALL_INCLUDES) \ + -sepfiles \ + -latextitle "1,subsection*" \ + -latextitle "2,subsubsection*" \ + -latex-type-prefix "TYP" \ + -latex-module-prefix "" \ + -latex-module-type-prefix "" \ + -latex-value-prefix "" \ + -nostdlib -hide Stdlib -lib Stdlib -t "OCaml library" \ + $(addprefix -load , $(ALL_COMPILED_DOC)) + +build/latex/alldoc.pdf: build/latex/Stdlib.tex build/latex/alldoc.tex \ + | build/latex + cd build/latex && \ + TEXINPUTS=$${TEXINPUTS}:$(ROOTDIR)/ocamldoc pdflatex alldoc + cd build/latex && \ + TEXINPUTS=$${TEXINPUTS}:$(ROOTDIR)/ocamldoc pdflatex alldoc + +stdlib_INPUT=$(foreach module,\ +$(filter-out stdlib.mli camlinternal%,$(stdlib_UNPREFIXED)),\ +\\input{$(call capitalize,$(module)).tex}\ +) +build/latex/stdlib_input.tex: | build/latex + echo $(stdlib_INPUT) > $@ + +compilerlibs_INPUT=$(foreach module,\ +$(filter-out camlinternal%,$(compilerlibref)),\ +\\input{$(call capitalize,$(module)).tex}) +build/latex/compilerlibs_input.tex: | build/latex + echo $(compilerlibs_INPUT) > $@ + +INSTALL_MANODIR=$(INSTALL_MANDIR)/man3 +.PHONY:install +install: + $(MKDIR) "$(INSTALL_MANODIR)" + if test -d build/man; then \ + $(INSTALL_DATA) build/man/*.3o "$(INSTALL_MANODIR)"; \ + else : ; fi diff --git a/api_docgen/odoc/Makefile b/api_docgen/odoc/Makefile new file mode 100644 index 00000000..5c22a15b --- /dev/null +++ b/api_docgen/odoc/Makefile @@ -0,0 +1,193 @@ +#************************************************************************** +#* * +#* OCaml * +#* * +#* Florian Angeletti, projet Cambium, Inria Paris * +#* * +#* Copyright 2020 Institut National de Recherche en Informatique et * +#* en Automatique. * +#* * +#* All rights reserved. This file is distributed under the terms of * +#* the GNU Lesser General Public License version 2.1, with the * +#* special exception on linking described in the file LICENSE. * +#* * +#************************************************************************** +include $(ROOTDIR)/api_docgen/Makefile.common + +vpath %.cmti $(ROOTDIR)/stdlib $(DOC_COMPILERLIBS_DIRS) $(DOC_STDLIB_DIRS) +vpath %.cmt $(ROOTDIR)/stdlib + +ifeq ($(DOCUMENTATION_TOOL),odoc) + odoc ?= $(DOCUMENTATION_TOOL_CMD) +else + odoc ?= odoc +endif + +libref = $(STDLIB) $(otherlibref) + +# odoc needs a "page-" prefix for a mld documentation file +define page_name + $(dir $1)page-$(notdir $1) +endef + +define stdlib_prefix + $(if $(filter-out stdlib camlinternal%,$1),\ + Stdlib.$(call capitalize,$1),\ + $(call capitalize, $1)) +endef + +# define the right conditional for the manual +build/latex/ifocamldoc.tex: | build/latex + printf '\\newif\ifocamldoc\ocamldocfalse\n' > $@ + + +# \input{} all modules in the stdlib for the latex api manual +stdlib_INPUT= $(foreach module,\ +$(filter-out stdlib camlinternal%, $(STDLIB:stdlib__%=%)),\ +\\input{libref/Stdlib.$(call capitalize,$(module)).tex}\ +) + +build/latex/stdlib_input.tex: | build/latex + echo $(stdlib_INPUT)> $@ + +build/latex/compilerlibs_input.tex: | build/latex + echo $(compilerlibref_C:%=\\input{compilerlibref/%})> $@ + +# The build process for odoc has 3 phases: +# 1. generation of internal individual documentation files (.odoc) +# 2. generation of linked documentation files (.odocl) +# 3. generation of the actual (.tex,.html,.3o) documentation + +# rules for the mld files +$(libref_TEXT:%=build/libref/page-%.odoc): +build/libref/page-%.odoc:$(DOCGEN)/%.mld | build/libref + $(odoc) compile -I build/libref --package libref $< -o $@ + +$(compilerlibref_TEXT:%=build/compilerlibref/page-%.odoc):\ +build/compilerlibref/page-%.odoc:$(DOCGEN)/build/%.mld | build/compilerlibref + $(odoc) compile -I build/libref --package compilerlibref $< -o $@ + +# rules for the stdlib and otherlibs .doc files +$(libref:%=build/libref/%.odoc):\ +build/libref/%.odoc: %.cmti | build/libref + $(odoc) compile -I build/libref --package libref $< -o $@ + +# pervasives is handled separatedly due to the lack of cmti file +$(libref_EXTRA:%=build/libref/%.odoc):build/libref/%.odoc:%.cmt + $(odoc) compile -I build/libref --package libref $< -o $@ + +# rules for the compilerlib documentation +$(compilerlibref:%=build/compilerlibref/%.odoc):\ +build/compilerlibref/%.odoc: %.cmti $(libref:%=build/libref/%.odoc) \ +| build/compilerlibref + $(odoc) compile -I build/libref -I build/compilerlibref \ + --package compilerlibref $< -o $@ + +ALL_TEXT = $(libref_TEXT:%=libref/%) $(compilerlibref_TEXT:%=compilerlibref/%) +ALL_PAGE_TEXT=$(foreach mld,$(ALL_TEXT),$(call page_name,$(mld))) +TARGET_UNITS= \ + $(compilerlibref:%=compilerlibref/%) \ + libref/stdlib $(otherlibref:%=libref/%) \ + $(addprefix libref/,$(filter camlinternal%,$(STDLIB))) +ALL_UNITS = $(compilerlibref:%=compilerlibref/%) $(libref:%=libref/%) +ALL_PAGED_DOC = $(TARGET_UNITS) $(ALL_PAGE_TEXT) + +# rules for odocl generation +# Note that we are using a dependency on the whole phase 1 rather than tracking +# the individual file dependencies +$(ALL_UNITS:%=build/%.odocl):%.odocl:%.odoc \ + | $(ALL_PAGED_DOC:%=build/%.odoc) + $(odoc) link -I build/libref -I build/compilerlibref $< + +$(ALL_PAGE_TEXT:%=build/%.odocl):%.odocl:%.odoc \ + | $(ALL_PAGED_DOC:%=build/%.odoc) + $(odoc) link -I build/libref -I build/compilerlibref $< + +# Rules for all three backends: + +ALL_HTML = $(ALL_PAGED_DOC:%=build/%.html.stamp) +ALL_MAN = $(ALL_PAGED_DOC:%=build/%.3o.stamp) +ALL_LATEX = $(ALL_PAGED_DOC:%=build/%.tex.stamp) + +build/libref/stdlib.html.stamp: $(STDLIB:%=build/libref/%.odocl) | build/libref +build/libref/stdlib.3o.stamp: $(STDLIB:%=build/libref/%.odocl) | build/libref +build/libref/stdlib.tex.stamp: $(STDLIB:%=build/libref/%.odocl) | build/libref + +man: $(ALL_MAN) +html: $(ALL_HTML) build/html/odoc.css +html: build/libref/index.html.stamp build/compilerlibref/index.html.stamp + +# Html rules +$(ALL_HTML): %.html.stamp: %.odocl | build/html + $(odoc) html-generate --output-dir build/html $< + touch $@ + +build/html/odoc.css: | build/html + $(odoc) support-files --output-dir build/html + +$(build/libref.html.stamp build/compilerlibref.html.stamp): +%.html.stamp: %.mld | build/ + $(odoc) html-generate --output-dir build/html $< + touch $@ + +# Html indexes for the api documentation + +# The stdlib index is generated from the list of stdlib modules. +stdlib_INDEX=\ + $(foreach m,$(stdlib_UNPREFIXED),$(call stdlib_prefix,$m))\ + $(call capitalize, $(otherlibref)) +build/libref.mld: + echo {0 OCaml standard library} {!modules:$(stdlib_INDEX)} > $@ + +build/libref/index.html.stamp: $(ALL_HTML) build/libref.mld | build/libref + $(odoc) compile --package libref build/libref.mld + $(odoc) link -I build/libref build/page-libref.odoc + $(odoc) html-generate build/page-libref.odocl --output-dir build/html + mv build/html/libref/libref.html build/html/libref/index.html + touch $@ + +build/compilerlibref/index.html.stamp: $(ALL_HTML) \ + build/compilerlibref/page-Compiler_libs.html.stamp | build/compilerlibref + cp build/html/compilerlibref/Compiler_libs.html \ + build/html/compilerlibref/index.html + touch $@ + +# Latex rules + +latex: $(ALL_LATEX) + + +build/latex/alldoc.pdf: $(ALL_LATEX) build/latex/alldoc.tex \ +build/latex/stdlib_input.tex build/latex/compilerlibs_input.tex \ +| build/latex + cd build/latex && pdflatex alldoc.tex + cd build/latex && pdflatex alldoc.tex + +# We include children pages directly except for the root Stdlib module +NOT_STDLIB=$(filter-out libref/stdlib,$(ALL_PAGED_DOC)) +$(NOT_STDLIB:%=build/%.tex.stamp):\ +build/%.tex.stamp: build/%.odocl | build/ + $(odoc) latex-generate --with-children=true --output-dir build/latex $< + touch $@ + +# Stdlib latex page: we manually integrate stdlib module +build/libref/stdlib.tex.stamp: build/libref/stdlib.odocl | build/libref + $(odoc) latex-generate --with-children=false --output-dir build/latex $< + touch $@ + +# Man pages +$(ALL_PAGED_DOC:%=build/%.3o.stamp):build/%.3o.stamp:build/%.odocl | build/ + $(odoc) man-generate --output-dir build/man $< + touch $@ + +# Man pages are the only installed documentation +INSTALL_MANODIR=$(INSTALL_MANDIR)/man3 +.PHONY:install +install: + $(MKDIR) "$(INSTALL_MANODIR)" + if test -d build/man/libref ; then \ + $(INSTALL_DATA) build/man/libref/* "$(INSTALL_MANODIR)"; \ + else : ; fi + if test -d build/man/compilerlibref ; then \ + $(INSTALL_DATA) build/man/libref/* "$(INSTALL_MANODIR)"; \ + else : ; fi diff --git a/appveyor.yml b/appveyor.yml index e87600b5..719be706 100644 --- a/appveyor.yml +++ b/appveyor.yml @@ -26,11 +26,21 @@ environment: CYG_ROOT: C:/cygwin64 CYG_MIRROR: http://mirrors.kernel.org/sourceware/cygwin/ CYG_CACHE: C:/cygwin64/var/cache/setup - FLEXDLL_VERSION: 0.38 + FLEXDLL_VERSION: 0.39 OCAMLRUNPARAM: v=0,b + FORCE_CYGWIN_UPGRADE: 0 + BUILD_MODE: world.opt matrix: - PORT: mingw32 + BOOTSTRAP_FLEXDLL: true - PORT: msvc64 + BOOTSTRAP_FLEXDLL: false + BUILD_MODE: steps + - PORT: msvc32 + BOOTSTRAP_FLEXDLL: false + BUILD_MODE: C + SDK: |- + "C:\Program Files\Microsoft SDKs\Windows\v7.1\Bin\SetEnv.cmd" /x86 matrix: fast_finish: true diff --git a/asmcomp/CSEgen.ml b/asmcomp/CSEgen.ml index 7ba1a1c2..2f54a35c 100644 --- a/asmcomp/CSEgen.ml +++ b/asmcomp/CSEgen.ml @@ -25,7 +25,7 @@ type valnum = int type op_class = | Op_pure (* pure arithmetic, produce one or several result *) | Op_checkbound (* checkbound-style: no result, can raise an exn *) - | Op_load (* memory load *) + | Op_load of Asttypes.mutable_flag (* memory load *) | Op_store of bool (* memory store, false = init, true = assign *) | Op_other (* anything else that does not allocate nor store in memory *) @@ -40,29 +40,30 @@ module Equations = struct Map.Make(struct type t = rhs let compare = Stdlib.compare end) type 'a t = - { load_equations : 'a Rhs_map.t; + { mutable_load_equations : 'a Rhs_map.t; other_equations : 'a Rhs_map.t } let empty = - { load_equations = Rhs_map.empty; + { mutable_load_equations = Rhs_map.empty; other_equations = Rhs_map.empty } let add op_class op v m = match op_class with - | Op_load -> - { m with load_equations = Rhs_map.add op v m.load_equations } + | Op_load Mutable -> + { m with mutable_load_equations = + Rhs_map.add op v m.mutable_load_equations } | _ -> { m with other_equations = Rhs_map.add op v m.other_equations } let find op_class op m = match op_class with - | Op_load -> - Rhs_map.find op m.load_equations + | Op_load Mutable -> + Rhs_map.find op m.mutable_load_equations | _ -> Rhs_map.find op m.other_equations - let remove_loads m = - { load_equations = Rhs_map.empty; + let remove_mutable_loads m = + { mutable_load_equations = Rhs_map.empty; other_equations = m.other_equations } end @@ -190,8 +191,8 @@ let set_unknown_regs n rs = (* Keep only the equations satisfying the given predicate. *) -let remove_load_numbering n = - { n with num_eqs = Equations.remove_loads n.num_eqs } +let remove_mutable_load_numbering n = + { n with num_eqs = Equations.remove_mutable_loads n.num_eqs } (* Forget everything we know about registers of type [Addr]. *) @@ -223,11 +224,11 @@ method class_of_operation op = | Imove | Ispill | Ireload -> assert false (* treated specially *) | Iconst_int _ | Iconst_float _ | Iconst_symbol _ -> Op_pure | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ -> assert false (* treated specially *) + | Iextcall _ | Iopaque -> assert false (* treated specially *) | Istackoffset _ -> Op_other - | Iload(_,_) -> Op_load + | Iload(_,_,mut) -> Op_load mut | Istore(_,_,asg) -> Op_store asg - | Ialloc _ -> assert false (* treated specially *) + | Ialloc _ | Ipoll _ -> assert false (* treated specially *) | Iintop(Icheckbound) -> Op_checkbound | Iintop _ -> Op_pure | Iintop_imm(Icheckbound, _) -> Op_checkbound @@ -235,7 +236,6 @@ method class_of_operation op = | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Ifloatofint | Iintoffloat -> Op_pure | Ispecific _ -> Op_other - | Iname_for_debugger _ -> Op_pure (* Operations that are so cheap that it isn't worth factoring them. *) @@ -244,11 +244,11 @@ method is_cheap_operation op = | Iconst_int _ -> true | _ -> false -(* Forget all equations involving memory loads. Performed after a - non-initializing store *) +(* Forget all equations involving mutable memory loads. + Performed after a non-initializing store *) method private kill_loads n = - remove_load_numbering n + remove_mutable_load_numbering n (* Perform CSE on the given instruction [i] and its successors. [n] is the value numbering current at the beginning of [i]. *) @@ -277,23 +277,26 @@ method private cse n i = arguments is always a memory load. For simplicity, we just forget everything. *) {i with next = self#cse empty_numbering i.next} - | Iop (Ialloc _) -> + | Iop Iopaque -> + (* Assume arbitrary side effects from Iopaque *) + {i with next = self#cse empty_numbering i.next} + | Iop (Ialloc _) | Iop (Ipoll _) -> (* For allocations, we must avoid extending the live range of a pseudoregister across the allocation if this pseudoreg is a derived heap pointer (a pointer into the heap that does not point to the beginning of a Caml block). PR#6484 is an example of this situation. Such pseudoregs have type [Addr]. Pseudoregs with types other than [Addr] can be kept. - Moreover, allocation can trigger the asynchronous execution + Moreover, allocations and polls can trigger the asynchronous execution of arbitrary Caml code (finalizer, signal handler, context switch), which can contain non-initializing stores. - Hence, all equations over loads must be removed. *) + Hence, all equations over mutable loads must be removed. *) let n1 = kill_addr_regs (self#kill_loads n) in let n2 = set_unknown_regs n1 i.res in {i with next = self#cse n2 i.next} | Iop op -> begin match self#class_of_operation op with - | (Op_pure | Op_checkbound | Op_load) as op_class -> + | (Op_pure | Op_checkbound | Op_load _) as op_class -> let (n1, varg) = valnum_regs n i.arg in let n2 = set_unknown_regs n1 (Proc.destroyed_at_oper i.desc) in begin match find_equation op_class n1 (op, varg) with @@ -331,7 +334,7 @@ method private cse n i = {i with next = self#cse n2 i.next} | Op_store true -> (* A non-initializing store can invalidate - anything we know about prior loads. *) + anything we know about prior mutable loads. *) let n1 = set_unknown_regs n (Proc.destroyed_at_oper i.desc) in let n2 = set_unknown_regs n1 i.res in let n3 = self#kill_loads n2 in diff --git a/asmcomp/CSEgen.mli b/asmcomp/CSEgen.mli index c80e7b4c..26e93e91 100644 --- a/asmcomp/CSEgen.mli +++ b/asmcomp/CSEgen.mli @@ -19,7 +19,7 @@ type op_class = | Op_pure (* pure, produce one result *) | Op_checkbound (* checkbound-style: no result, can raise an exn *) - | Op_load (* memory load *) + | Op_load of Asttypes.mutable_flag (* memory load *) | Op_store of bool (* memory store, false = init, true = assign *) | Op_other (* anything else that does not allocate nor store in memory *) diff --git a/asmcomp/amd64/CSE.ml b/asmcomp/amd64/CSE.ml index 60503d69..b473e7b2 100644 --- a/asmcomp/amd64/CSE.ml +++ b/asmcomp/amd64/CSE.ml @@ -30,7 +30,7 @@ method! class_of_operation op = | Ilea _ | Isextend32 | Izextend32 -> Op_pure | Istore_int(_, _, is_asg) -> Op_store is_asg | Ioffset_loc(_, _) -> Op_store true - | Ifloatarithmem _ | Ifloatsqrtf _ -> Op_load + | Ifloatarithmem _ | Ifloatsqrtf _ -> Op_load Mutable | Ibswap _ | Isqrtf -> super#class_of_operation op end | _ -> super#class_of_operation op diff --git a/asmcomp/amd64/arch.ml b/asmcomp/amd64/arch.ml index 581db3db..0d0c5406 100644 --- a/asmcomp/amd64/arch.ml +++ b/asmcomp/amd64/arch.ml @@ -134,7 +134,20 @@ let print_specific_operation printreg op ppf arg = | Izextend32 -> fprintf ppf "zextend32 %a" printreg arg.(0) +(* Are we using the Windows 64-bit ABI? *) + let win64 = match Config.system with | "win64" | "mingw64" | "cygwin" -> true | _ -> false + +(* Specific operations that are pure *) + +let operation_is_pure = function + | Ilea _ | Ibswap _ | Isqrtf | Isextend32 | Izextend32 -> true + | Ifloatarithmem _ | Ifloatsqrtf _ -> true + | _ -> false + +(* Specific operations that can raise *) + +let operation_can_raise _ = false diff --git a/asmcomp/amd64/emit.mlp b/asmcomp/amd64/emit.mlp index 06988c67..123e2d07 100644 --- a/asmcomp/amd64/emit.mlp +++ b/asmcomp/amd64/emit.mlp @@ -23,6 +23,7 @@ open Reg open Mach open Linear open Emitaux +open Emitenv open X86_ast open X86_proc @@ -67,35 +68,24 @@ let emit_debug_info dbg = let fp = Config.with_frame_pointers -(* Tradeoff between code size and code speed *) - -let fastcode_flag = ref true - -(* Layout of the stack frame *) -let stack_offset = ref 0 - -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false - -let frame_required = ref false - -let frame_size () = (* includes return address *) - if !frame_required then begin +let frame_size env = (* includes return address *) + if env.f.fun_frame_required then begin let sz = - (!stack_offset + 8 * (num_stack_slots.(0) + num_stack_slots.(1)) + 8 + (env.stack_offset + + 8 * (env.f.fun_num_stack_slots.(0) + env.f.fun_num_stack_slots.(1)) + + 8 + (if fp then 8 else 0)) in Misc.align sz 16 end else - !stack_offset + 8 + env.stack_offset + 8 -let slot_offset loc cl = +let slot_offset env loc cl = match loc with - | Incoming n -> frame_size() + n + | Incoming n -> (frame_size env) + n | Local n -> if cl = 0 - then !stack_offset + n * 8 - else !stack_offset + (num_stack_slots.(0) + n) * 8 + then env.stack_offset + n * 8 + else env.stack_offset + (env.f.fun_num_stack_slots.(0) + n) * 8 | Outgoing n -> n (* Symbols *) @@ -175,19 +165,19 @@ let label s = sym (emit_label s) let def_label ?typ s = D.label ?typ (emit_label s) -let emit_Llabel fallthrough lbl = - if not fallthrough && !fastcode_flag then D.align 4; +let emit_Llabel env fallthrough lbl = + if not fallthrough && env.f.fun_fast then D.align 4; def_label lbl (* Output a pseudo-register *) -let reg = function +let reg env = function | { loc = Reg.Reg r } -> register_name r | { loc = Stack s; typ = Float } as r -> - let ofs = slot_offset s (register_class r) in + let ofs = slot_offset env s (register_class r) in mem64 REAL8 ofs RSP | { loc = Stack s } as r -> - let ofs = slot_offset s (register_class r) in + let ofs = slot_offset env s (register_class r) in mem64 QWORD ofs RSP | { loc = Unknown } -> assert false @@ -196,31 +186,22 @@ let reg64 = function | { loc = Reg.Reg r } -> int_reg_name.(r) | _ -> assert false - -let res i n = reg i.res.(n) - -let arg i n = reg i.arg.(n) - +let arg env i n = reg env i.arg.(n) +let res env i n = reg env i.res.(n) (* Output a reference to the lower 8, 16 or 32 bits of a register *) let reg_low_8_name = Array.map (fun r -> Reg8L r) int_reg_name let reg_low_16_name = Array.map (fun r -> Reg16 r) int_reg_name let reg_low_32_name = Array.map (fun r -> Reg32 r) int_reg_name -let emit_subreg tbl typ r = +let emit_subreg env tbl typ r = match r.loc with | Reg.Reg r when r < 13 -> tbl.(r) - | Stack s -> mem64 typ (slot_offset s (register_class r)) RSP + | Stack s -> mem64 typ (slot_offset env s (register_class r)) RSP | _ -> assert false -let arg8 i n = emit_subreg reg_low_8_name BYTE i.arg.(n) -let arg16 i n = emit_subreg reg_low_16_name WORD i.arg.(n) -let arg32 i n = emit_subreg reg_low_32_name DWORD i.arg.(n) let arg64 i n = reg64 i.arg.(n) -let res16 i n = emit_subreg reg_low_16_name WORD i.res.(n) -let res32 i n = emit_subreg reg_low_32_name DWORD i.res.(n) - (* Output an addressing mode *) let addressing addr typ i n = @@ -241,7 +222,7 @@ let addressing addr typ i n = (* Record live pointers at call points -- see Emitaux *) -let record_frame_label live dbg = +let record_frame_label env live dbg = let lbl = new_label () in let live_offset = ref [] in Reg.Set.iter @@ -249,60 +230,40 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> () ) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; lbl -let record_frame live dbg = - let lbl = record_frame_label live dbg in +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in def_label lbl -(* Record calls to the GC -- we've moved them out of the way *) - -type gc_call = - { gc_lbl: label; (* Entry label *) - gc_return_lbl: label; (* Where to branch after GC *) - gc_frame: label; (* Label of frame descriptor *) - } - -let call_gc_sites = ref ([] : gc_call list) - let emit_call_gc gc = def_label gc.gc_lbl; emit_call "caml_call_gc"; - def_label gc.gc_frame; + def_label gc.gc_frame_lbl; I.jmp (label gc.gc_return_lbl) -(* Record calls to caml_ml_array_bound_error. - In -g mode we maintain one call to - caml_ml_array_bound_error per bound check site. Without -g, we can share - a single call. *) - -type bound_error_call = - { bd_lbl: label; (* Entry label *) - bd_frame: label; (* Label of frame descriptor *) - (* As for [gc_call]. *) - } - -let bound_error_sites = ref ([] : bound_error_call list) -let bound_error_call = ref 0 - -let bound_error_label dbg = +let bound_error_label env dbg = if !Clflags.debug then begin let lbl_bound_error = new_label() in - let lbl_frame = record_frame_label Reg.Set.empty (Dbg_other dbg) in - bound_error_sites := - { bd_lbl = lbl_bound_error; bd_frame = lbl_frame; } :: !bound_error_sites; + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- { bd_lbl = lbl_bound_error; bd_frame = lbl_frame; } + :: env.bound_error_sites; lbl_bound_error end else begin - if !bound_error_call = 0 then bound_error_call := new_label(); - !bound_error_call + match env.bound_error_call with + | None -> + let lbl = new_label () in + env.bound_error_call <- Some lbl; + lbl + | Some lbl -> lbl end let emit_call_bound_error bd = @@ -310,12 +271,13 @@ let emit_call_bound_error bd = emit_call "caml_ml_array_bound_error"; def_label bd.bd_frame -let emit_call_bound_errors () = - List.iter emit_call_bound_error !bound_error_sites; - if !bound_error_call > 0 then begin - def_label !bound_error_call; +let emit_call_bound_errors env = + List.iter emit_call_bound_error env.bound_error_sites; + match env.bound_error_call with + | Some lbl -> + def_label lbl; emit_call "caml_ml_array_bound_error" - end + | None -> () (* Names for instructions *) @@ -354,14 +316,15 @@ let cond = function (* Output an = 0 or <> 0 test. *) -let output_test_zero arg = +let output_test_zero env arg = match arg.loc with - | Reg.Reg _ -> I.test (reg arg) (reg arg) - | _ -> I.cmp (int 0) (reg arg) + | Reg.Reg _ -> I.test (reg env arg) (reg env arg) + | _ -> I.cmp (int 0) (reg env arg) (* Output a floating-point compare and branch *) -let emit_float_test cmp i lbl = +let emit_float_test env cmp i lbl = + let arg = arg env in (* Effect of comisd on flags and conditional branches: ZF PF CF cond. branches taken unordered 1 1 1 je, jb, jbe, jp @@ -409,9 +372,9 @@ let emit_float_test cmp i lbl = (* Deallocate the stack frame before a return or tail call *) -let output_epilogue f = - if !frame_required then begin - let n = frame_size() - 8 - (if fp then 8 else 0) in +let output_epilogue env f = + if env.f.fun_frame_required then begin + let n = (frame_size env) - 8 - (if fp then 8 else 0) in if n <> 0 then begin I.add (int n) rsp; @@ -471,25 +434,27 @@ let emit_named_text_section func_name = (* Output the assembly code for an instruction *) -(* Name of current function *) -let function_name = ref "" -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 - (* Emit an instruction *) -let emit_instr fallthrough i = +let emit_instr env fallthrough i = + let arg8 i n = emit_subreg env reg_low_8_name BYTE i.arg.(n) in + let arg16 i n = emit_subreg env reg_low_16_name WORD i.arg.(n) in + let arg32 i n = emit_subreg env reg_low_32_name DWORD i.arg.(n) in + let res16 i n = emit_subreg env reg_low_16_name WORD i.res.(n) in + let res32 i n = emit_subreg env reg_low_32_name DWORD i.res.(n) in + let arg = arg env in + let res = res env in emit_debug_info i.dbg; match i.desc with | Lend -> () | Lprologue -> - assert (!prologue_required); + assert (env.f.fun_prologue_required); if fp then begin I.push rbp; cfi_adjust_cfa_offset 8; I.mov rsp rbp; end; - if !frame_required then begin - let n = frame_size() - 8 - (if fp then 8 else 0) in + if env.f.fun_frame_required then begin + let n = (frame_size env) - 8 - (if fp then 8 else 0) in if n <> 0 then begin I.sub (int n) rsp; @@ -500,9 +465,9 @@ let emit_instr fallthrough i = let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then begin match src.typ, src.loc, dst.loc with - | Float, Reg.Reg _, Reg.Reg _ -> I.movapd (reg src) (reg dst) - | Float, _, _ -> I.movsd (reg src) (reg dst) - | _ -> I.mov (reg src) (reg dst) + | Float, Reg.Reg _, Reg.Reg _ -> I.movapd (reg env src) (reg env dst) + | Float, _, _ -> I.movsd (reg env src) (reg env dst) + | _ -> I.mov (reg env src) (reg env dst) end | Lop(Iconst_int n) -> if n = 0n then begin @@ -536,19 +501,19 @@ let emit_instr fallthrough i = load_symbol_addr s (res i 0) | Lop(Icall_ind) -> I.call (arg i 0); - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Icall_imm { func; }) -> add_used_symbol func; emit_call func; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Itailcall_ind) -> - output_epilogue (fun () -> I.jmp (arg i 0)) + output_epilogue env (fun () -> I.jmp (arg i 0)) | Lop(Itailcall_imm { func; }) -> begin - if func = !function_name then - I.jmp (label !tailrec_entry_point) + if func = env.f.fun_name then + I.jmp (label env.f.fun_tailrec_entry_point_label) else begin - output_epilogue begin fun () -> + output_epilogue env begin fun () -> add_used_symbol func; emit_jump func end @@ -559,7 +524,7 @@ let emit_instr fallthrough i = if alloc then begin load_symbol_addr func rax; emit_call "caml_c_call"; - record_frame i.live (Dbg_other i.dbg); + record_frame env i.live (Dbg_other i.dbg); if system <> S_win64 then begin (* TODO: investigate why such a diff. This comes from: @@ -580,8 +545,8 @@ let emit_instr fallthrough i = then I.sub (int n) rsp; if n <> 0 then cfi_adjust_cfa_offset n; - stack_offset := !stack_offset + n - | Lop(Iload(chunk, addr)) -> + env.stack_offset <- env.stack_offset + n + | Lop(Iload(chunk, addr, _mut)) -> let dest = res i 0 in begin match chunk with | Word_int | Word_val -> @@ -621,21 +586,21 @@ let emit_instr fallthrough i = end | Lop(Ialloc { bytes = n; dbginfo }) -> assert (n <= (Config.max_young_wosize + 1) * Arch.size_addr); - if !fastcode_flag then begin + if env.f.fun_fast then begin I.sub (int n) r15; I.cmp (domain_field Domainstate.Domain_young_limit) r15; let lbl_call_gc = new_label() in let lbl_frame = - record_frame_label i.live (Dbg_alloc dbginfo) + record_frame_label env i.live (Dbg_alloc dbginfo) in I.jb (label lbl_call_gc); let lbl_after_alloc = new_label() in def_label lbl_after_alloc; I.lea (mem64 NONE 8 R15) (res i 0); - call_gc_sites := + env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; - gc_frame = lbl_frame; } :: !call_gc_sites + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites end else begin begin match n with | 16 -> emit_call "caml_alloc1" @@ -645,10 +610,31 @@ let emit_instr fallthrough i = I.sub (int n) r15; emit_call "caml_allocN" end; - let label = record_frame_label i.live (Dbg_alloc dbginfo) in + let label = record_frame_label env i.live (Dbg_alloc dbginfo) in def_label label; I.lea (mem64 NONE 8 R15) (res i 0) end + | Lop(Ipoll { return_label }) -> + I.cmp (domain_field Domainstate.Domain_young_limit) r15; + let gc_call_label = new_label () in + let lbl_after_poll = match return_label with + | None -> new_label() + | Some(lbl) -> lbl in + let lbl_frame = + record_frame_label env i.live (Dbg_alloc []) + in + begin match return_label with + | None -> I.jbe (label gc_call_label) + | Some return_label -> I.ja (label return_label) + end; + env.call_gc_sites <- + { gc_lbl = gc_call_label; + gc_return_lbl = lbl_after_poll; + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites; + begin match return_label with + | None -> def_label lbl_after_poll + | Some _ -> I.jmp (label gc_call_label) + end | Lop(Iintop(Icomp cmp)) -> I.cmp (arg i 1) (arg i 0); I.set (cond cmp) al; @@ -658,11 +644,11 @@ let emit_instr fallthrough i = I.set (cond cmp) al; I.movzx al (res i 0) | Lop(Iintop (Icheckbound)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in I.cmp (arg i 1) (arg i 0); I.jbe (label lbl) | Lop(Iintop_imm(Icheckbound, n)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in I.cmp (int n) (arg i 0); I.jbe (label lbl) | Lop(Iintop(Idiv | Imod)) -> @@ -695,6 +681,8 @@ let emit_instr fallthrough i = I.cvtsi2sd (arg i 0) (res i 0) | Lop(Iintoffloat) -> I.cvttsd2si (arg i 0) (res i 0) + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific(Ilea addr)) -> I.lea (addressing addr NONE i 0) (res i 0) | Lop(Ispecific(Istore_int(n, addr, _))) -> @@ -724,38 +712,37 @@ let emit_instr fallthrough i = I.movsxd (arg32 i 0) (res i 0) | Lop(Ispecific(Izextend32)) -> I.mov (arg32 i 0) (res32 i 0) - | Lop (Iname_for_debugger _) -> () | Lreloadretaddr -> () | Lreturn -> - output_epilogue begin fun () -> + output_epilogue env begin fun () -> I.ret () end | Llabel lbl -> - emit_Llabel fallthrough lbl + emit_Llabel env fallthrough lbl | Lbranch lbl -> I.jmp (label lbl) | Lcondbranch(tst, lbl) -> let lbl = label lbl in begin match tst with | Itruetest -> - output_test_zero i.arg.(0); + output_test_zero env i.arg.(0); I.jne lbl | Ifalsetest -> - output_test_zero i.arg.(0); + output_test_zero env i.arg.(0); I.je lbl | Iinttest cmp -> I.cmp (arg i 1) (arg i 0); I.j (cond cmp) lbl | Iinttest_imm((Isigned Ceq | Isigned Cne | Iunsigned Ceq | Iunsigned Cne) as cmp, 0) -> - output_test_zero i.arg.(0); + output_test_zero env i.arg.(0); I.j (cond cmp) lbl | Iinttest_imm(cmp, n) -> I.cmp (int n) (arg i 0); I.j (cond cmp) lbl | Ifloattest cmp -> - emit_float_test cmp i lbl + emit_float_test env cmp i lbl | Ioddtest -> I.test (int 1) (arg8 i 0); I.jne lbl @@ -789,15 +776,16 @@ let emit_instr fallthrough i = then (phys_reg 4 (*rdx*), phys_reg 0 (*rax*)) else (phys_reg 0 (*rax*), phys_reg 4 (*rdx*)) in - I.lea (mem64_rip NONE lbl) (reg tmp1); + I.lea (mem64_rip NONE lbl) (reg env tmp1); I.movsxd (mem64 DWORD 0 (arg64 i 0) ~scale:4 ~base:(reg64 tmp1)) - (reg tmp2); - I.add (reg tmp2) (reg tmp1); - I.jmp (reg tmp1); + (reg env tmp2); + I.add (reg env tmp2) (reg env tmp1); + I.jmp (reg env tmp1); begin match system with | S_mingw64 | S_cygwin -> D.section [".rdata"] (Some "dr") [] - | S_macosx | S_win64 -> () (* with LLVM/OS X and MASM, use the text segment *) + | S_macosx | S_win64 -> () + (* with LLVM/OS X and MASM, use the text segment *) | _ -> D.section [".rodata"] None [] end; D.align 4; @@ -806,14 +794,14 @@ let emit_instr fallthrough i = D.long (ConstSub (ConstLabel(emit_label jumptbl.(i)), ConstLabel lbl)) done; - emit_named_text_section !function_name + emit_named_text_section env.f.fun_name | Lentertrap -> () | Ladjust_trap_depth { delta_traps; } -> (* each trap occupies 16 bytes on the stack *) let delta = 16 * delta_traps in cfi_adjust_cfa_offset delta; - stack_offset := !stack_offset + delta + env.stack_offset <- env.stack_offset + delta | Lpushtrap { lbl_handler; } -> let load_label_addr s arg = if !Clflags.pic_code then @@ -827,22 +815,22 @@ let emit_instr fallthrough i = I.push (domain_field Domainstate.Domain_exception_pointer); cfi_adjust_cfa_offset 8; I.mov rsp (domain_field Domainstate.Domain_exception_pointer); - stack_offset := !stack_offset + 16; + env.stack_offset <- env.stack_offset + 16; | Lpoptrap -> I.pop (domain_field Domainstate.Domain_exception_pointer); cfi_adjust_cfa_offset (-8); I.add (int 8) rsp; cfi_adjust_cfa_offset (-8); - stack_offset := !stack_offset - 16 + env.stack_offset <- env.stack_offset - 16 | Lraise k -> begin match k with | Lambda.Raise_regular -> I.mov (int 0) (domain_field Domainstate.Domain_backtrace_pos); emit_call "caml_raise_exn"; - record_frame Reg.Set.empty (Dbg_raise i.dbg) + record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_reraise -> emit_call "caml_raise_exn"; - record_frame Reg.Set.empty (Dbg_raise i.dbg) + record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_notrace -> I.mov (domain_field Domainstate.Domain_exception_pointer) rsp; I.pop (domain_field Domainstate.Domain_exception_pointer); @@ -850,32 +838,21 @@ let emit_instr fallthrough i = I.jmp r11 end -let rec emit_all fallthrough i = +let rec emit_all env fallthrough i = match i.desc with | Lend -> () | _ -> - emit_instr fallthrough i; - emit_all (Linear.has_fallthrough i.desc) i.next + emit_instr env fallthrough i; + emit_all env (Linear.has_fallthrough i.desc) i.next let all_functions = ref [] (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - stack_offset := 0; - call_gc_sites := []; - bound_error_sites := []; - bound_error_call := 0; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - prologue_required := fundecl.fun_prologue_required; - frame_required := fundecl.fun_frame_required; + let env = mk_env fundecl in all_functions := fundecl :: !all_functions; - emit_named_text_section !function_name; + emit_named_text_section fundecl.fun_name; D.align 16; add_def_symbol fundecl.fun_name; if system = S_macosx @@ -888,11 +865,11 @@ let fundecl fundecl = D.label (emit_symbol fundecl.fun_name); emit_debug_info fundecl.fun_dbg; cfi_startproc (); - emit_all true fundecl.fun_body; - List.iter emit_call_gc !call_gc_sites; - emit_call_bound_errors (); - if !frame_required then begin - let n = frame_size() - 8 - (if fp then 8 else 0) in + emit_all env true fundecl.fun_body; + List.iter emit_call_gc env.call_gc_sites; + emit_call_bound_errors env; + if fundecl.fun_frame_required then begin + let n = (frame_size env) - 8 - (if fp then 8 else 0) in if n <> 0 then begin cfi_adjust_cfa_offset (-n); diff --git a/asmcomp/amd64/proc.ml b/asmcomp/amd64/proc.ml index b44dfeb0..ed176407 100644 --- a/asmcomp/amd64/proc.ml +++ b/asmcomp/amd64/proc.ml @@ -71,9 +71,9 @@ let win64 = Arch.win64 3. C callee-saved registers. This translates to the set { r10, r11 }. These registers hence cannot be used for OCaml parameter passing and must also be marked as - destroyed across [Ialloc] (otherwise a call to caml_call_gc@PLT might - clobber these two registers before the assembly stub saves them into - the GC regs block). + destroyed across [Ialloc] and [Ipoll] (otherwise a call to + caml_call_gc@PLT might clobber these two registers before the assembly + stub saves them into the GC regs block). *) let max_arguments_for_tailcalls = 10 @@ -294,7 +294,7 @@ let destroyed_at_c_call = 100;101;102;103;104;105;106;107; 108;109;110;111;112;113;114;115]) -let destroyed_at_alloc = +let destroyed_at_alloc_or_poll = if X86_proc.use_plt then destroyed_by_plt_stub else @@ -307,7 +307,7 @@ let destroyed_at_oper = function | Iop(Iintop(Idiv | Imod)) | Iop(Iintop_imm((Idiv | Imod), _)) -> [| rax; rdx |] | Iop(Istore(Single, _, _)) -> [| rxmm15 |] - | Iop(Ialloc _) -> destroyed_at_alloc + | Iop(Ialloc _ | Ipoll _) -> destroyed_at_alloc_or_poll | Iop(Iintop(Imulh | Icomp _) | Iintop_imm((Icomp _), _)) -> [| rax |] | Iswitch(_, _) -> [| rax; rdx |] @@ -339,7 +339,7 @@ let max_register_pressure = function if fp then [| 3; 0 |] else [| 4; 0 |] | Iintop(Idiv | Imod) | Iintop_imm((Idiv | Imod), _) -> if fp then [| 10; 16 |] else [| 11; 16 |] - | Ialloc _ -> + | Ialloc _ | Ipoll _ -> if fp then [| 11 - num_destroyed_by_plt_stub; 16 |] else [| 12 - num_destroyed_by_plt_stub; 16 |] | Iintop(Icomp _) | Iintop_imm((Icomp _), _) -> @@ -348,17 +348,6 @@ let max_register_pressure = function if fp then [| 12; 15 |] else [| 13; 15 |] | _ -> if fp then [| 12; 16 |] else [| 13; 16 |] -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false - | Ispecific(Ilea _|Isextend32|Izextend32) -> true - | Ispecific _ -> false - | _ -> true - (* Layout of the stack frame *) let frame_required fd = diff --git a/asmcomp/amd64/selection.ml b/asmcomp/amd64/selection.ml index 7df0d10d..68362335 100644 --- a/asmcomp/amd64/selection.ml +++ b/asmcomp/amd64/selection.ml @@ -282,4 +282,5 @@ method! insert_op_debug env op dbg rs rd = end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = + (new selector)#emit_fundecl ~future_funcnames f diff --git a/asmcomp/arm/arch.ml b/asmcomp/arm/arch.ml index 4b884da6..ee4ca76d 100644 --- a/asmcomp/arm/arch.ml +++ b/asmcomp/arm/arch.ml @@ -262,3 +262,15 @@ let is_immediate n = s := !s + 2 done; !s <= m + +(* Specific operations that are pure *) + +let operation_is_pure = function + | Ishiftcheckbound _ -> false + | _ -> true + +(* Specific operations that can raise *) + +let operation_can_raise = function + | Ishiftcheckbound _ -> true + | _ -> false diff --git a/asmcomp/arm/emit.mlp b/asmcomp/arm/emit.mlp index e44f7652..6b49c1ac 100644 --- a/asmcomp/arm/emit.mlp +++ b/asmcomp/arm/emit.mlp @@ -25,10 +25,7 @@ open Reg open Mach open Linear open Emitaux - -(* Tradeoff between code size and code speed *) - -let fastcode_flag = ref true +open Emitenv (* Output a label *) @@ -56,44 +53,34 @@ let emit_reg = function {loc = Reg r} -> emit_string (register_name r) | _ -> fatal_error "Emit_arm.emit_reg" -(* Layout of the stack frame *) - -let stack_offset = ref 0 - -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false - -let contains_calls = ref false - -let frame_size () = +let frame_size env = let sz = - !stack_offset + - 4 * num_stack_slots.(0) + - 8 * num_stack_slots.(1) + - 8 * num_stack_slots.(2) + - (if !contains_calls then 4 else 0) + env.stack_offset + + 4 * env.f.fun_num_stack_slots.(0) + + 8 * env.f.fun_num_stack_slots.(1) + + 8 * env.f.fun_num_stack_slots.(2) + + (if env.f.fun_contains_calls then 4 else 0) in Misc.align sz 8 -let slot_offset loc cl = +let slot_offset env loc cl = match loc with Incoming n -> assert (n >= 0); - frame_size() + n + frame_size env + n | Local n -> if cl = 0 - then !stack_offset + n * 4 - else !stack_offset + num_stack_slots.(0) * 4 + n * 8 + then env.stack_offset + n * 4 + else env.stack_offset + env.f.fun_num_stack_slots.(0) * 4 + n * 8 | Outgoing n -> assert (n >= 0); n (* Output a stack reference *) -let emit_stack r = +let emit_stack env r = match r.loc with | Stack s -> - let ofs = slot_offset s (register_class r) in `[sp, #{emit_int ofs}]` + let ofs = slot_offset env s (register_class r) in `[sp, #{emit_int ofs}]` | _ -> fatal_error "Emit_arm.emit_stack" (* Output an addressing mode *) @@ -105,7 +92,7 @@ let emit_addressing addr r n = (* Record live pointers at call points *) -let record_frame_label live dbg = +let record_frame_label env live dbg = let lbl = new_label () in let live_offset = ref [] in Reg.Set.iter @@ -113,56 +100,38 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; lbl -let record_frame live dbg = - let lbl = record_frame_label live dbg in `{emit_label lbl}:` - -(* Record calls to the GC -- we've moved them out of the way *) - -type gc_call = - { gc_lbl: label; (* Entry label *) - gc_return_lbl: label; (* Where to branch after GC *) - gc_frame_lbl: label } (* Label of frame descriptor *) - -let call_gc_sites = ref ([] : gc_call list) +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in `{emit_label lbl}:` let emit_call_gc gc = `{emit_label gc.gc_lbl}: {emit_call "caml_call_gc"}\n`; `{emit_label gc.gc_frame_lbl}: b {emit_label gc.gc_return_lbl}\n` -(* Record calls to caml_ml_array_bound_error. - In debug mode, we maintain one call to caml_ml_array_bound_error - per bound check site. Otherwise, we can share a single call. *) - -type bound_error_call = - { bd_lbl: label; (* Entry label *) - bd_frame_lbl: label } (* Label of frame descriptor *) - -let bound_error_sites = ref ([] : bound_error_call list) - -let bound_error_label dbg = - if !Clflags.debug || !bound_error_sites = [] then begin +let bound_error_label env dbg = + if !Clflags.debug || env.bound_error_sites = [] then begin let lbl_bound_error = new_label() in - let lbl_frame = record_frame_label Reg.Set.empty (Dbg_other dbg) in - bound_error_sites := + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- { bd_lbl = lbl_bound_error; - bd_frame_lbl = lbl_frame } :: !bound_error_sites; + bd_frame = lbl_frame; + } :: env.bound_error_sites; lbl_bound_error end else begin - let bd = List.hd !bound_error_sites in bd.bd_lbl + let bd = List.hd env.bound_error_sites in bd.bd_lbl end let emit_call_bound_error bd = `{emit_label bd.bd_lbl}: {emit_call "caml_ml_array_bound_error"}\n`; - `{emit_label bd.bd_frame_lbl}:\n` + `{emit_label bd.bd_frame}:\n` (* Negate a comparison *) @@ -263,8 +232,8 @@ let emit_stack_adjustment n = (* Deallocate the stack frame before a return or tail call *) -let output_epilogue f = - let n = frame_size() in +let output_epilogue env f = + let n = frame_size env in if n > 0 then begin let ninstr = emit_stack_adjustment n in let ninstr = ninstr + f () in @@ -274,87 +243,68 @@ let output_epilogue f = end else f () -(* Name of current function *) -let function_name = ref "" -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 -(* Pending floating-point literals *) -let float_literals = ref ([] : (int64 * label) list) -(* Pending relative references to the global offset table *) -let gotrel_literals = ref ([] : (label * label) list) -(* Pending symbol literals *) -let symbol_literals = ref ([] : (string * label) list) -(* Total space (in words) occupied by pending literals *) -let size_literals = ref 0 - -(* Pending offset computations : {lbl; dst; src;} --> lbl: .word dst-(src+N) *) -type offset_computation = - { lbl : label; - dst : label; - src : label; - } -let offset_literals = ref ([] : offset_computation list) - (* Label a floating-point literal *) -let float_literal f = +let float_literal env fl = try - List.assoc f !float_literals + let x = List.find (fun x -> Int64.equal x.fl fl) env.float_literals in + x.lbl with Not_found -> let lbl = new_label() in - size_literals := !size_literals + 2; - float_literals := (f, lbl) :: !float_literals; + env.size_literals <- env.size_literals + 2; + env.float_literals <- { fl; lbl } :: env.float_literals; lbl (* Label a GOTREL literal *) -let gotrel_literal l = - let lbl = new_label() in - size_literals := !size_literals + 1; - gotrel_literals := (l, lbl) :: !gotrel_literals; - lbl +let gotrel_literal env lbl_pic = + let lbl_got = new_label() in + env.size_literals <- env.size_literals + 1; + env.gotrel_literals <- { lbl_got; lbl_pic } :: env.gotrel_literals; + lbl_got (* Label a symbol literal *) -let symbol_literal s = +let symbol_literal env sym = try - List.assoc s !symbol_literals + let sl = List.find (fun x -> String.equal x.sym sym) env.symbol_literals in + sl.lbl with Not_found -> let lbl = new_label() in - size_literals := !size_literals + 1; - symbol_literals := (s, lbl) :: !symbol_literals; + env.size_literals <- env.size_literals + 1; + env.symbol_literals <- { sym; lbl } :: env.symbol_literals; lbl (* Add an offset computation *) -let offset_literal dst src = +let offset_literal env dst src = let lbl = new_label() in - size_literals := !size_literals + 1; - offset_literals := { lbl; dst; src; } :: !offset_literals; + env.size_literals <- env.size_literals + 1; + env.offset_literals <- { lbl; dst; src; } :: env.offset_literals; lbl (* Emit all pending literals *) -let emit_literals() = - if !float_literals <> [] then begin +let emit_literals env = + if env.float_literals <> [] then begin ` .align 3\n`; List.iter - (fun (f, lbl) -> - `{emit_label lbl}:`; emit_float64_split_directive ".long" f) - !float_literals; - float_literals := [] + (fun {fl; lbl} -> + `{emit_label lbl}:`; emit_float64_split_directive ".long" fl) + env.float_literals; + env.float_literals <- [] end; - if !symbol_literals <> [] then begin + if env.symbol_literals <> [] then begin let offset = if !thumb then 4 else 8 in let suffix = if !Clflags.pic_code then "(GOT)" else "" in ` .align 2\n`; List.iter - (fun (l, lbl) -> - `{emit_label lbl}: .word _GLOBAL_OFFSET_TABLE_-({emit_label l}+{emit_int offset})\n`) - !gotrel_literals; + (fun { lbl_got; lbl_pic } -> + `{emit_label lbl_pic}: .word _GLOBAL_OFFSET_TABLE_-({emit_label lbl_got}+{emit_int offset})\n`) + env.gotrel_literals; List.iter - (fun (s, lbl) -> - `{emit_label lbl}: .word {emit_symbol s}{emit_string suffix}\n`) - !symbol_literals; - gotrel_literals := []; - symbol_literals := [] + (fun { sym; lbl } -> + `{emit_label lbl}: .word {emit_symbol sym}{emit_string suffix}\n`) + env.symbol_literals; + env.gotrel_literals <- []; + env.symbol_literals <- [] end; - if !offset_literals <> [] then begin + if env.offset_literals <> [] then begin (* Additions using the pc register read a value 4 or 8 bytes greater than the instruction's address, depending on the Thumb setting. However in Thumb mode we must follow interworking conventions and ensure that the @@ -365,18 +315,18 @@ let emit_literals() = List.iter (fun { lbl; dst; src; } -> `{emit_label lbl}: .word {emit_label dst}-({emit_label src}+{emit_int offset})\n`) - !offset_literals; - offset_literals := [] + env.offset_literals; + env.offset_literals <- [] end; - size_literals := 0 + env.size_literals <- 0 (* Emit code to load the address of a symbol *) -let emit_load_symbol_addr dst s = +let emit_load_symbol_addr env dst s = if !Clflags.pic_code then begin let lbl_pic = new_label() in - let lbl_got = gotrel_literal lbl_pic in - let lbl_sym = symbol_literal s in + let lbl_got = gotrel_literal env lbl_pic in + let lbl_sym = symbol_literal env s in (* Both r3 and r12 are marked as clobbered in PIC mode (cf. proc.ml), so use r12 as temporary scratch register unless the destination is r12, then we use r3 instead. *) @@ -388,12 +338,12 @@ let emit_load_symbol_addr dst s = `{emit_label lbl_pic}: add {emit_reg tmp}, pc, {emit_reg tmp}\n`; ` ldr {emit_reg dst}, [{emit_reg tmp}, {emit_reg dst}] @ {emit_symbol s}\n`; 4 - end else if !arch > ARMv6 && not !Clflags.dlcode && !fastcode_flag then begin + end else if !arch > ARMv6 && not !Clflags.dlcode && env.f.fun_fast then begin ` movw {emit_reg dst}, #:lower16:{emit_symbol s}\n`; ` movt {emit_reg dst}, #:upper16:{emit_symbol s}\n`; 2 end else begin - let lbl = symbol_literal s in + let lbl = symbol_literal env s in ` ldr {emit_reg dst}, {emit_label lbl} @ {emit_symbol s}\n`; 1 end @@ -428,10 +378,10 @@ let emit_set_condition cmp rd = end (* Emit code to load the address of a label in the lr register *) -let emit_load_handler_address handler = +let emit_load_handler_address env handler = (* PIC code *) let lbl_src = new_label() in - let lbl_offset = offset_literal handler lbl_src in + let lbl_offset = offset_literal env handler lbl_src in ` ldr lr, {emit_label lbl_offset}\n`; `{emit_label lbl_src}:\n`; ` add lr, pc, lr\n`; @@ -449,17 +399,17 @@ let emit_named_text_section func_name = (* Output the assembly code for an instruction *) -let emit_instr i = +let emit_instr env i = emit_debug_info i.dbg; match i.desc with | Lend -> 0 | Lprologue -> - assert (!prologue_required); - let n = frame_size() in + assert (env.f.fun_prologue_required); + let n = frame_size env in let num_instrs = if n > 0 then begin let num_instrs = emit_stack_adjustment (-n) in - if !contains_calls then begin + if env.f.fun_contains_calls then begin cfi_offset ~reg:14 (* lr *) ~offset:(-4); ` str lr, [sp, #{emit_int(n - 4)}]\n`; num_instrs + 1 @@ -470,7 +420,7 @@ let emit_instr i = 0 end in - `{emit_label !tailrec_entry_point}:\n`; + `{emit_label env.f.fun_tailrec_entry_point_label}:\n`; num_instrs | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in @@ -481,13 +431,13 @@ let emit_instr i = | {loc = Reg _}, {loc = Reg _} -> ` mov {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _; typ = Float}, _ -> - ` fstd {emit_reg src}, {emit_stack dst}\n` + ` fstd {emit_reg src}, {emit_stack env dst}\n` | {loc = Reg _}, _ -> - ` str {emit_reg src}, {emit_stack dst}\n` + ` str {emit_reg src}, {emit_stack env dst}\n` | {typ = Float}, _ -> - ` fldd {emit_reg dst}, {emit_stack src}\n` + ` fldd {emit_reg dst}, {emit_stack env src}\n` | _ -> - ` ldr {emit_reg dst}, {emit_stack src}\n` + ` ldr {emit_reg dst}, {emit_stack env src}\n` end; 1 end | Lop(Iconst_int n) -> @@ -500,13 +450,13 @@ let emit_instr i = and ninstr_high = emit_intconst i.res.(1) high_bits in ninstr_low + ninstr_high end else begin - let lbl = float_literal f in + let lbl = float_literal env f in ` ldr {emit_reg i.res.(0)}, {emit_label lbl}\n`; ` ldr {emit_reg i.res.(1)}, {emit_label lbl} + 4\n`; 2 end | Lop(Iconst_float f) when !fpu = VFPv2 -> - let lbl = float_literal f in + let lbl = float_literal env f in ` fldd {emit_reg i.res.(0)}, {emit_label lbl}\n`; 1 | Lop(Iconst_float f) -> @@ -528,37 +478,37 @@ let emit_instr i = end in begin match encode f with None -> - let lbl = float_literal f in + let lbl = float_literal env f in ` fldd {emit_reg i.res.(0)}, {emit_label lbl}\n` | Some imm8 -> ` fconstd {emit_reg i.res.(0)}, #{emit_int imm8}\n` end; 1 | Lop(Iconst_symbol s) -> - emit_load_symbol_addr i.res.(0) s + emit_load_symbol_addr env i.res.(0) s | Lop(Icall_ind) -> if !arch >= ARMv5 then begin ` blx {emit_reg i.arg.(0)}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n`; 1 + `{record_frame env i.live (Dbg_other i.dbg)}\n`; 1 end else begin ` mov lr, pc\n`; ` bx {emit_reg i.arg.(0)}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n`; 2 + `{record_frame env i.live (Dbg_other i.dbg)}\n`; 2 end | Lop(Icall_imm { func; }) -> ` {emit_call func}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n`; 1 + `{record_frame env i.live (Dbg_other i.dbg)}\n`; 1 | Lop(Itailcall_ind) -> - output_epilogue begin fun () -> - if !contains_calls then + output_epilogue env begin fun () -> + if env.f.fun_contains_calls then ` ldr lr, [sp, #{emit_int (-4)}]\n`; ` bx {emit_reg i.arg.(0)}\n`; 2 end | Lop(Itailcall_imm { func; }) -> - if func = !function_name then begin - ` b {emit_label !tailrec_entry_point}\n`; 1 + if func = env.f.fun_name then begin + ` b {emit_label env.f.fun_tailrec_entry_point_label}\n`; 1 end else begin - output_epilogue begin fun () -> - if !contains_calls then + output_epilogue env begin fun () -> + if env.f.fun_contains_calls then ` ldr lr, [sp, #{emit_int (-4)}]\n`; ` {emit_jump func}\n`; 2 end @@ -566,19 +516,19 @@ let emit_instr i = | Lop(Iextcall { func; alloc = false; }) -> ` {emit_call func}\n`; 1 | Lop(Iextcall { func; alloc = true; }) -> - let ninstr = emit_load_symbol_addr (phys_reg 7 (* r7 *)) func in + let ninstr = emit_load_symbol_addr env (phys_reg 7 (* r7 *)) func in ` {emit_call "caml_c_call"}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n`; + `{record_frame env i.live (Dbg_other i.dbg)}\n`; 1 + ninstr | Lop(Istackoffset n) -> assert (n mod 8 = 0); let ninstr = emit_stack_adjustment (-n) in - stack_offset := !stack_offset + n; + env.stack_offset <- env.stack_offset + n; ninstr - | Lop(Iload(Single, addr)) when !fpu >= VFPv2 -> + | Lop(Iload(Single, addr, _mut)) when !fpu >= VFPv2 -> ` flds s14, {emit_addressing addr i.arg 0}\n`; ` fcvtds {emit_reg i.res.(0)}, s14\n`; 2 - | Lop(Iload((Double | Double_u), addr)) when !fpu = Soft -> + | Lop(Iload((Double | Double_u), addr, _mut)) when !fpu = Soft -> (* Use LDM or LDRD if possible *) begin match i.res.(0), i.res.(1), addr with {loc = Reg rt}, {loc = Reg rt2}, Iindexed 0 @@ -597,7 +547,7 @@ let emit_instr i = ` ldr {emit_reg i.res.(0)}, {emit_addressing addr i.arg 0}\n` end; 2 end - | Lop(Iload(size, addr)) -> + | Lop(Iload(size, addr, _mut)) -> let r = i.res.(0) in let instr = match size with @@ -640,9 +590,9 @@ let emit_instr i = ` {emit_string instr} {emit_reg r}, {emit_addressing addr i.arg 1}\n`; 1 | Lop(Ialloc { bytes = n; dbginfo }) -> let lbl_frame = - record_frame_label i.live (Dbg_alloc dbginfo) + record_frame_label env i.live (Dbg_alloc dbginfo) in - if !fastcode_flag then begin + if env.f.fun_fast then begin let ninstr = decompose_intconst (Int32.of_int n) (fun i -> @@ -655,10 +605,10 @@ let emit_instr i = let lbl_after_alloc = new_label() in `{emit_label lbl_after_alloc}:`; ` add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; - call_gc_sites := + env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; - gc_frame_lbl = lbl_frame } :: !call_gc_sites; + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites; 4 + ninstr end else begin let ninstr = @@ -672,6 +622,11 @@ let emit_instr i = `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, alloc_ptr, #4\n`; 1 + ninstr end + | Lop(Ipoll { return_label }) -> + begin match return_label with + None -> 0 + | Some lbl -> ` b {emit_label lbl}\n`; 1 + end | Lop(Iintop(Icomp cmp)) -> ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; 1 + emit_set_condition cmp i.res.(0) @@ -679,15 +634,15 @@ let emit_instr i = ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; 1 + emit_set_condition cmp i.res.(0) | Lop(Iintop (Icheckbound)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` bls {emit_label lbl}\n`; 2 | Lop(Iintop_imm(Icheckbound, n)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in ` cmp {emit_reg i.arg.(0)}, #{emit_int n}\n`; ` bls {emit_label lbl}\n`; 2 | Lop(Ispecific(Ishiftcheckbound(shiftop, n))) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in let op = name_for_shift_operation shiftop in ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, {emit_string op} #{emit_int n}\n`; ` bcs {emit_label lbl}\n`; 2 @@ -721,6 +676,8 @@ let emit_instr i = | Lop(Iintoffloat) -> ` ftosizd s14, {emit_reg i.arg.(0)}\n`; ` fmrs {emit_reg i.res.(0)}, s14\n`; 2 + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc); 0 | Lop(Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf as op) -> let instr = (match op with Iaddf -> "faddd" @@ -770,12 +727,11 @@ let emit_instr i = | _ -> assert false end - | Lop (Iname_for_debugger _) -> 0 | Lreloadretaddr -> - let n = frame_size() in + let n = frame_size env in ` ldr lr, [sp, #{emit_int(n-4)}]\n`; 1 | Lreturn -> - output_epilogue begin fun () -> + output_epilogue env begin fun () -> ` bx lr\n`; 1 end | Llabel lbl -> @@ -884,17 +840,17 @@ let emit_instr i = (* each trap occupies 8 bytes on the stack *) let delta = 8 * delta_traps in cfi_adjust_cfa_offset delta; - stack_offset := !stack_offset + delta; 0 + env.stack_offset <- env.stack_offset + delta; 0 | Lpushtrap { lbl_handler; } -> - let s = emit_load_handler_address lbl_handler in - stack_offset := !stack_offset + 8; + let s = emit_load_handler_address env lbl_handler in + env.stack_offset <- env.stack_offset + 8; ` push \{trap_ptr, lr}\n`; cfi_adjust_cfa_offset 8; ` mov trap_ptr, sp\n`; s + 2 | Lpoptrap -> ` pop \{trap_ptr, lr}\n`; cfi_adjust_cfa_offset (-8); - stack_offset := !stack_offset - 8; 1 + env.stack_offset <- env.stack_offset - 8; 1 | Lraise k -> begin match k with | Lambda.Raise_regular -> @@ -902,10 +858,10 @@ let emit_instr i = ` mov r12, #0\n`; ` str r12, [domain_state_ptr, {emit_int offset}]\n`; ` {emit_call "caml_raise_exn"}\n`; - `{record_frame Reg.Set.empty (Dbg_raise i.dbg)}\n`; 3 + `{record_frame env Reg.Set.empty (Dbg_raise i.dbg)}\n`; 3 | Lambda.Raise_reraise -> ` {emit_call "caml_raise_exn"}\n`; - `{record_frame Reg.Set.empty (Dbg_raise i.dbg)}\n`; 1 + `{record_frame env Reg.Set.empty (Dbg_raise i.dbg)}\n`; 1 | Lambda.Raise_notrace -> ` mov sp, trap_ptr\n`; ` pop \{trap_ptr, pc}\n`; 2 @@ -925,51 +881,38 @@ let max_instruction_size i = (* Emission of an instruction sequence *) -let rec emit_all ninstr fallthrough i = +let rec emit_all env ninstr fallthrough i = (* ninstr = number of 32-bit code words emitted since last constant island *) (* fallthrough is true if previous instruction can fall through *) if i.desc = Lend then () else begin (* Make sure literals not yet emitted remain addressable, or emit them in a new constant island. *) (* fldd can address up to +/-1KB, ldr can address up to +/-4KB *) - let limit = (if !fpu >= VFPv2 && !float_literals <> [] + let limit = (if !fpu >= VFPv2 && env.float_literals <> [] then 127 else 511) in - let limit = limit - !size_literals - max_instruction_size i in + let limit = limit - env.size_literals - max_instruction_size i in let ninstr' = if ninstr >= limit - 64 && not fallthrough then begin - emit_literals(); + emit_literals env; 0 - end else if !size_literals != 0 && ninstr >= limit then begin + end else if env.size_literals != 0 && ninstr >= limit then begin let lbl = new_label() in ` b {emit_label lbl}\n`; - emit_literals(); + emit_literals env; `{emit_label lbl}:\n`; 0 end else ninstr in - let n = emit_instr i in - emit_all (ninstr' + n) (has_fallthrough i.desc) i.next + let n = emit_instr env i in + emit_all env (ninstr' + n) (has_fallthrough i.desc) i.next end (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - float_literals := []; - gotrel_literals := []; - symbol_literals := []; - stack_offset := 0; - call_gc_sites := []; - bound_error_sites := []; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - contains_calls := fundecl.fun_contains_calls; - prologue_required := fundecl.fun_prologue_required; - emit_named_text_section !function_name; + let env = mk_env fundecl in + emit_named_text_section fundecl.fun_name; ` .align 2\n`; ` .globl {emit_symbol fundecl.fun_name}\n`; if !arch > ARMv6 && !thumb then @@ -980,10 +923,10 @@ let fundecl fundecl = `{emit_symbol fundecl.fun_name}:\n`; emit_debug_info fundecl.fun_dbg; cfi_startproc(); - emit_all 0 true fundecl.fun_body; - emit_literals(); - List.iter emit_call_gc !call_gc_sites; - List.iter emit_call_bound_error !bound_error_sites; + emit_all env 0 true fundecl.fun_body; + emit_literals env; + List.iter emit_call_gc env.call_gc_sites; + List.iter emit_call_bound_error env.bound_error_sites; cfi_endproc(); ` .type {emit_symbol fundecl.fun_name}, %function\n`; ` .size {emit_symbol fundecl.fun_name}, .-{emit_symbol fundecl.fun_name}\n` diff --git a/asmcomp/arm/proc.ml b/asmcomp/arm/proc.ml index 1da4386b..11313fce 100644 --- a/asmcomp/arm/proc.ml +++ b/asmcomp/arm/proc.ml @@ -301,7 +301,8 @@ let destroyed_at_oper = function | Iop(Iintop (Icomp _) | Iintop_imm(Icomp _, _)) when !arch >= ARMv8 && !thumb -> [| phys_reg 3 |] (* r3 destroyed *) - | Iop(Iintoffloat | Ifloatofint | Iload(Single, _) | Istore(Single, _, _)) -> + | Iop(Iintoffloat | Ifloatofint + | Iload(Single, _, _) | Istore(Single, _, _)) -> [| phys_reg 107 |] (* d7 (s14-s15) destroyed *) | _ -> [||] @@ -325,20 +326,10 @@ let max_register_pressure = function | Ialloc _ -> if abi = EABI then [| 7; 0; 0 |] else [| 7; 8; 8 |] | Iconst_symbol _ when !Clflags.pic_code -> [| 7; 16; 32 |] | Iintoffloat | Ifloatofint - | Iload(Single, _) | Istore(Single, _, _) -> [| 9; 15; 31 |] + | Iload(Single, _, _) | Istore(Single, _, _) -> [| 9; 15; 31 |] | Iintop Imulh when !arch < ARMv6 -> [| 8; 16; 32 |] | _ -> [| 9; 16; 32 |] -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) - | Ispecific(Ishiftcheckbound _) -> false - | _ -> true - (* Layout of the stack *) let frame_required fd = diff --git a/asmcomp/arm/scheduling.ml b/asmcomp/arm/scheduling.ml index 9d847d4c..e7fd744a 100644 --- a/asmcomp/arm/scheduling.ml +++ b/asmcomp/arm/scheduling.ml @@ -29,7 +29,7 @@ method oper_latency = function (* Loads have a latency of two cycles in general *) Iconst_symbol _ | Iconst_float _ - | Iload(_, _) + | Iload(_, _, _) | Ireload | Ifloatofint (* mcr/mrc count as memory access *) | Iintoffloat -> 2 diff --git a/asmcomp/arm/selection.ml b/asmcomp/arm/selection.ml index 7dee0dad..c88ae354 100644 --- a/asmcomp/arm/selection.ml +++ b/asmcomp/arm/selection.ml @@ -328,4 +328,5 @@ method! insert_op_debug env op dbg rs rd = end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = + (new selector)#emit_fundecl ~future_funcnames f diff --git a/asmcomp/arm64/arch.ml b/asmcomp/arm64/arch.ml index 8d8561bc..b1a7c4d1 100644 --- a/asmcomp/arm64/arch.ml +++ b/asmcomp/arm64/arch.ml @@ -42,6 +42,7 @@ type cmm_label = int (* Do not introduce a dependency to Cmm *) type specific_operation = + | Ifar_poll of { return_label: cmm_label option } | Ifar_alloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo } | Ifar_intop_checkbound | Ifar_intop_imm_checkbound of { bound : int; } @@ -58,6 +59,7 @@ type specific_operation = | Isqrtf (* floating-point square root *) | Ibswap of int (* endianness conversion *) | Imove32 (* 32-bit integer move *) + | Isignext of int (* sign extension *) and arith_operation = Ishiftadd @@ -104,6 +106,8 @@ let print_addressing printreg addr ppf arg = let print_specific_operation printreg op ppf arg = match op with + | Ifar_poll _ -> + fprintf ppf "(far) poll" | Ifar_alloc { bytes; } -> fprintf ppf "(far) alloc %i" bytes | Ifar_intop_checkbound -> @@ -169,3 +173,94 @@ let print_specific_operation printreg op ppf arg = | Imove32 -> fprintf ppf "move32 %a" printreg arg.(0) + | Isignext n -> + fprintf ppf "signext%d %a" + n printreg arg.(0) + +(* Recognition of logical immediate arguments *) + +(* An automaton to recognize ( 0+1+0* | 1+0+1* ) + + 0 1 0 + / \ / \ / \ + \ / \ / \ / + -0--> [1] --1--> [2] --0--> [3] + / + [0] + \ + -1--> [4] --0--> [5] --1--> [6] + / \ / \ / \ + \ / \ / \ / + 1 0 1 + +The accepting states are 2, 3, 5 and 6. *) + +let auto_table = [| (* accepting?, next on 0, next on 1 *) + (* state 0 *) (false, 1, 4); + (* state 1 *) (false, 1, 2); + (* state 2 *) (true, 3, 2); + (* state 3 *) (true, 3, 7); + (* state 4 *) (false, 5, 4); + (* state 5 *) (true, 5, 6); + (* state 6 *) (true, 7, 6); + (* state 7 *) (false, 7, 7) (* error state *) +|] + +let rec run_automata nbits state input = + let (acc, next0, next1) = auto_table.(state) in + if nbits <= 0 + then acc + else run_automata (nbits - 1) + (if Nativeint.logand input 1n = 0n then next0 else next1) + (Nativeint.shift_right_logical input 1) + +(* The following function determines a length [e] + such that [x] is a repetition [BB...B] of a bit pattern [B] of length [e]. + [e] ranges over 64, 32, 16, 8, 4, 2. The smaller [e] the better. *) + +let logical_imm_length x = + (* [test n] checks that the low [2n] bits of [x] are of the + form [BB], that is, two occurrences of the same [n] bits *) + let test n = + let mask = Nativeint.(sub (shift_left 1n n) 1n) in + let low_n_bits = Nativeint.(logand x mask) in + let next_n_bits = Nativeint.(logand (shift_right_logical x n) mask) in + low_n_bits = next_n_bits in + (* If [test n] fails, we know that the length [e] is + at least [2n]. Hence we test with decreasing values of [n]: + 32, 16, 8, 4, 2. *) + if not (test 32) then 64 + else if not (test 16) then 32 + else if not (test 8) then 16 + else if not (test 4) then 8 + else if not (test 2) then 4 + else 2 + +(* A valid logical immediate is +- neither [0] nor [-1]; +- composed of a repetition [BBBBB] of a bit-pattern [B] of length [e] +- the low [e] bits of the number, that is, [B], match [0+1+0*] or [1+0+1*]. +*) + +let is_logical_immediate x = + x <> 0n && x <> -1n && run_automata (logical_imm_length x) 0 x + +(* Specific operations that are pure *) + +let operation_is_pure = function + | Ifar_alloc _ + | Ifar_intop_checkbound + | Ifar_intop_imm_checkbound _ + | Ishiftcheckbound _ + | Ifar_shiftcheckbound _ -> false + | _ -> true + +(* Specific operations that can raise *) + +let operation_can_raise = function + | Ifar_alloc _ + | Ifar_intop_checkbound + | Ifar_intop_imm_checkbound _ + | Ishiftcheckbound _ + | Ifar_shiftcheckbound _ -> true + | _ -> false diff --git a/asmcomp/arm64/emit.mlp b/asmcomp/arm64/emit.mlp index 85a951c2..d63e383a 100644 --- a/asmcomp/arm64/emit.mlp +++ b/asmcomp/arm64/emit.mlp @@ -26,19 +26,15 @@ open Reg open Mach open Linear open Emitaux - -(* Tradeoff between code size and code speed *) - -let fastcode_flag = ref true +open Emitenv (* Names for special regs *) -let reg_domain_state_ptr = phys_reg 22 -let reg_trap_ptr = phys_reg 23 -let reg_alloc_ptr = phys_reg 24 -let reg_alloc_limit = phys_reg 25 -let reg_tmp1 = phys_reg 26 -let reg_x8 = phys_reg 8 +let reg_domain_state_ptr = phys_reg 25 (* x28 *) +let reg_trap_ptr = phys_reg 23 (* x26 *) +let reg_alloc_ptr = phys_reg 24 (* x27 *) +let reg_tmp1 = phys_reg 26 (* x16 *) +let reg_x8 = phys_reg 8 (* x8 *) (* Output a label *) @@ -85,47 +81,36 @@ let emit_wreg = function {loc = Reg r} -> emit_string int_reg_name_w.(r) | _ -> fatal_error "Emit.emit_wreg" -(* Layout of the stack frame *) - -let stack_offset = ref 0 - -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false +let initial_stack_offset f = + 8 * f.fun_num_stack_slots.(0) + + 8 * f.fun_num_stack_slots.(1) + + (if f.fun_contains_calls then 8 else 0) -let contains_calls = ref false - -let initial_stack_offset () = - 8 * num_stack_slots.(0) + - 8 * num_stack_slots.(1) + - (if !contains_calls then 8 else 0) - -let frame_size () = +let frame_size env = let sz = - !stack_offset + - initial_stack_offset () + env.stack_offset + initial_stack_offset env.f in Misc.align sz 16 -let slot_offset loc cl = +let slot_offset env loc cl = match loc with Incoming n -> assert (n >= 0); - frame_size() + n + frame_size env + n | Local n -> - !stack_offset + + env.stack_offset + (if cl = 0 then n * 8 - else num_stack_slots.(0) * 8 + n * 8) + else env.f.fun_num_stack_slots.(0) * 8 + n * 8) | Outgoing n -> assert (n >= 0); n (* Output a stack reference *) -let emit_stack r = +let emit_stack env r = match r.loc with | Stack s -> - let ofs = slot_offset s (register_class r) in `[sp, #{emit_int ofs}]` + let ofs = slot_offset env s (register_class r) in `[sp, #{emit_int ofs}]` | _ -> fatal_error "Emit.emit_stack" (* Output an addressing mode *) @@ -146,7 +131,7 @@ let emit_addressing addr r = (* Record live pointers at call points *) -let record_frame_label live dbg = +let record_frame_label env live dbg = let lbl = new_label () in let live_offset = ref [] in Reg.Set.iter @@ -154,56 +139,38 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; lbl -let record_frame live dbg = - let lbl = record_frame_label live dbg in `{emit_label lbl}:` - -(* Record calls to the GC -- we've moved them out of the way *) - -type gc_call = - { gc_lbl: label; (* Entry label *) - gc_return_lbl: label; (* Where to branch after GC *) - gc_frame_lbl: label } (* Label of frame descriptor *) - -let call_gc_sites = ref ([] : gc_call list) +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in `{emit_label lbl}:` let emit_call_gc gc = `{emit_label gc.gc_lbl}: bl {emit_symbol "caml_call_gc"}\n`; `{emit_label gc.gc_frame_lbl}: b {emit_label gc.gc_return_lbl}\n` -(* Record calls to caml_ml_array_bound_error. - In debug mode, we maintain one call to caml_ml_array_bound_error - per bound check site. Otherwise, we can share a single call. *) - -type bound_error_call = - { bd_lbl: label; (* Entry label *) - bd_frame_lbl: label } (* Label of frame descriptor *) - -let bound_error_sites = ref ([] : bound_error_call list) - -let bound_error_label dbg = - if !Clflags.debug || !bound_error_sites = [] then begin +let bound_error_label env dbg = + if !Clflags.debug || env.bound_error_sites = [] then begin let lbl_bound_error = new_label() in - let lbl_frame = record_frame_label Reg.Set.empty (Dbg_other dbg) in - bound_error_sites := + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- { bd_lbl = lbl_bound_error; - bd_frame_lbl = lbl_frame } :: !bound_error_sites; + bd_frame = lbl_frame; + } :: env.bound_error_sites; lbl_bound_error end else begin - let bd = List.hd !bound_error_sites in bd.bd_lbl + let bd = List.hd env.bound_error_sites in bd.bd_lbl end let emit_call_bound_error bd = `{emit_label bd.bd_lbl}: bl {emit_symbol "caml_ml_array_bound_error"}\n`; - `{emit_label bd.bd_frame_lbl}:\n` + `{emit_label bd.bd_frame}:\n` (* Names of various instructions *) @@ -226,63 +193,55 @@ let name_for_int_operation = function | Iasr -> "asr" | _ -> assert false +(* Decompose an integer constant into four 16-bit shifted fragments. + Omit the fragments that are equal to "default" (16 zeros or 16 ones). *) + +let decompose_int default n = + let rec decomp n pos = + if pos >= 64 then [] else begin + let frag = Nativeint.logand n 0xFFFFn + and rem = Nativeint.shift_right_logical n 16 in + if frag = default + then decomp rem (pos + 16) + else (frag, pos) :: decomp rem (pos + 16) + end + in decomp n 0 + (* Load an integer constant into a register *) +let emit_movk dst (f, p) = + ` movk {emit_reg dst}, #{emit_nativeint f}, lsl #{emit_int p}\n` + let emit_intconst dst n = - let rec emit_pos first shift = - if shift < 0 then begin - if first then ` mov {emit_reg dst}, xzr\n` - end else begin - let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in - if s = 0n then emit_pos first (shift - 16) else begin - if first then - ` movz {emit_reg dst}, #{emit_nativeint s}, lsl #{emit_int shift}\n` - else - ` movk {emit_reg dst}, #{emit_nativeint s}, lsl #{emit_int shift}\n`; - emit_pos false (shift - 16) - end - end - and emit_neg first shift = - if shift < 0 then begin - if first then ` movn {emit_reg dst}, #0\n` + if is_logical_immediate n then + ` orr {emit_reg dst}, xzr, #{emit_nativeint n}\n` + else begin + let dz = decompose_int 0x0000n n + and dn = decompose_int 0xFFFFn n in + if List.length dz <= List.length dn then begin + match dz with + | [] -> + ` mov {emit_reg dst}, xzr\n` + | (f, p) :: l -> + ` movz {emit_reg dst}, #{emit_nativeint f}, lsl #{emit_int p}\n`; + List.iter (emit_movk dst) l end else begin - let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in - if s = 0xFFFFn then emit_neg first (shift - 16) else begin - if first then - ` movn {emit_reg dst}, #{emit_nativeint (Nativeint.logxor s 0xFFFFn)}, lsl #{emit_int shift}\n` - else - ` movk {emit_reg dst}, #{emit_nativeint s}, lsl #{emit_int shift}\n`; - emit_neg false (shift - 16) - end + match dn with + | [] -> + ` movn {emit_reg dst}, #0\n` + | (f, p) :: l -> + let nf = Nativeint.logxor f 0xFFFFn in + ` movn {emit_reg dst}, #{emit_nativeint nf}, lsl #{emit_int p}\n`; + List.iter (emit_movk dst) l end - in - if n < 0n then emit_neg true 48 else emit_pos true 48 + end let num_instructions_for_intconst n = - let num_instructions = ref 0 in - let rec count_pos first shift = - if shift < 0 then begin - if first then incr num_instructions - end else begin - let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in - if s = 0n then count_pos first (shift - 16) else begin - incr num_instructions; - count_pos false (shift - 16) - end - end - and count_neg first shift = - if shift < 0 then begin - if first then incr num_instructions - end else begin - let s = Nativeint.(logand (shift_right_logical n shift) 0xFFFFn) in - if s = 0xFFFFn then count_neg first (shift - 16) else begin - incr num_instructions; - count_neg false (shift - 16) - end - end - in - if n < 0n then count_neg true 48 else count_pos true 48; - !num_instructions + if is_logical_immediate n then 1 else begin + let dz = decompose_int 0x0000n n + and dn = decompose_int 0xFFFFn n in + max 1 (min (List.length dz) (List.length dn)) + end (* Recognize float constants appropriate for FMOV dst, #fpimm instruction: "a normalized binary floating point encoding with 1 sign bit, 4 @@ -307,9 +266,9 @@ let emit_stack_adjustment n = (* Deallocate the stack frame and reload the return address before a return or tail call *) -let output_epilogue f = - let n = frame_size() in - if !contains_calls then +let output_epilogue env f = + let n = frame_size env in + if env.f.fun_contains_calls then ` ldr x30, [sp, #{emit_int (n-8)}]\n`; if n > 0 then emit_stack_adjustment n; @@ -348,33 +307,27 @@ let emit_cmpimm rs n = then ` cmp {emit_reg rs}, #{emit_int n}\n` else ` cmn {emit_reg rs}, #{emit_int (-n)}\n` -(* Name of current function *) -let function_name = ref "" -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 -(* Pending floating-point literals *) -let float_literals = ref ([] : (int64 * label) list) - (* Label a floating-point literal *) -let float_literal f = +let float_literal env fl = try - List.assoc f !float_literals + let x = List.find (fun x -> Int64.equal x.fl fl) env.float_literals in + x.lbl with Not_found -> let lbl = new_label() in - float_literals := (f, lbl) :: !float_literals; + env.float_literals <- { fl; lbl } :: env.float_literals; lbl (* Emit all pending literals *) -let emit_literals() = - if !float_literals <> [] then begin +let emit_literals env = + if env.float_literals <> [] then begin if macosx then ` .section __TEXT,__literal8,8byte_literals\n`; ` .align 3\n`; List.iter - (fun (f, lbl) -> - `{emit_label lbl}:`; emit_float64_directive ".quad" f) - !float_literals; - float_literals := [] + (fun { fl; lbl } -> + `{emit_label lbl}:`; emit_float64_directive ".quad" fl) + env.float_literals; + env.float_literals <- [] end (* Emit code to load the address of a symbol *) @@ -395,11 +348,13 @@ let emit_load_symbol_addr dst s = call GC and bounds check points emitted out-of-line from the function body. See branch_relaxation.mli. *) -let num_call_gc_and_check_bound_points instr = +let num_call_gc_and_check_bound_points env = let rec loop instr ((call_gc, check_bound) as totals) = match instr.desc with | Lend -> totals - | Lop (Ialloc _) when !fastcode_flag -> + | Lop (Ialloc _) when env.f.fun_fast -> + loop instr.next (call_gc + 1, check_bound) + | Lop (Ipoll _) -> loop instr.next (call_gc + 1, check_bound) | Lop (Iintop Icheckbound) | Lop (Iintop_imm (Icheckbound, _)) @@ -413,12 +368,13 @@ let num_call_gc_and_check_bound_points instr = (* The following four should never be seen, since this function is run before branch relaxation. *) | Lop (Ispecific (Ifar_alloc _)) + | Lop (Ispecific (Ifar_poll _)) | Lop (Ispecific Ifar_intop_checkbound) | Lop (Ispecific (Ifar_intop_imm_checkbound _)) | Lop (Ispecific (Ifar_shiftcheckbound _)) -> assert false | _ -> loop instr.next totals in - loop instr (0, 0) + loop env.f.fun_body (0, 0) let max_out_of_line_code_offset ~num_call_gc ~num_check_bound = if num_call_gc < 1 && num_check_bound < 1 then 0 @@ -459,6 +415,7 @@ module BR = Branch_relaxation.Make (struct let classify_instr = function | Lop (Ialloc _) + | Lop (Ipoll _) | Lop (Iintop Icheckbound) | Lop (Iintop_imm (Icheckbound, _)) | Lop (Ispecific (Ishiftcheckbound _)) -> Some Bcc @@ -478,16 +435,16 @@ module BR = Branch_relaxation.Make (struct let offset_pc_at_branch = 0 - let prologue_size () = - (if initial_stack_offset () > 0 then 2 else 0) - + (if !contains_calls then 1 else 0) + let prologue_size f = + (if initial_stack_offset f > 0 then 2 else 0) + + (if f.fun_contains_calls then 1 else 0) - let epilogue_size () = - if !contains_calls then 3 else 2 + let epilogue_size f = + if f.fun_contains_calls then 3 else 2 - let instr_size = function + let instr_size f = function | Lend -> 0 - | Lprologue -> prologue_size () + | Lprologue -> prologue_size f | Lop (Imove | Ispill | Ireload) -> 1 | Lop (Iconst_int n) -> num_instructions_for_intconst n @@ -495,19 +452,19 @@ module BR = Branch_relaxation.Make (struct | Lop (Iconst_symbol _) -> 2 | Lop (Icall_ind) -> 1 | Lop (Icall_imm _) -> 1 - | Lop (Itailcall_ind) -> epilogue_size () + | Lop (Itailcall_ind) -> epilogue_size f | Lop (Itailcall_imm { func; _ }) -> - if func = !function_name then 1 else epilogue_size () + if func = f.fun_name then 1 else epilogue_size f | Lop (Iextcall { alloc = false; }) -> 1 | Lop (Iextcall { alloc = true; }) -> 3 | Lop (Istackoffset _) -> 2 - | Lop (Iload (size, addr)) | Lop (Istore (size, addr, _)) -> + | Lop (Iload (size, addr, _)) | Lop (Istore (size, addr, _)) -> let based = match addr with Iindexed _ -> 0 | Ibased _ -> 1 in based + begin match size with Single -> 2 | _ -> 1 end - | Lop (Ialloc {bytes = num_bytes}) when !fastcode_flag -> - if num_bytes <= 0xFFF then 4 else 5 - | Lop (Ispecific (Ifar_alloc {bytes = num_bytes})) when !fastcode_flag -> - if num_bytes <= 0xFFF then 5 else 6 + | Lop (Ialloc _) when f.fun_fast -> 5 + | Lop (Ispecific (Ifar_alloc _)) when f.fun_fast -> 6 + | Lop (Ipoll _) -> 3 + | Lop (Ispecific (Ifar_poll _)) -> 4 | Lop (Ialloc { bytes = num_bytes; _ }) | Lop (Ispecific (Ifar_alloc { bytes = num_bytes; _ })) -> begin match num_bytes with @@ -528,15 +485,16 @@ module BR = Branch_relaxation.Make (struct | Lop (Iintop_imm _) -> 1 | Lop (Ifloatofint | Iintoffloat | Iabsf | Inegf | Ispecific Isqrtf) -> 1 | Lop (Iaddf | Isubf | Imulf | Idivf | Ispecific Inegmulf) -> 1 + | Lop (Iopaque) -> 0 | Lop (Ispecific (Imuladdf | Inegmuladdf | Imulsubf | Inegmulsubf)) -> 1 | Lop (Ispecific (Ishiftarith _)) -> 1 | Lop (Ispecific (Imuladd | Imulsub)) -> 1 | Lop (Ispecific (Ibswap 16)) -> 2 | Lop (Ispecific (Ibswap _)) -> 1 | Lop (Ispecific Imove32) -> 1 - | Lop (Iname_for_debugger _) -> 0 + | Lop (Ispecific (Isignext _)) -> 1 | Lreloadretaddr -> 0 - | Lreturn -> epilogue_size () + | Lreturn -> epilogue_size f | Llabel _ -> 0 | Lbranch _ -> 1 | Lcondbranch (tst, _) -> @@ -565,6 +523,9 @@ module BR = Branch_relaxation.Make (struct | Lambda.Raise_notrace -> 4 end + let relax_poll ~return_label = + Lop (Ispecific (Ifar_poll { return_label })) + let relax_allocation ~num_bytes ~dbginfo = Lop (Ispecific (Ifar_alloc { bytes = num_bytes; dbginfo })) @@ -582,19 +543,21 @@ end) (* Output the assembly code for allocation. *) -let assembly_code_for_allocation i ~n ~far ~dbginfo = +let assembly_code_for_allocation env i ~n ~far ~dbginfo = let lbl_frame = - record_frame_label i.live (Dbg_alloc dbginfo) + record_frame_label env i.live (Dbg_alloc dbginfo) in - if !fastcode_flag then begin + if env.f.fun_fast then begin let lbl_after_alloc = new_label() in let lbl_call_gc = new_label() in (* n is at most Max_young_whsize * 8, i.e. currently 0x808, so it is reasonable to assume n < 0x1_000. This makes the generated code simpler. *) assert (16 <= n && n < 0x1_000 && n land 0x7 = 0); + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in + ` ldr {emit_reg reg_tmp1}, [{emit_reg reg_domain_state_ptr}, #{emit_int offset}]\n`; ` sub {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, #{emit_int n}\n`; - ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_limit}\n`; + ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp1}\n`; if not far then begin ` b.lo {emit_label lbl_call_gc}\n` end else begin @@ -605,10 +568,10 @@ let assembly_code_for_allocation i ~n ~far ~dbginfo = end; `{emit_label lbl_after_alloc}:`; ` add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n`; - call_gc_sites := + env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; - gc_frame_lbl = lbl_frame } :: !call_gc_sites + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites end else begin begin match n with | 16 -> ` bl {emit_symbol "caml_alloc1"}\n` @@ -620,6 +583,40 @@ let assembly_code_for_allocation i ~n ~far ~dbginfo = `{emit_label lbl_frame}: add {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, #8\n` end +let assembly_code_for_poll env i ~far ~return_label = + let lbl_frame = record_frame_label env i.live (Dbg_alloc []) in + let lbl_call_gc = new_label() in + let lbl_after_poll = match return_label with + | None -> new_label() + | Some lbl -> lbl in + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in + ` ldr {emit_reg reg_tmp1}, [{emit_reg reg_domain_state_ptr}, #{emit_int offset}]\n`; + ` cmp {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp1}\n`; + if not far then begin + match return_label with + | None -> + ` b.ls {emit_label lbl_call_gc}\n`; + `{emit_label lbl_after_poll}:\n` + | Some return_label -> + ` b.hi {emit_label return_label}\n`; + ` b {emit_label lbl_call_gc}\n`; + end else begin + match return_label with + | None -> + ` b.hi {emit_label lbl_after_poll}\n`; + ` b {emit_label lbl_call_gc}\n`; + `{emit_label lbl_after_poll}:\n` + | Some return_label -> + let lbl = new_label () in + ` b.ls {emit_label lbl}\n`; + ` b {emit_label return_label}\n`; + `{emit_label lbl}: b {emit_label lbl_call_gc}\n` + end; + env.call_gc_sites <- + { gc_lbl = lbl_call_gc; + gc_return_lbl = lbl_after_poll; + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites + (* Output .text section directive, or named .text.caml. if enabled. *) let emit_named_text_section func_name = @@ -642,16 +639,16 @@ let emit_load_literal dst lbl = (* Output the assembly code for an instruction *) -let emit_instr i = +let emit_instr env i = emit_debug_info i.dbg; match i.desc with | Lend -> () | Lprologue -> - assert (!prologue_required); - let n = frame_size() in + assert (env.f.fun_prologue_required); + let n = frame_size env in if n > 0 then emit_stack_adjustment (-n); - if !contains_calls then begin + if env.f.fun_contains_calls then begin cfi_offset ~reg:30 (* return address *) ~offset:(-8); ` str x30, [sp, #{emit_int (n-8)}]\n` end @@ -664,9 +661,9 @@ let emit_instr i = | {loc = Reg _}, {loc = Reg _} -> ` mov {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _}, {loc = Stack _} -> - ` str {emit_reg src}, {emit_stack dst}\n` + ` str {emit_reg src}, {emit_stack env dst}\n` | {loc = Stack _}, {loc = Reg _} -> - ` ldr {emit_reg dst}, {emit_stack src}\n` + ` ldr {emit_reg dst}, {emit_stack env src}\n` | _ -> assert false end @@ -677,9 +674,9 @@ let emit_instr i = | {loc = Reg _}, {loc = Reg _} -> ` mov {emit_wreg dst}, {emit_wreg src}\n` | {loc = Reg _}, {loc = Stack _} -> - ` str {emit_wreg src}, {emit_stack dst}\n` + ` str {emit_wreg src}, {emit_stack env dst}\n` | {loc = Stack _}, {loc = Reg _} -> - ` ldr {emit_wreg dst}, {emit_stack src}\n` + ` ldr {emit_wreg dst}, {emit_stack env src}\n` | _ -> assert false end @@ -691,35 +688,35 @@ let emit_instr i = else if is_immediate_float f then ` fmov {emit_reg i.res.(0)}, #{emit_printf "%.7f" (Int64.float_of_bits f)}\n` else begin - let lbl = float_literal f in + let lbl = float_literal env f in emit_load_literal i.res.(0) lbl end | Lop(Iconst_symbol s) -> emit_load_symbol_addr i.res.(0) s | Lop(Icall_ind) -> ` blr {emit_reg i.arg.(0)}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n` + `{record_frame env i.live (Dbg_other i.dbg)}\n` | Lop(Icall_imm { func; }) -> ` bl {emit_symbol func}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n` + `{record_frame env i.live (Dbg_other i.dbg)}\n` | Lop(Itailcall_ind) -> - output_epilogue (fun () -> ` br {emit_reg i.arg.(0)}\n`) + output_epilogue env (fun () -> ` br {emit_reg i.arg.(0)}\n`) | Lop(Itailcall_imm { func; }) -> - if func = !function_name then - ` b {emit_label !tailrec_entry_point}\n` + if func = env.f.fun_name then + ` b {emit_label env.f.fun_tailrec_entry_point_label}\n` else - output_epilogue (fun () -> ` b {emit_symbol func}\n`) + output_epilogue env (fun () -> ` b {emit_symbol func}\n`) | Lop(Iextcall { func; alloc = false; }) -> ` bl {emit_symbol func}\n` | Lop(Iextcall { func; alloc = true; }) -> emit_load_symbol_addr reg_x8 func; ` bl {emit_symbol "caml_c_call"}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n` + `{record_frame env i.live (Dbg_other i.dbg)}\n` | Lop(Istackoffset n) -> assert (n mod 16 = 0); emit_stack_adjustment (-n); - stack_offset := !stack_offset + n - | Lop(Iload(size, addr)) -> + env.stack_offset <- env.stack_offset + n + | Lop(Iload(size, addr, _mut)) -> let dst = i.res.(0) in let base = match addr with @@ -770,9 +767,13 @@ let emit_instr i = ` str {emit_reg src}, {emit_addressing addr base}\n` end | Lop(Ialloc { bytes = n; dbginfo }) -> - assembly_code_for_allocation i ~n ~far:false ~dbginfo + assembly_code_for_allocation env i ~n ~far:false ~dbginfo | Lop(Ispecific (Ifar_alloc { bytes = n; dbginfo })) -> - assembly_code_for_allocation i ~n ~far:true ~dbginfo + assembly_code_for_allocation env i ~n ~far:true ~dbginfo + | Lop(Ipoll { return_label }) -> + assembly_code_for_poll env i ~far:false ~return_label + | Lop(Ispecific (Ifar_poll { return_label })) -> + assembly_code_for_poll env i ~far:true ~return_label | Lop(Iintop_imm(Iadd, n)) -> emit_addimm i.res.(0) i.arg.(0) n | Lop(Iintop_imm(Isub, n)) -> @@ -784,34 +785,34 @@ let emit_instr i = emit_cmpimm i.arg.(0) n; ` cset {emit_reg i.res.(0)}, {emit_string (name_for_comparison cmp)}\n` | Lop(Iintop (Icheckbound)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` b.ls {emit_label lbl}\n` | Lop(Ispecific Ifar_intop_checkbound) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in let lbl2 = new_label () in ` cmp {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` b.hi {emit_label lbl2}\n`; ` b {emit_label lbl}\n`; `{emit_label lbl2}:\n`; | Lop(Iintop_imm(Icheckbound, n)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in emit_cmpimm i.arg.(0) n; ` b.ls {emit_label lbl}\n` | Lop(Ispecific( Ifar_intop_imm_checkbound { bound; })) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in let lbl2 = new_label () in ` cmp {emit_reg i.arg.(0)}, #{emit_int bound}\n`; ` b.hi {emit_label lbl2}\n`; ` b {emit_label lbl}\n`; `{emit_label lbl2}:\n`; | Lop(Ispecific(Ishiftcheckbound { shift; })) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; ` b.cs {emit_label lbl}\n` | Lop(Ispecific(Ifar_shiftcheckbound { shift; })) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in let lbl2 = new_label () in ` cmp {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}, lsr #{emit_int shift}\n`; ` b.lo {emit_label lbl2}\n`; @@ -854,6 +855,8 @@ let emit_instr i = | Inegmulsubf -> "fnmsub" | _ -> assert false) in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}, {emit_reg i.arg.(0)}\n` + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific(Ishiftarith(op, shift))) -> let instr = (match op with Ishiftadd -> "add" @@ -880,11 +883,12 @@ let emit_instr i = | _ -> assert false end - | Lop (Iname_for_debugger _) -> () + | Lop(Ispecific(Isignext size)) -> + ` sbfm {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, #0, #{emit_int (size - 1)}\n` | Lreloadretaddr -> () | Lreturn -> - output_epilogue (fun () -> ` ret\n`) + output_epilogue env (fun () -> ` ret\n`) | Llabel lbl -> `{emit_label lbl}:\n` | Lbranch lbl -> @@ -964,10 +968,10 @@ let emit_instr i = (* each trap occupies 16 bytes on the stack *) let delta = 16 * delta_traps in cfi_adjust_cfa_offset delta; - stack_offset := !stack_offset + delta + env.stack_offset <- env.stack_offset + delta | Lpushtrap { lbl_handler; } -> ` adr {emit_reg reg_tmp1}, {emit_label lbl_handler}\n`; - stack_offset := !stack_offset + 16; + env.stack_offset <- env.stack_offset + 16; ` str {emit_reg reg_trap_ptr}, [sp, -16]!\n`; ` str {emit_reg reg_tmp1}, [sp, #8]\n`; cfi_adjust_cfa_offset 16; @@ -975,17 +979,17 @@ let emit_instr i = | Lpoptrap -> ` ldr {emit_reg reg_trap_ptr}, [sp], 16\n`; cfi_adjust_cfa_offset (-16); - stack_offset := !stack_offset - 16 + env.stack_offset <- env.stack_offset - 16 | Lraise k -> begin match k with | Lambda.Raise_regular -> let offset = Domainstate.(idx_of_field Domain_backtrace_pos) * 8 in ` str xzr, [{emit_reg reg_domain_state_ptr}, {emit_int offset}]\n`; ` bl {emit_symbol "caml_raise_exn"}\n`; - `{record_frame Reg.Set.empty (Dbg_raise i.dbg)}\n` + `{record_frame env Reg.Set.empty (Dbg_raise i.dbg)}\n` | Lambda.Raise_reraise -> ` bl {emit_symbol "caml_raise_exn"}\n`; - `{record_frame Reg.Set.empty (Dbg_raise i.dbg)}\n` + `{record_frame env Reg.Set.empty (Dbg_raise i.dbg)}\n` | Lambda.Raise_notrace -> ` mov sp, {emit_reg reg_trap_ptr}\n`; ` ldr {emit_reg reg_tmp1}, [sp, #8]\n`; @@ -995,25 +999,14 @@ let emit_instr i = (* Emission of an instruction sequence *) -let rec emit_all i = - if i.desc = Lend then () else (emit_instr i; emit_all i.next) +let rec emit_all env i = + if i.desc = Lend then () else (emit_instr env i; emit_all env i.next) (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - float_literals := []; - stack_offset := 0; - call_gc_sites := []; - bound_error_sites := []; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - prologue_required := fundecl.fun_prologue_required; - contains_calls := fundecl.fun_contains_calls; - emit_named_text_section !function_name; + let env = mk_env fundecl in + emit_named_text_section fundecl.fun_name; ` .align 3\n`; ` .globl {emit_symbol fundecl.fun_name}\n`; emit_symbol_type emit_symbol fundecl.fun_name "function"; @@ -1021,22 +1014,22 @@ let fundecl fundecl = emit_debug_info fundecl.fun_dbg; cfi_startproc(); let num_call_gc, num_check_bound = - num_call_gc_and_check_bound_points fundecl.fun_body + num_call_gc_and_check_bound_points env in let max_out_of_line_code_offset = max_out_of_line_code_offset ~num_call_gc ~num_check_bound in - BR.relax fundecl.fun_body ~max_out_of_line_code_offset; - emit_all fundecl.fun_body; - List.iter emit_call_gc !call_gc_sites; - List.iter emit_call_bound_error !bound_error_sites; - assert (List.length !call_gc_sites = num_call_gc); - assert (List.length !bound_error_sites = num_check_bound); + BR.relax fundecl ~max_out_of_line_code_offset; + emit_all env fundecl.fun_body; + List.iter emit_call_gc env.call_gc_sites; + List.iter emit_call_bound_error env.bound_error_sites; + assert (List.length env.call_gc_sites = num_call_gc); + assert (List.length env.bound_error_sites = num_check_bound); cfi_endproc(); emit_symbol_type emit_symbol fundecl.fun_name "function"; emit_symbol_size fundecl.fun_name; - emit_literals() + emit_literals env (* Emission of data *) diff --git a/asmcomp/arm64/proc.ml b/asmcomp/arm64/proc.ml index 7635181a..7a6f10a6 100644 --- a/asmcomp/arm64/proc.ml +++ b/asmcomp/arm64/proc.ml @@ -33,11 +33,10 @@ let word_addressed = false x0 - x15 general purpose (caller-save) x16, x17 temporaries (used by call veeners) x18 platform register (reserved) - x19 - x24 general purpose (callee-save) - x25 domain state pointer + x19 - x25 general purpose (callee-save) x26 trap pointer x27 alloc pointer - x28 alloc limit + x28 domain state pointer x29 frame pointer x30 return address sp / xzr stack pointer / zero register @@ -48,10 +47,11 @@ let word_addressed = false *) let int_reg_name = - [| "x0"; "x1"; "x2"; "x3"; "x4"; "x5"; "x6"; "x7"; - "x8"; "x9"; "x10"; "x11"; "x12"; "x13"; "x14"; "x15"; - "x19"; "x20"; "x21"; "x22"; "x23"; "x24"; - "x25"; "x26"; "x27"; "x28"; "x16"; "x17" |] + [| "x0"; "x1"; "x2"; "x3"; "x4"; "x5"; "x6"; "x7"; (* 0 - 7 *) + "x8"; "x9"; "x10"; "x11"; "x12"; "x13"; "x14"; "x15"; (* 8 - 15 *) + "x19"; "x20"; "x21"; "x22"; "x23"; "x24"; "x25"; (* 16 - 22 *) + "x26"; "x27"; "x28"; (* 23 - 25 *) + "x16"; "x17" |] (* 26 - 27 *) let float_reg_name = [| "d0"; "d1"; "d2"; "d3"; "d4"; "d5"; "d6"; "d7"; @@ -67,7 +67,7 @@ let register_class r = | Float -> 1 let num_available_registers = - [| 22; 32 |] (* first 22 int regs allocatable; all float regs allocatable *) + [| 23; 32 |] (* first 23 int regs allocatable; all float regs allocatable *) let first_available_register = [| 0; 100 |] @@ -256,9 +256,10 @@ let destroyed_at_oper = function all_phys_regs | Iop(Iextcall { alloc = false; }) -> destroyed_at_c_call - | Iop(Ialloc _) -> + | Iop(Ialloc _) | Iop(Ipoll _) -> [| reg_x8 |] - | Iop(Iintoffloat | Ifloatofint | Iload(Single, _) | Istore(Single, _, _)) -> + | Iop( Iintoffloat | Ifloatofint + | Iload(Single, _, _) | Istore(Single, _, _)) -> [| reg_d7 |] (* d7 / s7 destroyed *) | _ -> [||] @@ -269,26 +270,16 @@ let destroyed_at_reloadretaddr = [| |] (* Maximal register pressure *) let safe_register_pressure = function - | Iextcall _ -> 8 - | Ialloc _ -> 24 - | _ -> 25 + | Iextcall _ -> 7 + | Ialloc _ | Ipoll _ -> 22 + | _ -> 23 let max_register_pressure = function - | Iextcall _ -> [| 10; 8 |] - | Ialloc _ -> [| 24; 32 |] + | Iextcall _ -> [| 7; 8 |] (* 7 integer callee-saves, 8 FP callee-saves *) + | Ialloc _ | Ipoll _ -> [| 22; 32 |] | Iintoffloat | Ifloatofint - | Iload(Single, _) | Istore(Single, _, _) -> [| 25; 31 |] - | _ -> [| 25; 32 |] - -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) - | Ispecific(Ishiftcheckbound _) -> false - | _ -> true + | Iload(Single, _, _) | Istore(Single, _, _) -> [| 23; 31 |] + | _ -> [| 23; 32 |] (* Layout of the stack *) let frame_required fd = diff --git a/asmcomp/arm64/selection.ml b/asmcomp/arm64/selection.ml index d9351075..90ad78ae 100644 --- a/asmcomp/arm64/selection.ml +++ b/asmcomp/arm64/selection.ml @@ -34,47 +34,8 @@ let is_offset chunk n = | Word_int | Word_val | Double | Double_u -> n land 7 = 0 && n lsr 3 < 0x1000) -(* An automaton to recognize ( 0+1+0* | 1+0+1* ) - - 0 1 0 - / \ / \ / \ - \ / \ / \ / - -0--> [1] --1--> [2] --0--> [3] - / - [0] - \ - -1--> [4] --0--> [5] --1--> [6] - / \ / \ / \ - \ / \ / \ / - 1 0 1 - -The accepting states are 2, 3, 5 and 6. *) - -let auto_table = [| (* accepting?, next on 0, next on 1 *) - (* state 0 *) (false, 1, 4); - (* state 1 *) (false, 1, 2); - (* state 2 *) (true, 3, 2); - (* state 3 *) (true, 3, 7); - (* state 4 *) (false, 5, 4); - (* state 5 *) (true, 5, 6); - (* state 6 *) (true, 7, 6); - (* state 7 *) (false, 7, 7) (* error state *) -|] - -let rec run_automata nbits state input = - let (acc, next0, next1) = auto_table.(state) in - if nbits <= 0 - then acc - else run_automata (nbits - 1) - (if input land 1 = 0 then next0 else next1) - (input asr 1) - -(* We are very conservative wrt what ARM64 supports: we don't support - repetitions of a 000111000 or 1110000111 pattern, just a single - pattern of this kind. *) - let is_logical_immediate n = - n <> 0 && n <> -1 && run_automata 64 0 n + Arch.is_logical_immediate (Nativeint.of_int n) (* Signed immediates are simpler *) @@ -199,6 +160,14 @@ method! select_operation op args dbg = | _ -> super#select_operation op args dbg end + (* Recognize sign extension *) + | Casr -> + begin match args with + [Cop(Clsl, [k; Cconst_int (n, _)], _); Cconst_int (n', _)] + when n' = n && 0 < n && n < 64 -> + (Ispecific (Isignext (64 - n)), [k]) + | _ -> super#select_operation op args dbg + end (* Recognize floating-point negate and multiply *) | Cnegf -> begin match args with @@ -243,4 +212,5 @@ method! insert_move_extcall_arg env ty_arg src dst = else self#insert_moves env src dst end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = (new selector)#emit_fundecl + ~future_funcnames f diff --git a/asmcomp/asmgen.ml b/asmcomp/asmgen.ml index 3bb3a600..269711bc 100644 --- a/asmcomp/asmgen.ml +++ b/asmcomp/asmgen.ml @@ -26,9 +26,20 @@ open Cmm type error = | Assembler_error of string | Mismatched_for_pack of string option + | Asm_generation of string * Emitaux.error exception Error of error +let cmm_invariants ppf fd_cmm = + let print_fundecl = + if !Clflags.dump_cmm then Printcmm.fundecl + else fun ppf fdecl -> Format.fprintf ppf "%s" fdecl.fun_name + in + if !Clflags.cmm_invariants && Cmm_invariants.run ppf fd_cmm then + Misc.fatal_errorf "Cmm invariants failed on following fundecl:@.%a@." + print_fundecl fd_cmm; + fd_cmm + let liveness phrase = Liveness.fundecl phrase; phrase let dump_if ppf flag message phrase = @@ -86,9 +97,13 @@ let if_emit_do f x = if should_emit () then f x else () let emit_begin_assembly = if_emit_do Emit.begin_assembly let emit_end_assembly = if_emit_do Emit.end_assembly let emit_data = if_emit_do Emit.data -let emit_fundecl = - if_emit_do - (Profile.record ~accumulate:true "emit" Emit.fundecl) +let emit_fundecl fd = + if should_emit() then begin + try + Profile.record ~accumulate:true "emit" Emit.fundecl fd + with Emitaux.Error e -> + raise (Error (Asm_generation(fd.Linear.fun_name, e))) + end let rec regalloc ~ppf_dump round fd = if round > 50 then @@ -118,11 +133,15 @@ let rec regalloc ~ppf_dump round fd = let (++) x f = f x -let compile_fundecl ~ppf_dump fd_cmm = +let compile_fundecl ~ppf_dump ~funcnames fd_cmm = Proc.init (); Reg.reset(); fd_cmm - ++ Profile.record ~accumulate:true "selection" Selection.fundecl + ++ Profile.record ~accumulate:true "cmm_invariants" (cmm_invariants ppf_dump) + ++ Profile.record ~accumulate:true "selection" + (Selection.fundecl ~future_funcnames:funcnames) + ++ Profile.record ~accumulate:true "polling" + (Polling.instrument_fundecl ~future_funcnames:funcnames) ++ pass_dump_if ppf_dump dump_selection "After instruction selection" ++ Profile.record ~accumulate:true "comballoc" Comballoc.fundecl ++ pass_dump_if ppf_dump dump_combine "After allocation combining" @@ -138,7 +157,6 @@ let compile_fundecl ~ppf_dump fd_cmm = ++ pass_dump_if ppf_dump dump_split "After live range splitting" ++ Profile.record ~accumulate:true "liveness" liveness ++ Profile.record ~accumulate:true "regalloc" (regalloc ~ppf_dump 1) - ++ Profile.record ~accumulate:true "available_regs" Available_regs.fundecl ++ Profile.record ~accumulate:true "linearize" Linearize.fundecl ++ pass_dump_linear_if ppf_dump dump_linear "Linearized code" ++ Profile.record ~accumulate:true "scheduling" Scheduling.fundecl @@ -146,17 +164,38 @@ let compile_fundecl ~ppf_dump fd_cmm = ++ save_linear ++ emit_fundecl +module String = Misc.Stdlib.String + let compile_data dl = dl ++ save_data ++ emit_data -let compile_phrase ~ppf_dump p = - if !dump_cmm then fprintf ppf_dump "%a@." Printcmm.phrase p; - match p with - | Cfunction fd -> compile_fundecl ~ppf_dump fd - | Cdata dl -> compile_data dl +let compile_phrases ~ppf_dump ps = + let funcnames = + List.fold_left (fun s p -> + match p with + | Cfunction fd -> String.Set.add fd.fun_name s + | Cdata _ -> s) + String.Set.empty ps + in + let rec compile ~funcnames ps = + match ps with + | [] -> () + | p :: ps -> + if !dump_cmm then fprintf ppf_dump "%a@." Printcmm.phrase p; + match p with + | Cfunction fd -> + compile_fundecl ~ppf_dump ~funcnames fd; + compile ~funcnames:(String.Set.remove fd.fun_name funcnames) ps + | Cdata dl -> + compile_data dl; + compile ~funcnames ps + in + compile ~funcnames ps +let compile_phrase ~ppf_dump p = + compile_phrases ~ppf_dump [p] (* For the native toplevel: generates generic functions unless they are already available in the process *) @@ -201,7 +240,7 @@ let end_gen_implementation ?toplevel ~ppf_dump emit_begin_assembly (); clambda ++ Profile.record "cmm" Cmmgen.compunit - ++ Profile.record "compile_phrases" (List.iter (compile_phrase ~ppf_dump)) + ++ Profile.record "compile_phrases" (compile_phrases ~ppf_dump) ++ (fun () -> ()); (match toplevel with None -> () | Some f -> compile_genfuns ~ppf_dump f); (* We add explicit references to external primitive symbols. This @@ -219,7 +258,6 @@ let end_gen_implementation ?toplevel ~ppf_dump type middle_end = backend:(module Backend_intf.S) - -> filename:string -> prefixname:string -> ppf_dump:Format.formatter -> Lambda.program @@ -230,7 +268,7 @@ let asm_filename output_prefix = then output_prefix ^ ext_asm else Filename.temp_file "camlasm" ext_asm -let compile_implementation ?toplevel ~backend ~filename ~prefixname ~middle_end +let compile_implementation ?toplevel ~backend ~prefixname ~middle_end ~ppf_dump (program : Lambda.program) = compile_unit ~output_prefix:prefixname ~asm_filename:(asm_filename prefixname) ~keep_asm:!keep_asm_file @@ -238,7 +276,7 @@ let compile_implementation ?toplevel ~backend ~filename ~prefixname ~middle_end (fun () -> Ident.Set.iter Compilenv.require_global program.required_globals; let clambda_with_constants = - middle_end ~backend ~filename ~prefixname ~ppf_dump program + middle_end ~backend ~prefixname ~ppf_dump program in end_gen_implementation ?toplevel ~ppf_dump clambda_with_constants) @@ -279,6 +317,10 @@ let report_error ppf = function fprintf ppf "This input file cannot be compiled %s: it was generated %s." (msg !Clflags.for_package) (msg saved) + | Asm_generation(fn, err) -> + fprintf ppf + "Error producing assembly code for function %s: %a" + fn Emitaux.report_error err let () = Location.register_error_of_exn diff --git a/asmcomp/asmgen.mli b/asmcomp/asmgen.mli index f86bd673..e7e280c9 100644 --- a/asmcomp/asmgen.mli +++ b/asmcomp/asmgen.mli @@ -18,7 +18,6 @@ (** The type of converters from Lambda to Clambda. *) type middle_end = backend:(module Backend_intf.S) - -> filename:string -> prefixname:string -> ppf_dump:Format.formatter -> Lambda.program @@ -28,7 +27,6 @@ type middle_end = val compile_implementation : ?toplevel:(string -> bool) -> backend:(module Backend_intf.S) - -> filename:string -> prefixname:string -> middle_end:middle_end -> ppf_dump:Format.formatter @@ -44,6 +42,7 @@ val compile_phrase : type error = | Assembler_error of string | Mismatched_for_pack of string option + | Asm_generation of string * Emitaux.error exception Error of error val report_error: Format.formatter -> error -> unit diff --git a/asmcomp/asmlink.ml b/asmcomp/asmlink.ml index 697eeb3c..d9b5753d 100644 --- a/asmcomp/asmlink.ml +++ b/asmcomp/asmlink.ml @@ -124,19 +124,6 @@ let runtime_lib () = with Not_found -> raise(Error(File_not_found libname)) -let object_file_name name = - let file_name = - try - Load_path.find name - with Not_found -> - fatal_errorf "Asmlink.object_file_name: %s not found" name in - if Filename.check_suffix file_name ".cmx" then - Filename.chop_suffix file_name ".cmx" ^ ext_obj - else if Filename.check_suffix file_name ".cmxa" then - Filename.chop_suffix file_name ".cmxa" ^ ext_lib - else - fatal_error "Asmlink.object_file_name: bad ext" - (* First pass: determine which units are needed *) let missing_globals = (Hashtbl.create 17 : (string, string list ref) Hashtbl.t) @@ -164,6 +151,17 @@ type file = | Unit of string * unit_infos * Digest.t | Library of string * library_infos +let object_file_name_of_file = function + | Unit (fname, _, _) -> Some (Filename.chop_suffix fname ".cmx" ^ ext_obj) + | Library (fname, infos) -> + let obj_file = Filename.chop_suffix fname ".cmxa" ^ ext_lib in + (* MSVC doesn't support empty .lib files, and macOS struggles to make + them (#6550), so there shouldn't be one if the .cmxa contains no + units. The file_exists check is added to be ultra-defensive for the + case where a user has manually added things to the .a/.lib file *) + if infos.lib_units = [] && not (Sys.file_exists obj_file) then None else + Some obj_file + let read_file obj_name = let file_name = try @@ -186,42 +184,30 @@ let read_file obj_name = end else raise(Error(Not_an_object_file file_name)) -let scan_file obj_name (tolink, objfiles) = match read_file obj_name with +let scan_file file tolink = match file with | Unit (file_name,info,crc) -> (* This is a .cmx file. It must be linked in any case. *) remove_required info.ui_name; List.iter (add_required file_name) info.ui_imports_cmx; - ((info, file_name, crc) :: tolink, obj_name :: objfiles) + (info, file_name, crc) :: tolink | Library (file_name,infos) -> (* This is an archive file. Each unit contained in it will be linked in only if needed. *) add_ccobjs (Filename.dirname file_name) infos; - let tolink = - List.fold_right - (fun (info, crc) reqd -> - if info.ui_force_link - || !Clflags.link_everything - || is_required info.ui_name - then begin - remove_required info.ui_name; - List.iter (add_required (Printf.sprintf "%s(%s)" - file_name info.ui_name)) - info.ui_imports_cmx; - (info, file_name, crc) :: reqd - end else - reqd) - infos.lib_units tolink - and objfiles = - if infos.lib_units = [] - && not (Sys.file_exists (object_file_name obj_name)) then - (* MSVC doesn't support empty .lib files, and macOS struggles to make - them (#6550), so there shouldn't be one if the .cmxa contains no - units. The file_exists check is added to be ultra-defensive for the - case where a user has manually added things to the .a/.lib file *) - objfiles - else - obj_name :: objfiles - in (tolink, objfiles) + List.fold_right + (fun (info, crc) reqd -> + if info.ui_force_link + || !Clflags.link_everything + || is_required info.ui_name + then begin + remove_required info.ui_name; + List.iter (add_required (Printf.sprintf "%s(%s)" + file_name info.ui_name)) + info.ui_imports_cmx; + (info, file_name, crc) :: reqd + end else + reqd) + infos.lib_units tolink (* Second pass: generate the startup file and link it with everything else *) @@ -295,17 +281,16 @@ let call_linker_shared file_list output_name = let link_shared ~ppf_dump objfiles output_name = Profile.record_call output_name (fun () -> - let units_tolink, objfiles = - List.fold_right scan_file objfiles ([], []) - in + let obj_infos = List.map read_file objfiles in + let units_tolink = List.fold_right scan_file obj_infos [] in List.iter (fun (info, file_name, crc) -> check_consistency file_name info crc) units_tolink; Clflags.ccobjs := !Clflags.ccobjs @ !lib_ccobjs; Clflags.all_ccopts := !lib_ccopts @ !Clflags.all_ccopts; - let objfiles = List.rev_map object_file_name objfiles @ + let objfiles = + List.rev (List.filter_map object_file_name_of_file obj_infos) @ (List.rev !Clflags.ccobjs) in - let startup = if !Clflags.keep_startup_file || !Emitaux.binary_backend_available then output_name ^ ".startup" ^ ext_asm @@ -355,9 +340,8 @@ let link ~ppf_dump objfiles output_name = if !Clflags.nopervasives then objfiles else if !Clflags.output_c_object then stdlib :: objfiles else stdlib :: (objfiles @ [stdexit]) in - let units_tolink, objfiles = - List.fold_right scan_file objfiles ([], []) - in + let obj_infos = List.map read_file objfiles in + let units_tolink = List.fold_right scan_file obj_infos [] in Array.iter remove_required Runtimedef.builtin_exceptions; begin match extract_missing_globals() with [] -> () @@ -381,7 +365,7 @@ let link ~ppf_dump objfiles output_name = (fun () -> make_startup_file ~ppf_dump units_tolink ~crc_interfaces); Misc.try_finally (fun () -> - call_linker (List.map object_file_name objfiles) + call_linker (List.filter_map object_file_name_of_file obj_infos) startup_obj output_name) ~always:(fun () -> remove_file startup_obj) ) diff --git a/asmcomp/asmpackager.ml b/asmcomp/asmpackager.ml index 604fac5e..c7baa706 100644 --- a/asmcomp/asmpackager.ml +++ b/asmcomp/asmpackager.ml @@ -132,7 +132,6 @@ let make_package_object ~ppf_dump members targetobj targetname coercion program, Closure_middle_end.lambda_to_clambda in Asmgen.compile_implementation ~backend - ~filename:targetname ~prefixname ~middle_end ~ppf_dump diff --git a/asmcomp/branch_relaxation.ml b/asmcomp/branch_relaxation.ml index c91fb32b..38c4e3a8 100644 --- a/asmcomp/branch_relaxation.ml +++ b/asmcomp/branch_relaxation.ml @@ -18,15 +18,15 @@ open Mach open Linear module Make (T : Branch_relaxation_intf.S) = struct - let label_map code = + let label_map f = let map = Hashtbl.create 37 in let rec fill_map pc instr = match instr.desc with | Lend -> (pc, map) | Llabel lbl -> Hashtbl.add map lbl pc; fill_map pc instr.next - | op -> fill_map (pc + T.instr_size op) instr.next + | op -> fill_map (pc + T.instr_size f op) instr.next in - fill_map 0 code + fill_map 0 f.fun_body let branch_overflows map pc_branch lbl_dest max_branch_offset = let pc_dest = Hashtbl.find map lbl_dest in @@ -51,6 +51,7 @@ module Make (T : Branch_relaxation_intf.S) = struct in match instr.desc with | Lop (Ialloc _) + | Lop (Ipoll { return_label = None }) | Lop (Iintop (Icheckbound)) | Lop (Iintop_imm (Icheckbound, _)) | Lop (Ispecific _) -> @@ -64,10 +65,15 @@ module Make (T : Branch_relaxation_intf.S) = struct opt_branch_overflows map pc lbl0 max_branch_offset || opt_branch_overflows map pc lbl1 max_branch_offset || opt_branch_overflows map pc lbl2 max_branch_offset + | Lop (Ipoll { return_label = Some lbl }) -> + (* A poll-and-branch instruction can branch to the label lbl, + but also to an out-of-line code block. *) + code_size + max_out_of_line_code_offset - pc >= max_branch_offset + || branch_overflows map pc lbl max_branch_offset | _ -> Misc.fatal_error "Unsupported instruction for branch relaxation" - let fixup_branches ~code_size ~max_out_of_line_code_offset map code = + let fixup_branches ~code_size ~max_out_of_line_code_offset map f = let expand_optbranch lbl n arg next = match lbl with | None -> next @@ -83,22 +89,25 @@ module Make (T : Branch_relaxation_intf.S) = struct instr_overflows ~code_size ~max_out_of_line_code_offset instr map pc in if not overflows then - fixup did_fix (pc + T.instr_size instr.desc) instr.next + fixup did_fix (pc + T.instr_size f instr.desc) instr.next else match instr.desc with + | Lop (Ipoll { return_label }) -> + instr.desc <- T.relax_poll ~return_label; + fixup true (pc + T.instr_size f instr.desc) instr.next | Lop (Ialloc { bytes = num_bytes; dbginfo }) -> instr.desc <- T.relax_allocation ~num_bytes ~dbginfo; - fixup true (pc + T.instr_size instr.desc) instr.next + fixup true (pc + T.instr_size f instr.desc) instr.next | Lop (Iintop (Icheckbound)) -> instr.desc <- T.relax_intop_checkbound (); - fixup true (pc + T.instr_size instr.desc) instr.next + fixup true (pc + T.instr_size f instr.desc) instr.next | Lop (Iintop_imm (Icheckbound, bound)) -> instr.desc <- T.relax_intop_imm_checkbound ~bound; - fixup true (pc + T.instr_size instr.desc) instr.next + fixup true (pc + T.instr_size f instr.desc) instr.next | Lop (Ispecific specific) -> instr.desc <- T.relax_specific_op specific; - fixup true (pc + T.instr_size instr.desc) instr.next + fixup true (pc + T.instr_size f instr.desc) instr.next | Lcondbranch (test, lbl) -> let lbl2 = Cmm.new_label() in let cont = @@ -107,7 +116,7 @@ module Make (T : Branch_relaxation_intf.S) = struct in instr.desc <- Lcondbranch (invert_test test, lbl2); instr.next <- cont; - fixup true (pc + T.instr_size instr.desc) instr.next + fixup true (pc + T.instr_size f instr.desc) instr.next | Lcondbranch3 (lbl0, lbl1, lbl2) -> let cont = expand_optbranch lbl0 0 instr.arg @@ -123,20 +132,20 @@ module Make (T : Branch_relaxation_intf.S) = struct We can *never* get here. *) assert false in - fixup false 0 code + fixup false 0 f.fun_body (* Iterate branch expansion till all conditional branches are OK *) - let rec relax code ~max_out_of_line_code_offset = + let rec relax f ~max_out_of_line_code_offset = let min_of_max_branch_offsets = List.fold_left (fun min_of_max_branch_offsets branch -> - min min_of_max_branch_offsets + Int.min min_of_max_branch_offsets (T.Cond_branch.max_displacement branch)) max_int T.Cond_branch.all in - let (code_size, map) = label_map code in + let (code_size, map) = label_map f in if code_size >= min_of_max_branch_offsets - && fixup_branches ~code_size ~max_out_of_line_code_offset map code - then relax code ~max_out_of_line_code_offset + && fixup_branches ~code_size ~max_out_of_line_code_offset map f + then relax f ~max_out_of_line_code_offset else () end diff --git a/asmcomp/branch_relaxation.mli b/asmcomp/branch_relaxation.mli index 7d540198..1750e368 100644 --- a/asmcomp/branch_relaxation.mli +++ b/asmcomp/branch_relaxation.mli @@ -18,7 +18,7 @@ module Make (T : Branch_relaxation_intf.S) : sig val relax - : Linear.instruction + : Linear.fundecl (* [max_offset_of_out_of_line_code] specifies the furthest distance, measured from the first address immediately after the last instruction of the function, that may be branched to from within the function in diff --git a/asmcomp/branch_relaxation_intf.ml b/asmcomp/branch_relaxation_intf.ml index 57127e51..68596d59 100644 --- a/asmcomp/branch_relaxation_intf.ml +++ b/asmcomp/branch_relaxation_intf.ml @@ -39,6 +39,7 @@ module type S = sig N.B. The only instructions supported are the following: - Lop (Ialloc _) + - Lop (Ipoll _) - Lop (Iintop Icheckbound) - Lop (Iintop_imm (Icheckbound, _)) - Lop (Ispecific _) @@ -55,7 +56,7 @@ module type S = sig val offset_pc_at_branch : distance (* The maximum size of a given instruction. *) - val instr_size : Linear.instruction_desc -> distance + val instr_size : Linear.fundecl -> Linear.instruction_desc -> distance (* Insertion of target-specific code to relax operations that cannot be relaxed generically. It is assumed that these rewrites do not change @@ -64,6 +65,11 @@ module type S = sig : num_bytes:int -> dbginfo:Debuginfo.alloc_dbginfo -> Linear.instruction_desc + + val relax_poll + : return_label:Cmm.label option + -> Linear.instruction_desc + val relax_intop_checkbound : unit -> Linear.instruction_desc diff --git a/asmcomp/cmm.ml b/asmcomp/cmm.ml index 1aaf5c72..85dde45a 100644 --- a/asmcomp/cmm.ml +++ b/asmcomp/cmm.ml @@ -165,6 +165,7 @@ and operation = | Ccmpf of float_comparison | Craise of Lambda.raise_kind | Ccheckbound + | Copaque type expression = Cconst_int of int * Debuginfo.t diff --git a/asmcomp/cmm.mli b/asmcomp/cmm.mli index 851da270..1b0782a4 100644 --- a/asmcomp/cmm.mli +++ b/asmcomp/cmm.mli @@ -162,6 +162,7 @@ and operation = then the index. It results in a bounds error if the index is greater than or equal to the bound. *) + | Copaque (* Sys.opaque_identity *) (** Every basic block should have a corresponding [Debuginfo.t] for its beginning. *) diff --git a/asmcomp/cmm_helpers.ml b/asmcomp/cmm_helpers.ml index ab1445f4..b0140d9c 100644 --- a/asmcomp/cmm_helpers.ml +++ b/asmcomp/cmm_helpers.ml @@ -1329,6 +1329,9 @@ let check_bound safety access_size dbg length a2 k = in Csequence(make_checkbound dbg [max_or_zero a1 dbg; a2], k) +let opaque e dbg = + Cop(Copaque, [e], dbg) + let unaligned_set size ptr idx newval dbg = match (size : Clambda_primitives.memory_access_size) with | Sixteen -> unaligned_set_16 ptr idx newval dbg @@ -1862,7 +1865,7 @@ let send_function arity = let cache = cache in let fun_name = "caml_send" ^ Int.to_string arity in let fun_args = - [obj, typ_val; tag, typ_int; cache, typ_val] + [obj, typ_val; tag, typ_int; cache, typ_addr] @ List.map (fun id -> (id, typ_val)) (List.tl args) in let fun_dbg = placeholder_fun_dbg ~human_name:fun_name in Cfunction diff --git a/asmcomp/cmm_helpers.mli b/asmcomp/cmm_helpers.mli index debc84b4..4fe47dd7 100644 --- a/asmcomp/cmm_helpers.mli +++ b/asmcomp/cmm_helpers.mli @@ -318,6 +318,9 @@ val check_bound : expression -> expression -> expression -> expression +(** Sys.opaque_identity *) +val opaque : expression -> Debuginfo.t -> expression + (** Generic application functions *) (** Get the symbol for the generic application with [n] arguments, and diff --git a/asmcomp/cmm_invariants.ml b/asmcomp/cmm_invariants.ml new file mode 100644 index 00000000..df102df7 --- /dev/null +++ b/asmcomp/cmm_invariants.ml @@ -0,0 +1,180 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Vincent Laviron, OCamlPro *) +(* *) +(* Copyright 2017 OCamlPro SAS *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +[@@@ocaml.warning "-40"] + +module Int = Numbers.Int + +(* Check a number of continuation-related invariants *) + +module Env : sig + type t + + val init : unit -> t + + val handler : t -> cont:int -> arg_num:int -> t + + val jump : t -> cont:int -> arg_num:int -> unit + + val report : Format.formatter -> bool +end = struct + type t = { + bound_handlers : int Int.Map.t; + } + + type error = + | Unbound_handler of { cont: int } + | Multiple_handlers of { cont: int; } + | Wrong_arguments_number of + { cont: int; handler_args: int; jump_args: int; } + + module Error = struct + type t = error + + let compare = Stdlib.compare + end + + module ErrorSet = Set.Make(Error) + + type persistent_state = { + mutable all_handlers : Int.Set.t; + mutable errors : ErrorSet.t; + } + + let state = { + all_handlers = Int.Set.empty; + errors = ErrorSet.empty; + } + + let record_error error = + state.errors <- ErrorSet.add error state.errors + + let unbound_handler cont = + record_error (Unbound_handler { cont; }) + + let multiple_handler cont = + record_error (Multiple_handlers { cont; }) + + let wrong_arguments cont handler_args jump_args = + record_error (Wrong_arguments_number { cont; handler_args; jump_args; }) + + let init () = + state.all_handlers <- Int.Set.empty; + state.errors <- ErrorSet.empty; + { + bound_handlers = Int.Map.empty; + } + + let handler t ~cont ~arg_num = + if Int.Set.mem cont state.all_handlers then multiple_handler cont; + state.all_handlers <- Int.Set.add cont state.all_handlers; + let bound_handlers = Int.Map.add cont arg_num t.bound_handlers in + { bound_handlers; } + + let jump t ~cont ~arg_num = + match Int.Map.find cont t.bound_handlers with + | handler_args -> + if arg_num <> handler_args then + wrong_arguments cont handler_args arg_num + | exception Not_found -> unbound_handler cont + + let print_error ppf error = + match error with + | Unbound_handler { cont } -> + if Int.Set.mem cont state.all_handlers then + Format.fprintf ppf + "Continuation %d was used outside the scope of its handler" + cont + else + Format.fprintf ppf + "Continuation %d was used but never bound" + cont + | Multiple_handlers { cont; } -> + Format.fprintf ppf + "Continuation %d was declared in more than one handler" + cont + | Wrong_arguments_number { cont; handler_args; jump_args } -> + Format.fprintf ppf + "Continuation %d was declared with %d arguments but called with %d" + cont + handler_args + jump_args + + let print_error_newline ppf error = + Format.fprintf ppf "%a@." print_error error + + let report ppf = + if ErrorSet.is_empty state.errors then false + else begin + ErrorSet.iter (fun err -> print_error_newline ppf err) state.errors; + true + end +end + +let rec check env (expr : Cmm.expression) = + match expr with + | Cconst_int _ | Cconst_natint _ | Cconst_float _ | Cconst_symbol _ + | Cvar _ -> + () + | Clet (_, expr, body) + | Clet_mut (_, _, expr, body) -> + check env expr; + check env body + | Cphantom_let (_, _, expr) -> + check env expr + | Cassign (_, expr) -> + check env expr + | Ctuple exprs -> + List.iter (check env) exprs + | Cop (_, args, _) -> + List.iter (check env) args; + | Csequence (expr1, expr2) -> + check env expr1; + check env expr2 + | Cifthenelse (test, _, ifso, _, ifnot, _) -> + check env test; + check env ifso; + check env ifnot + | Cswitch (body, _, branches, _) -> + check env body; + Array.iter (fun (expr, _) -> check env expr) branches + | Ccatch (rec_flag, handlers, body) -> + let env_extended = + List.fold_left + (fun env (cont, args, _, _) -> + Env.handler env ~cont ~arg_num:(List.length args)) + env + handlers + in + check env_extended body; + let env_handler = + match rec_flag with + | Recursive -> env_extended + | Nonrecursive -> env + in + List.iter (fun (_, _, handler, _) -> check env_handler handler) handlers + | Cexit (cont, args) -> + Env.jump env ~cont ~arg_num:(List.length args) + | Ctrywith (body, _, handler, _) -> + (* Jumping from inside a trywith body to outside isn't very nice, + but it's handled correctly by Linearize, as it happens + when compiling match ... with exception ..., for instance, so it is + not reported as an error. *) + check env body; + check env handler + +let run ppf (fundecl : Cmm.fundecl) = + let env = Env.init () in + check env fundecl.fun_body; + Env.report ppf diff --git a/asmcomp/cmm_invariants.mli b/asmcomp/cmm_invariants.mli new file mode 100644 index 00000000..4d1ffa91 --- /dev/null +++ b/asmcomp/cmm_invariants.mli @@ -0,0 +1,36 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Vincent Laviron, OCamlPro *) +(* *) +(* Copyright 2017 OCamlPro SAS *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(* Check a number of continuation-related invariants *) + +(* Currently, this checks that : + - Every use of a continuation occurs within the scope of its handler + - Exit instructions take the same number of arguments as their handler. + - In every function declaration, a given continuation can only be + declared in a single handler. + + This is intended to document what invariants the backend can rely upon. + The first two would trigger errors later, and the last one, while + harmless for now, is not that hard to ensure, could be useful for + future work on the backend, and helped detect a code duplication bug. + + These invariants are not checked by default, but the check can be turned + on with the -dcmm-invariants compilation flag. +*) + +(** [run ppf fundecl] analyses the given function, and returns whether + any errors were encountered (with corresponding error messages printed + on the given formatter). *) + +val run : Format.formatter -> Cmm.fundecl -> bool diff --git a/asmcomp/cmmgen.ml b/asmcomp/cmmgen.ml index b8c8389e..3876da2e 100644 --- a/asmcomp/cmmgen.ml +++ b/asmcomp/cmmgen.ml @@ -424,7 +424,7 @@ let rec transl env e = let args = List.map (transl env) args in send kind met obj args dbg | Ulet(str, kind, id, exp, body) -> - transl_let env str kind id exp body + transl_let env str kind id exp (fun env -> transl env body) | Uphantom_let (var, defining_expr, body) -> let defining_expr = match defining_expr with @@ -785,7 +785,7 @@ and transl_prim_1 env p arg dbg = match p with (* Generic operations *) Popaque -> - transl env arg + opaque (transl env arg) dbg (* Heap operations *) | Pfield n -> get_field env (transl env arg) n dbg @@ -1117,7 +1117,7 @@ and transl_unbox_sized size dbg env exp = | Thirty_two -> transl_unbox_int dbg env Pint32 exp | Sixty_four -> transl_unbox_int dbg env Pint64 exp -and transl_let env str kind id exp body = +and transl_let env str kind id exp transl_body = let dbg = Debuginfo.none in let cexp = transl env exp in let unboxing = @@ -1151,16 +1151,16 @@ and transl_let env str kind id exp body = (* N.B. [body] must still be traversed even if [exp] will never return: there may be constant closures inside that need lifting out. *) begin match str, kind with - | Immutable, _ -> Clet(id, cexp, transl env body) - | Mutable, Pintval -> Clet_mut(id, typ_int, cexp, transl env body) - | Mutable, _ -> Clet_mut(id, typ_val, cexp, transl env body) + | Immutable, _ -> Clet(id, cexp, transl_body env) + | Mutable, Pintval -> Clet_mut(id, typ_int, cexp, transl_body env) + | Mutable, _ -> Clet_mut(id, typ_val, cexp, transl_body env) end | Boxed (boxed_number, false) -> let unboxed_id = V.create_local (VP.name id) in let v = VP.create unboxed_id in let cexp = unbox_number dbg boxed_number cexp in let body = - transl (add_unboxed_id (VP.var id) unboxed_id boxed_number env) body in + transl_body (add_unboxed_id (VP.var id) unboxed_id boxed_number env) in begin match str, boxed_number with | Immutable, _ -> Clet (v, cexp, body) | Mutable, bn -> Clet_mut (v, typ_of_boxed_number bn, cexp, body) @@ -1202,6 +1202,9 @@ and transl_if env (approx : then_else) ifso_dbg arg2 then_dbg then_ else_dbg else_ + | Ulet(str, kind, id, exp, cond) -> + transl_let env str kind id exp (fun env -> + transl_if env approx dbg cond then_dbg then_ else_dbg else_) | Uprim (Psequand, [arg1; arg2], inner_dbg) -> transl_sequand env approx inner_dbg arg1 diff --git a/asmcomp/coloring.ml b/asmcomp/coloring.ml index 897da20d..f55e4bc9 100644 --- a/asmcomp/coloring.ml +++ b/asmcomp/coloring.ml @@ -77,7 +77,7 @@ let allocate_registers() = if not (Reg.is_visited r) then begin Reg.mark_visited r; f r w; - List.iter (fun (r1, w1) -> walk r1 (min w w1)) r.prefer + List.iter (fun (r1, w1) -> walk r1 (Int.min w w1)) r.prefer end in List.iter (fun (r, w) -> walk r w) reg.prefer; Reg.clear_visited_marks () in diff --git a/asmcomp/comballoc.ml b/asmcomp/comballoc.ml index f125366d..f03bb3e6 100644 --- a/asmcomp/comballoc.ml +++ b/asmcomp/comballoc.ml @@ -63,7 +63,7 @@ let rec combine i allocstate = i.arg i.res i.dbg next, allocstate) end | Iop(Icall_ind | Icall_imm _ | Iextcall _ | - Itailcall_ind | Itailcall_imm _) -> + Itailcall_ind | Itailcall_imm _ | Ipoll _) -> let newnext = combine_restart i.next in (instr_cons_debug i.desc i.arg i.res i.dbg newnext, allocstate) diff --git a/asmcomp/dataflow.ml b/asmcomp/dataflow.ml new file mode 100644 index 00000000..02d8685c --- /dev/null +++ b/asmcomp/dataflow.ml @@ -0,0 +1,86 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cambium, INRIA Paris *) +(* *) +(* Copyright 2021 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open Mach + +module type DOMAIN = sig + type t + val bot: t + val join: t -> t -> t + val lessequal: t -> t -> bool +end + +module Backward(D: DOMAIN) = struct + +let analyze ?(exnhandler = fun x -> x) ?(exnescape = D.bot) ~transfer instr = + + let lbls = + (Hashtbl.create 20 : (int, D.t) Hashtbl.t) in + let get_lbl n = + match Hashtbl.find_opt lbls n with None -> D.bot | Some b -> b + and set_lbl n x = + Hashtbl.replace lbls n x in + + let rec before end_ exn i = + match i.desc with + | Iend -> + transfer i ~next:end_ ~exn + | Ireturn | Iop (Itailcall_ind | Itailcall_imm _) -> + transfer i ~next:D.bot ~exn:D.bot + | Iop _ -> + let bx = before end_ exn i.next in + transfer i ~next:bx ~exn + | Iifthenelse(_, ifso, ifnot) -> + let bx = before end_ exn i.next in + let b1 = before bx exn ifso + and b0 = before bx exn ifnot in + transfer i ~next:(D.join b1 b0) ~exn + | Iswitch(_, cases) -> + let bx = before end_ exn i.next in + let b1 = + Array.fold_left + (fun accu case -> D.join accu (before bx exn case)) + D.bot cases in + transfer i ~next:b1 ~exn + | Icatch(rc, handlers, body) -> + let bx = before end_ exn i.next in + begin match rc with + | Cmm.Nonrecursive -> + List.iter + (fun (n, h) -> set_lbl n (before bx exn h)) + handlers + | Cmm.Recursive -> + let update changed (n, h) = + let b0 = get_lbl n in + let b1 = before bx exn h in + if D.lessequal b1 b0 then changed else (set_lbl n b1; true) in + while List.fold_left update false handlers do () done + end; + let b = before bx exn body in + transfer i ~next:b ~exn + | Iexit n -> + transfer i ~next:(get_lbl n) ~exn + | Itrywith(body, handler) -> + let bx = before end_ exn i.next in + let bh = exnhandler (before bx exn handler) in + let bb = before bx bh body in + transfer i ~next:bb ~exn + | Iraise _ -> + transfer i ~next:D.bot ~exn + in + let b = before D.bot exnescape instr in + (b, get_lbl) + +end diff --git a/asmcomp/dataflow.mli b/asmcomp/dataflow.mli new file mode 100644 index 00000000..e722066d --- /dev/null +++ b/asmcomp/dataflow.mli @@ -0,0 +1,90 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cambium, INRIA Paris *) +(* *) +(* Copyright 2021 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(* An abstract domain for dataflow analysis. Defines a type [t] + of abstractions, with lattice operations. *) + +module type DOMAIN = sig + type t + val bot: t + val join: t -> t -> t + val lessequal: t -> t -> bool +end + +(* Build a backward dataflow analysis engine for the given domain. *) + +module Backward(D: DOMAIN) : sig + + val analyze: ?exnhandler: (D.t -> D.t) -> + ?exnescape: D.t -> + transfer: (Mach.instruction -> next: D.t -> exn: D.t -> D.t) -> + Mach.instruction -> + D.t * (int -> D.t) + + (* [analyze ~exnhandler ~transfer instr] performs a backward dataflow + analysis on the Mach instruction [instr], typically a function body. + + It returns a pair of + - the abstract state at the function entry point; + - a mapping from catch handler label to the abstract state at the + beginning of the handler with this label. + + The [transfer] function is called as [transfer i ~next ~exn]. + - [i] is a sub-instruction of [instr]. + - [next] is the abstract state "after" the instruction for + normal control flow, falling through the successor(s) of [i]. + - [exn] is the abstract state "after" the instruction for + exceptional control flow, branching to the nearest exception handler + or exiting the function with an unhandled exception. + + The [transfer] function, then, returns the abstract state "before" + the instruction. The dataflow analysis will, then, propagate this + state "before" as the state "after" the predecessor instructions. + + For compound instructions like [Iifthenelse], the [next] abstract + value that is passed to [transfer] is not the abstract state at + the end of the compound instruction (e.g. after the "then" and "else" + branches have joined), but the join of the abstract states at + the beginning of the sub-instructions. More precisely: + - for [Iifthenelse(tst, ifso, ifnot)], it's the join of the + abstract states at the beginning of the [ifso] and [ifnot] + branches; + - for [Iswitch(tbl, cases)], it's the join of the abstract states + at the beginning of the [cases] branches; + - for [Icatch(recflag, body, handlers)] and [Itrywith(body, handler)], + it's the abstract state at the beginning of [body]. + + The [transfer] function is called for every sub-instruction of [instr], + as many times as needed to reach a fixpoint. Hence, it can record + the results of the analysis at each sub-instruction in a mutable + data structure. For instance, the transfer function for liveness + analysis updates the [live] fields of instructions as a side + effect. + + The optional [exnhandler] argument deals with exception handlers. + This is a function that transforms the abstract state at the + beginning of an exception handler into the exceptional abstract + state for the instructions within the body of the handler. + Typically, for liveness analysis, it takes the registers live at + the beginning of the handler and removes the register + [Proc.loc_exn_bucket] that carries the exception value. If not + specified, [exnhandler] defaults to the identity function. + + The optional [exnescape] argument deals with unhandled exceptions. + It is the abstract state corresponding to exiting the function on an + unhandled exception. It defaults to [D.bot]. + *) + +end diff --git a/asmcomp/deadcode.ml b/asmcomp/deadcode.ml index 887580fa..28fe153f 100644 --- a/asmcomp/deadcode.ml +++ b/asmcomp/deadcode.ml @@ -43,7 +43,7 @@ let rec deadcode i = { i; regs; exits = Int.Set.empty; } | Iop op -> let s = deadcode i.next in - if Proc.op_is_pure op (* no side effects *) + if operation_is_pure op (* no side effects *) && Reg.disjoint_set_array s.regs i.res (* results are not used after *) && not (Proc.regs_are_volatile i.arg) (* no stack-like hard reg *) && not (Proc.regs_are_volatile i.res) (* is involved *) diff --git a/asmcomp/debug/available_regs.ml b/asmcomp/debug/available_regs.ml deleted file mode 100644 index 67f0bdec..00000000 --- a/asmcomp/debug/available_regs.ml +++ /dev/null @@ -1,351 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell and Thomas Refis, Jane Street Europe *) -(* *) -(* Copyright 2013--2017 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -[@@@ocaml.warning "+a-4-9-30-40-41-42"] - -module M = Mach -module R = Reg -module RAS = Reg_availability_set -module RD = Reg_with_debug_info -module V = Backend_var - -(* This pass treats [avail_at_exit] like a "result" structure whereas the - equivalent in [Liveness] is like an "environment". (Which means we need - to be careful not to throw away information about further-out catch - handlers collected in [avail_at_exit].) *) -let avail_at_exit = Hashtbl.create 42 -let avail_at_raise = ref RAS.Unreachable - -let augment_availability_at_raise avail = - avail_at_raise := RAS.inter avail !avail_at_raise - -let check_invariants (instr : M.instruction) ~(avail_before : RAS.t) = - match avail_before with - | Unreachable -> () - | Ok avail_before -> - (* Every register that is live across an instruction should also be - available before the instruction. *) - if not (R.Set.subset instr.live (RD.Set.forget_debug_info avail_before)) - then begin - Misc.fatal_errorf "Live registers not a subset of available registers: \ - live={%a} avail_before=%a missing={%a} insn=%a" - Printmach.regset instr.live - (RAS.print ~print_reg:Printmach.reg) - (RAS.Ok avail_before) - Printmach.regset (R.Set.diff instr.live - (RD.Set.forget_debug_info avail_before)) - Printmach.instr ({ instr with M. next = M.end_instr (); }) - end; - (* Every register that is an input to an instruction should be - available. *) - let args = R.set_of_array instr.arg in - let avail_before_fdi = RD.Set.forget_debug_info avail_before in - if not (R.Set.subset args avail_before_fdi) then begin - Misc.fatal_errorf "Instruction has unavailable input register(s): \ - avail_before=%a avail_before_fdi={%a} inputs={%a} insn=%a" - (RAS.print ~print_reg:Printmach.reg) (RAS.Ok avail_before) - Printmach.regset avail_before_fdi - Printmach.regset args - Printmach.instr ({ instr with M. next = M.end_instr (); }) - end - -(* [available_regs ~instr ~avail_before] calculates, given the registers - "available before" an instruction [instr], the registers that are available - both "across" and immediately after [instr]. This is a forwards dataflow - analysis. - - "available before" can be thought of, at the assembly level, as the set of - registers available when the program counter is equal to the address of the - particular instruction under consideration (that is to say, immediately - prior to the instruction being executed). Inputs to that instruction are - available at this point even if the instruction will clobber them. Results - from the previous instruction are also available at this point. - - "available across" is the registers available during the execution of - some particular instruction. These are the registers "available before" - minus registers that may be clobbered or otherwise invalidated by the - instruction. (The notion of "available across" is only useful for [Iop] - instructions. Recall that some of these may expand into multiple - machine instructions including clobbers, e.g. for [Ialloc].) - - The [available_before] and [available_across] fields of each instruction - is updated by this function. -*) -let rec available_regs (instr : M.instruction) - ~(avail_before : RAS.t) : RAS.t = - check_invariants instr ~avail_before; - instr.available_before <- avail_before; - let avail_across, avail_after = - let ok set = RAS.Ok set in - let unreachable = RAS.Unreachable in - match avail_before with - | Unreachable -> None, unreachable - | Ok avail_before -> - match instr.desc with - | Iend -> None, ok avail_before - | Ireturn -> None, unreachable - | Iop (Itailcall_ind) | Iop (Itailcall_imm _) -> - Some (ok Reg_with_debug_info.Set.empty), unreachable - | Iop (Iname_for_debugger { ident; which_parameter; provenance; - is_assignment; }) -> - (* First forget about any existing debug info to do with [ident] - if the naming corresponds to an assignment operation. *) - let forgetting_ident = - if not is_assignment then - avail_before - else - RD.Set.map (fun reg -> - match RD.debug_info reg with - | None -> reg - | Some debug_info -> - if V.same - (RD.Debug_info.holds_value_of debug_info) ident - then RD.clear_debug_info reg - else reg) - avail_before - in - let avail_after = ref forgetting_ident in - let num_parts_of_value = Array.length instr.arg in - (* Add debug info about [ident], but only for registers that are known - to be available. *) - for part_of_value = 0 to num_parts_of_value - 1 do - let reg = instr.arg.(part_of_value) in - if RD.Set.mem_reg forgetting_ident reg then begin - let regd = - RD.create ~reg - ~holds_value_of:ident - ~part_of_value - ~num_parts_of_value - ~which_parameter - ~provenance - in - avail_after := RD.Set.add regd (RD.Set.filter_reg !avail_after reg) - end - done; - Some (ok avail_before), ok !avail_after - | Iop (Imove | Ireload | Ispill) -> - (* Moves are special: they enable us to propagate names. - No-op moves need to be handled specially---in this case, we may - learn that a given hard register holds the value of multiple - pseudoregisters (all of which have the same value). This makes us - match up properly with [Liveness]. *) - let move_to_same_location = - let move_to_same_location = ref true in - for i = 0 to Array.length instr.arg - 1 do - let arg = instr.arg.(i) in - let res = instr.res.(i) in - (* Note that the register classes must be the same, so we don't - need to check that. *) - if arg.loc <> res.loc then begin - move_to_same_location := false - end - done; - !move_to_same_location - in - let made_unavailable = - if move_to_same_location then - RD.Set.empty - else - RD.Set.made_unavailable_by_clobber avail_before - ~regs_clobbered:instr.res - ~register_class:Proc.register_class - in - let results = - Array.map2 (fun arg_reg result_reg -> - match RD.Set.find_reg_exn avail_before arg_reg with - | exception Not_found -> - assert false (* see second invariant in [check_invariants] *) - | arg_reg -> - RD.create_copying_debug_info ~reg:result_reg - ~debug_info_from:arg_reg) - instr.arg instr.res - in - let avail_across = RD.Set.diff avail_before made_unavailable in - let avail_after = RD.Set.union avail_across (RD.Set.of_array results) in - Some (ok avail_across), ok avail_after - | Iop op -> - (* We split the calculation of registers that become unavailable after - a call into two parts. First: anything that the target marks as - destroyed by the operation, combined with any registers that will - be clobbered by the operation writing out its results. *) - let made_unavailable_1 = - let regs_clobbered = - Array.append (Proc.destroyed_at_oper instr.desc) instr.res - in - RD.Set.made_unavailable_by_clobber avail_before ~regs_clobbered - ~register_class:Proc.register_class - in - (* Second: the cases of (a) allocations and (b) OCaml to OCaml function - calls. In these cases, since the GC may run, registers always - become unavailable unless: - (a) they are "live across" the instruction; and/or - (b) they hold immediates and are assigned to the stack. - For the moment we assume that [Ispecific] instructions do not - run the GC. *) - (* CR-someday mshinwell: Consider factoring this out from here and - [Available_ranges.Make_ranges.end_pos_offset]. *) - let made_unavailable_2 = - match op with - | Icall_ind | Icall_imm _ | Ialloc _ -> - RD.Set.filter (fun reg -> - let holds_immediate = RD.holds_non_pointer reg in - let on_stack = RD.assigned_to_stack reg in - let live_across = Reg.Set.mem (RD.reg reg) instr.live in - let remains_available = - live_across - || (holds_immediate && on_stack) - in - not remains_available) - avail_before - | _ -> RD.Set.empty - in - let made_unavailable = - RD.Set.union made_unavailable_1 made_unavailable_2 - in - let avail_across = RD.Set.diff avail_before made_unavailable in - if M.operation_can_raise op then begin - augment_availability_at_raise (ok avail_across) - end; - let avail_after = - RD.Set.union - (RD.Set.without_debug_info (Reg.set_of_array instr.res)) - avail_across - in - Some (ok avail_across), ok avail_after - | Iifthenelse (_, ifso, ifnot) -> join [ifso; ifnot] ~avail_before - | Iswitch (_, cases) -> join (Array.to_list cases) ~avail_before - | Icatch (recursive, handlers, body) -> - List.iter (fun (nfail, _handler) -> - (* In case there are nested [Icatch] expressions with the same - handler numbers, we rely on the [Hashtbl] shadowing - semantics. *) - Hashtbl.add avail_at_exit nfail unreachable) - handlers; - let avail_after_body = - available_regs body ~avail_before:(ok avail_before) - in - (* CR-someday mshinwell: Consider potential efficiency speedups - (see suggestions from @chambart on GPR#856). *) - let aux (nfail, handler) (nfail', avail_at_top_of_handler) = - assert (nfail = nfail'); - available_regs handler ~avail_before:avail_at_top_of_handler - in - let aux_equal (nfail, avail_before_handler) - (nfail', avail_before_handler') = - assert (nfail = nfail'); - RAS.equal avail_before_handler avail_before_handler' - in - let rec fixpoint avail_at_top_of_handlers = - let avail_after_handlers = - List.map2 aux handlers avail_at_top_of_handlers - in - let avail_at_top_of_handlers' = - List.map (fun (nfail, _handler) -> - match Hashtbl.find avail_at_exit nfail with - | exception Not_found -> assert false (* see above *) - | avail_at_top_of_handler -> nfail, avail_at_top_of_handler) - handlers - in - match recursive with - | Nonrecursive -> avail_after_handlers - | Recursive -> - if List.for_all2 aux_equal avail_at_top_of_handlers - avail_at_top_of_handlers' - then avail_after_handlers - else fixpoint avail_at_top_of_handlers' - in - let init_avail_at_top_of_handlers = - List.map (fun (nfail, _handler) -> - match Hashtbl.find avail_at_exit nfail with - | exception Not_found -> assert false (* see above *) - | avail_at_top_of_handler -> nfail, avail_at_top_of_handler) - handlers - in - let avail_after_handlers = fixpoint init_avail_at_top_of_handlers in - List.iter (fun (nfail, _handler) -> - Hashtbl.remove avail_at_exit nfail) - handlers; - let avail_after = - List.fold_left (fun avail_at_join avail_after_handler -> - RAS.inter avail_at_join avail_after_handler) - avail_after_body - avail_after_handlers - in - None, avail_after - | Iexit nfail -> - let avail_before = ok avail_before in - let avail_at_top_of_handler = - match Hashtbl.find avail_at_exit nfail with - | exception Not_found -> (* also see top of [Icatch] clause above *) - Misc.fatal_errorf "Iexit %d not in scope of Icatch" nfail - | avail_at_top_of_handler -> avail_at_top_of_handler - in - let avail_at_top_of_handler = - RAS.inter avail_at_top_of_handler avail_before - in - Hashtbl.replace avail_at_exit nfail avail_at_top_of_handler; - None, unreachable - | Itrywith (body, handler) -> - let saved_avail_at_raise = !avail_at_raise in - avail_at_raise := unreachable; - let avail_before = ok avail_before in - let after_body = available_regs body ~avail_before in - let avail_before_handler = - match !avail_at_raise with - | Unreachable -> unreachable - | Ok avail_at_raise -> - let without_exn_bucket = - RD.Set.filter_reg avail_at_raise Proc.loc_exn_bucket - in - let with_anonymous_exn_bucket = - RD.Set.add (RD.create_without_debug_info ~reg:Proc.loc_exn_bucket) - without_exn_bucket - in - ok with_anonymous_exn_bucket - in - avail_at_raise := saved_avail_at_raise; - let avail_after = - RAS.inter after_body - (available_regs handler ~avail_before:avail_before_handler) - in - None, avail_after - | Iraise _ -> - let avail_before = ok avail_before in - augment_availability_at_raise avail_before; - None, unreachable - in - instr.available_across <- avail_across; - match instr.desc with - | Iend -> avail_after - | _ -> available_regs instr.next ~avail_before:avail_after - -and join branches ~avail_before = - let avail_before = RAS.Ok avail_before in - let avails = List.map (available_regs ~avail_before) branches in - let avail_after = - match avails with - | [] -> avail_before - | avail::avails -> List.fold_left RAS.inter avail avails - in - None, avail_after - -let fundecl (f : M.fundecl) = - if !Clflags.debug && !Clflags.debug_runavail then begin - assert (Hashtbl.length avail_at_exit = 0); - avail_at_raise := RAS.Unreachable; - let fun_args = R.set_of_array f.fun_args in - let avail_before = RAS.Ok (RD.Set.without_debug_info fun_args) in - ignore ((available_regs f.fun_body ~avail_before) : RAS.t); - end; - f diff --git a/asmcomp/debug/available_regs.mli b/asmcomp/debug/available_regs.mli deleted file mode 100644 index d065d388..00000000 --- a/asmcomp/debug/available_regs.mli +++ /dev/null @@ -1,18 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell and Thomas Refis, Jane Street Europe *) -(* *) -(* Copyright 2013--2017 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -(** Available registers analysis used to determine which variables may be - shown in the debugger. *) - -val fundecl : Mach.fundecl -> Mach.fundecl diff --git a/asmcomp/debug/compute_ranges.ml b/asmcomp/debug/compute_ranges.ml deleted file mode 100644 index 7d40194d..00000000 --- a/asmcomp/debug/compute_ranges.ml +++ /dev/null @@ -1,515 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2014--2019 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -[@@@ocaml.warning "+a-4-30-40-41-42"] - -open! Int_replace_polymorphic_compare - -module L = Linear - -module Make (S : Compute_ranges_intf.S_functor) = struct - module Subrange_state = S.Subrange_state - module Subrange_info = S.Subrange_info - module Range_info = S.Range_info - - let rewrite_label env label = - match Numbers.Int.Map.find label env with - | exception Not_found -> label - | label -> label - - module Subrange = struct - (* CR-soon mshinwell: Check that function epilogues, including returns - in the middle of functions, work ok in the debugger. *) - type t = { - start_pos : L.label; - start_pos_offset : int; - end_pos : L.label; - end_pos_offset : int; - subrange_info : Subrange_info.t; - } - - let create ~(start_insn : L.instruction) - ~start_pos ~start_pos_offset - ~end_pos ~end_pos_offset - ~subrange_info = - match start_insn.desc with - | Llabel _ -> - { start_pos; - start_pos_offset; - end_pos; - end_pos_offset; - subrange_info; - } - | _ -> - Misc.fatal_errorf "Subrange.create: bad [start_insn]: %a" - Printlinear.instr start_insn - - let start_pos t = t.start_pos - let start_pos_offset t = t.start_pos_offset - let end_pos t = t.end_pos - let end_pos_offset t = t.end_pos_offset - let info t = t.subrange_info - - let rewrite_labels t ~env = - let start_pos = rewrite_label env t.start_pos in - let end_pos = rewrite_label env t.end_pos in - if start_pos = end_pos - && t.start_pos_offset = 0 - && t.end_pos_offset = 0 - then None - else - Some { - t with - start_pos; - end_pos; - } - end - - module Range = struct - type t = { - mutable subranges : Subrange.t list; - mutable min_pos_and_offset : (L.label * int) option; - range_info : Range_info.t; - } - - let create range_info = - { subranges = []; - min_pos_and_offset = None; - range_info; - } - - let info t = t.range_info - - let add_subrange t ~subrange = - let start_pos = Subrange.start_pos subrange in - let start_pos_offset = Subrange.start_pos_offset subrange in - begin match t.min_pos_and_offset with - | None -> t.min_pos_and_offset <- Some (start_pos, start_pos_offset) - | Some (min_pos, min_pos_offset) -> - (* This may seem dubious, but is correct by virtue of the way label - counters are allocated sequentially and the fact that, below, - we go through the code from lowest (code) address to highest. As - such the label with the highest integer value should be the one with - the highest address, and vice-versa. (Note that we also exploit the - ordering when constructing DWARF-4 location lists, to ensure that - they are sorted in increasing program counter order by start - address.) *) - let c = compare start_pos min_pos in - if c < 0 - || (c = 0 && start_pos_offset < min_pos_offset) - then begin - t.min_pos_and_offset <- Some (start_pos, start_pos_offset) - end - end; - t.subranges <- subrange::t.subranges - - let estimate_lowest_address t = - (* See assumption described in compute_ranges_intf.ml. *) - t.min_pos_and_offset - - let fold t ~init ~f = - List.fold_left f init t.subranges - - let no_subranges t = - match t.subranges with - | [] -> true - | _ -> false - - let rewrite_labels_and_remove_empty_subranges t ~env = - let subranges = - List.filter_map (fun subrange -> - Subrange.rewrite_labels subrange ~env) - t.subranges - in - match subranges with - | [] -> - { t with - subranges; - min_pos_and_offset = None; - } - | subranges -> - let min_pos_and_offset = - Option.map - (fun (label, offset) -> rewrite_label env label, offset) - t.min_pos_and_offset - in - { t with - subranges; - min_pos_and_offset; - } - end - - type t = { - ranges : Range.t S.Index.Tbl.t; - } - - module KM = S.Key.Map - module KS = S.Key.Set - - (* Whilst this pass is not DWARF-specific, the output of this pass uses - the conventions of the DWARF specification (e.g. DWARF-4 spec. - section 2.6.2, page 30) in the sense that starting addresses of ranges - are treated as inclusive and ending addresses as exclusive. - - Imagine that, for a given [key], the program counter (PC) is exactly at the - start of [insn]; that instruction has not yet been executed. Assume - a immediately-previous instruction exists called [prev_insn]. Intuitively, - this function calculates which available subranges are to start and stop at - that point, but these notions are subtle. - - There are eight cases, referenced in the code below. - - 1. First four cases: [key] is currently unavailable, i.e. it is not a - member of (roughly speaking) [S.available_across prev_insn]. - - (a) [key] is not in [S.available_before insn] and neither is it in - [S.available_across insn]. There is nothing to do. - - (b) [key] is not in [S.available_before insn] but it is in - [S.available_across insn]. A new range is created with the starting - position being one byte after the first machine instruction of [insn] - and left open. - - It might seem like this case 1 (b) is impossible, likewise for 2 (b) - below, since "available across" should always be a subset of - "available before". However this does not hold in general: see the - comment in available_ranges_vars.ml. - - (c) [key] is in [S.available_before insn] but it is not in - [S.available_across insn]. A new range is created with the starting - position being the first machine instruction of [insn] and the ending - position being the next machine address after that. - - (d) [key] is in [S.available_before insn] and it is also in - [S.available_across insn]. A new range is created with the starting - position being the first machine instruction of [insn] and left open. - - 2. Second four cases: [key] is already available, i.e. a member of - [S.available_across prev_insn]. - - (a) [key] is not in [S.available_before insn] and neither is it in - [S.available_across insn]. The range endpoint is given as the address - of the first machine instruction of [insn]. Since endpoint bounds are - exclusive (see above) then [key] will not be shown as available when - the debugger is standing on [insn]. - - (b) [key] is not in [S.available_before insn] but it is in - [S.available_across insn]. The range endpoint is given as the address - of the first machine instruction of [insn]; and a new range is opened - in the same way as for case 1 (b), above. - - (c) [key] is in [S.available_before insn] but it is not in - [S.available_across insn]. This will only happen when calculating - variables' available ranges for operation (i.e. [Lop]) instructions - (for example calls or allocations). To give a good user experience it - is necessary to show availability when the debugger is standing on the - very first instruction of the operation but not thereafter. As such we - terminate the range one byte beyond the first machine instruction of - [insn]. - - (d) [key] is in [S.available_before insn] and it is also in - it is in [S.available_across insn]. The existing range remains open. - *) - - type action = - | Open_one_byte_subrange - | Open_subrange - | Open_subrange_one_byte_after - | Close_subrange - | Close_subrange_one_byte_after - - (* CR mshinwell: Move to [Clflags] *) - let check_invariants = ref true - - let actions_at_instruction ~(insn : L.instruction) - ~(prev_insn : L.instruction option) = - let available_before = S.available_before insn in - let available_across = S.available_across insn in - let opt_available_across_prev_insn = - match prev_insn with - | None -> KS.empty - | Some prev_insn -> S.available_across prev_insn - in - let case_1b = - KS.diff available_across - (KS.union opt_available_across_prev_insn available_before) - in - let case_1c = - KS.diff available_before - (KS.union opt_available_across_prev_insn available_across) - in - let case_1d = - KS.diff (KS.inter available_before available_across) - opt_available_across_prev_insn - in - let case_2a = - KS.diff opt_available_across_prev_insn - (KS.union available_before available_across) - in - let case_2b = - KS.inter opt_available_across_prev_insn - (KS.diff available_across available_before) - in - let case_2c = - KS.diff - (KS.inter opt_available_across_prev_insn available_before) - available_across - in - let handle case action result = - (* We use [K.all_parents] here to circumvent a potential performance - problem. In the case of lexical blocks, there may be long chains - of blocks and their parents, yet the innermost block determines the - rest of the chain. As such [S] (which comes from - lexical_block_ranges.ml) only needs to use the innermost blocks in - the "available before" sets, keeping things fast---but we still - populate ranges for all parent blocks, thus avoiding any - post-processing, by using [K.all_parents] here. *) - KS.fold (fun key result -> - List.fold_left (fun result key -> - (key, action) :: result) - result - (key :: (S.Key.all_parents key))) - case - result - in - let actions = - (* Ranges must be closed before they are opened---otherwise, when a - variable moves between registers at a range boundary, we might end up - with no open range for that variable. Note that the pipeline below - constructs the [actions] list in reverse order---later functions in - the pipeline produce actions nearer the head of the list. *) - [] - |> handle case_1b Open_subrange_one_byte_after - |> handle case_1c Open_one_byte_subrange - |> handle case_1d Open_subrange - |> handle case_2a Close_subrange - |> handle case_2b Open_subrange_one_byte_after - |> handle case_2b Close_subrange - |> handle case_2c Close_subrange_one_byte_after - in - let must_restart = - if S.must_restart_ranges_upon_any_change () - && match actions with - | [] -> false - | _::_ -> true - then - KS.inter opt_available_across_prev_insn available_before - else - KS.empty - in - actions, must_restart - - let rec process_instruction t (fundecl : L.fundecl) - ~(first_insn : L.instruction) ~(insn : L.instruction) - ~(prev_insn : L.instruction option) - ~currently_open_subranges ~subrange_state = - let used_label = ref None in - let get_label () = - match !used_label with - | Some label_and_insn -> label_and_insn - | None -> - (* Note that we can't reuse an existing label in the code since we rely - on the ordering of range-related labels. *) - let label = Cmm.new_label () in - let label_insn : L.instruction = - { desc = Llabel label; - next = insn; - arg = [| |]; - res = [| |]; - dbg = insn.dbg; - live = insn.live; - } - in - used_label := Some (label, label_insn); - label, label_insn - in - let open_subrange key ~start_pos_offset ~currently_open_subranges = - (* If the range is later discarded, the inserted label may actually be - useless, but this doesn't matter. It does not generate any code. *) - let label, label_insn = get_label () in - KM.add key (label, start_pos_offset, label_insn) currently_open_subranges - in - let close_subrange key ~end_pos_offset ~currently_open_subranges = - match KM.find key currently_open_subranges with - | exception Not_found -> - Misc.fatal_errorf "No subrange is open for key %a" - S.Key.print key - | start_pos, start_pos_offset, start_insn -> - let currently_open_subranges = KM.remove key currently_open_subranges in - match Range_info.create fundecl key ~start_insn with - | None -> currently_open_subranges - | Some (index, range_info) -> - let range = - match S.Index.Tbl.find t.ranges index with - | range -> range - | exception Not_found -> - let range = Range.create range_info in - S.Index.Tbl.add t.ranges index range; - range - in - let label, _label_insn = get_label () in - let subrange_info = Subrange_info.create key subrange_state in - let subrange = - Subrange.create ~start_insn - ~start_pos ~start_pos_offset - ~end_pos:label ~end_pos_offset - ~subrange_info - in - Range.add_subrange range ~subrange; - currently_open_subranges - in - let actions, must_restart = actions_at_instruction ~insn ~prev_insn in - (* Restart ranges if needed *) - let currently_open_subranges = - KS.fold (fun key currently_open_subranges -> - let currently_open_subranges = - close_subrange key ~end_pos_offset:0 ~currently_open_subranges - in - open_subrange key ~start_pos_offset:0 ~currently_open_subranges) - must_restart - currently_open_subranges - in - (* Apply actions *) - let currently_open_subranges = - List.fold_left (fun currently_open_subranges (key, (action : action)) -> - match action with - | Open_one_byte_subrange -> - let currently_open_subranges = - open_subrange key ~start_pos_offset:0 ~currently_open_subranges - in - close_subrange key ~end_pos_offset:1 ~currently_open_subranges - | Open_subrange -> - open_subrange key ~start_pos_offset:0 ~currently_open_subranges - | Open_subrange_one_byte_after -> - open_subrange key ~start_pos_offset:1 ~currently_open_subranges - | Close_subrange -> - close_subrange key ~end_pos_offset:0 ~currently_open_subranges - | Close_subrange_one_byte_after -> - close_subrange key ~end_pos_offset:1 ~currently_open_subranges) - currently_open_subranges - actions - in - (* Close all subranges if at last instruction *) - let currently_open_subranges = - match insn.desc with - | Lend -> - let currently_open_subranges = - KM.fold (fun key _ currently_open_subranges -> - close_subrange key ~end_pos_offset:0 ~currently_open_subranges) - currently_open_subranges - currently_open_subranges - in - assert (KM.is_empty currently_open_subranges); - currently_open_subranges - | _ -> currently_open_subranges - in - let first_insn = - match !used_label with - | None -> first_insn - | Some (_label, label_insn) -> - assert (label_insn.L.next == insn); - (* (Note that by virtue of [Lprologue], we can insert labels prior to - the first assembly instruction of the function.) *) - begin match prev_insn with - | None -> - (* The label becomes the new first instruction. *) - label_insn - | Some prev_insn -> - assert (prev_insn.L.next == insn); - prev_insn.next <- label_insn; - first_insn - end - in - if !check_invariants then begin - let currently_open_subranges = - KS.of_list ( - List.map (fun (key, _datum) -> key) - (KM.bindings currently_open_subranges)) - in - let should_be_open = S.available_across insn in - let not_open_but_should_be = - KS.diff should_be_open currently_open_subranges - in - if not (KS.is_empty not_open_but_should_be) then begin - Misc.fatal_errorf "%s: ranges for %a are not open across the following \ - instruction:\n%a\navailable_across:@ %a\n\ - currently_open_subranges: %a" - fundecl.fun_name - KS.print not_open_but_should_be - Printlinear.instr { insn with L.next = L.end_instr; } - KS.print should_be_open - KS.print currently_open_subranges - end - end; - match insn.desc with - | Lend -> first_insn - | Lprologue | Lop _ | Lreloadretaddr | Lreturn | Llabel _ - | Lbranch _ | Lcondbranch _ | Lcondbranch3 _ | Lswitch _ - | Lentertrap | Lpushtrap _ | Lpoptrap | Ladjust_trap_depth _ - | Lraise _ -> - let subrange_state = - Subrange_state.advance_over_instruction subrange_state insn - in - process_instruction t fundecl ~first_insn ~insn:insn.next - ~prev_insn:(Some insn) ~currently_open_subranges ~subrange_state - - let process_instructions t fundecl ~first_insn = - let subrange_state = Subrange_state.create () in - process_instruction t fundecl ~first_insn ~insn:first_insn - ~prev_insn:None ~currently_open_subranges:KM.empty ~subrange_state - - let all_indexes t = - S.Index.Set.of_list (List.map fst (S.Index.Tbl.to_list t.ranges)) - - let empty = - { ranges = S.Index.Tbl.create 1; - } - - let create (fundecl : L.fundecl) = - let t = - { ranges = S.Index.Tbl.create 42; - } - in - let first_insn = - process_instructions t fundecl ~first_insn:fundecl.fun_body - in - let fundecl : L.fundecl = - { fundecl with fun_body = first_insn; } - in - t, fundecl - - let iter t ~f = - S.Index.Tbl.iter (fun index range -> f index range) - t.ranges - - let fold t ~init ~f = - S.Index.Tbl.fold (fun index range acc -> f acc index range) - t.ranges - init - - let find t index = S.Index.Tbl.find t.ranges index - - let rewrite_labels_and_remove_empty_subranges_and_ranges t ~env = - let ranges = S.Index.Tbl.create 42 in - S.Index.Tbl.iter (fun index range -> - let range = - Range.rewrite_labels_and_remove_empty_subranges range ~env - in - if not (Range.no_subranges range) then begin - S.Index.Tbl.add ranges index range - end) - t.ranges; - { ranges; - } -end diff --git a/asmcomp/debug/compute_ranges.mli b/asmcomp/debug/compute_ranges.mli deleted file mode 100644 index 695529f3..00000000 --- a/asmcomp/debug/compute_ranges.mli +++ /dev/null @@ -1,28 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2014--2018 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -(** Coalescing of per-instruction information into possibly-discontiguous - regions of code delimited by labels. This is used for collating - register availability and lexical block scoping information into a - concise form. *) - -[@@@ocaml.warning "+a-4-30-40-41-42"] - -module Make (S : Compute_ranges_intf.S_functor) - : Compute_ranges_intf.S - with module Index := S.Index - with module Key := S.Key - with module Subrange_state := S.Subrange_state - with module Subrange_info := S.Subrange_info - with module Range_info := S.Range_info diff --git a/asmcomp/debug/compute_ranges_intf.ml b/asmcomp/debug/compute_ranges_intf.ml deleted file mode 100644 index 1fb4bdb6..00000000 --- a/asmcomp/debug/compute_ranges_intf.ml +++ /dev/null @@ -1,274 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2014--2019 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -[@@@ocaml.warning "+a-4-30-40-41-42"] - -(** This file defines types that are used to specify the interface of - [Compute_ranges]. The description of [Compute_ranges] is: - - "Coalescing of per-instruction information into possibly-discontiguous - regions of code delimited by labels. This is used for collating register - availability and lexical block scoping information into a concise form." - - [Compute_ranges] defines a functor, whose argument has type [S_functor], and - whose result has type [S]. Both [S_functor] and [S] are defined here. - - It is suggested that those unfamiliar with this module start by reading - the documentation on module type [S], below. -*) - -module L = Linear - -(** The type of caller-defined contextual state associated with subranges. - This may be used to track information throughout the range-computing - process. *) -module type S_subrange_state = sig - type t - - val create : unit -> t - val advance_over_instruction : t -> L.instruction -> t -end - -(** The type of caller-defined information associated with subranges. *) -module type S_subrange_info = sig - type t - type key - type subrange_state - - val create : key -> subrange_state -> t -end - -(** The type of caller-defined information associated with ranges. *) -module type S_range_info = sig - type t - type key - type index - - val create - : L.fundecl - -> key - -> start_insn:L.instruction - -> (index * t) option -end - -(** This module type specifies what the caller has to provide in order to - instantiate a module to compute ranges. *) -module type S_functor = sig - (** The module [Index] is used to filter and group the generated subranges. - Inclusion of a computed subrange in the result is conditional upon the - existence of an index that can be associated to it. To give a concrete - example, the keys associated to ranges might be pseudoregisters, and the - indexes variable names (c.f. [Available_ranges_vars]). Every register that - is not known to hold the value of some variable is dropped from the - result. - - As the name suggests, values of type [Index.t] also serve as indices for - accessing ranges in the result. The result may actually contain no - reference to keys (only [Subrange_info.t] may reliably contain it), and - subranges with different keys will be coalesced into a single range if all - their keys are associated to the same index. *) - module Index : Identifiable.S - - (** The module [Key] corresponds to the identifiers that define the ranges in - [Linear] instructions. Each instruction should have two sets of keys, - [available_before] and [available_across], with accessor functions of - these names being provided to retrieve them. The notion of "availability" - is not prescribed. The availability sets are used to compute subranges - associated to each key. *) - module Key : sig - (** The type of identifiers that define ranges. *) - type t - - module Set : sig - include Set.S with type elt = t - val print : Format.formatter -> t -> unit - end - - module Map : Map.S with type key = t - - (** Print a representation (typically sexp) of the given key to the given - formatter. *) - val print : Format.formatter -> t -> unit - - (** In some situations, for performance reasons, an "available" set may only - contain a subset of all keys that need to be tracked. For example, when - using a notion of availability that describes which lexical block a - given instruction lies in, using a standard notion of nested lexical - blocks, the innermost lexical block uniquely determines the chain of its - parents. (This is exploited in [Lexical_block_ranges].) The - [all_parents] function must return, given an "available" [key], all - those other keys that are also available and uniquely determined by - [key]. *) - val all_parents : t -> t list - end - - (** The module [Range_info] is used to store additional information on a range - that is associated to a range at its creation and can be retrieved from - the result. The association between keys and indices is also done here: - [Range_info.create] serves both as a map between keys and indices; and - also as the creator of the [Range_info.t] structure. When several - subranges are contained in a single range, the associated [Range_info.t] - will correspond to the first closed subrange. *) - module Range_info : S_range_info - with type key := Key.t - with type index := Index.t - - (** The module [Subrange_state] describes information that needs to be - propagated and passed to [Subrange_info.create]. The state that will be - used for subrange creation is the state at the end of the subrange, not at - the beginning. *) - module Subrange_state : S_subrange_state - - (** The module [Subrange_info] has a similar purpose to [Range_info], but for - subranges. Its distinguishing property is that it can store information - about its context using the additional [subrange_state] parameter of its - [create] function. *) - module Subrange_info : S_subrange_info - with type key := Key.t - with type subrange_state := Subrange_state.t - - (** How to retrieve from an instruction those keys that are available - immediately before the instruction starts executing. *) - val available_before : L.instruction -> Key.Set.t - - (** How to retrieve from an instruction those keys that are available - between the points at which the instruction reads its arguments and - writes its results. *) - val available_across : L.instruction -> Key.Set.t - - (** This [must_restart_ranges_upon_any_change] boolean exists because some - consumers of the range information may require that two subranges are - disjoint rather than including one in another. When this function returns - [true], whenever a subrange is opened or closed, all other overlapping - subranges will be split in two at the same point. *) - val must_restart_ranges_upon_any_change : unit -> bool -end - -(** This module type is the result type of the [Compute_ranges.Make] functor. - - The _ranges_ being computed are composed of contiguous _subranges_ delimited - by two labels (of type [Linear.label]). These labels will be added by - this pass to the code being inspected, which is why the [create] function in - the result of the functor returns not only the ranges but also the updated - function with the labels added. The [start_pos_offset] and [end_pos_offset] - components of the subranges are there to allow a distinction between ranges - starting (or ending) right at the start of the corresponding instruction - (offset of zero), and ranges starting or ending one byte after the actual - instruction (offset of one). *) -module type S = sig - (** Corresponds to [Index] in the [S_functor] module type. *) - module Index : Identifiable.S - - (** Corresponds to [Key] in the [S_functor] module type. *) - module Key : sig - type t - module Set : Set.S with type elt = t - module Map : Map.S with type key = t - end - - (** Corresponds to [Subrange_state] in the [S_functor] module type. *) - module Subrange_state : S_subrange_state - - (** Corresponds to [Subrange_info] in the [S_functor] module type. *) - module Subrange_info : S_subrange_info - with type key := Key.t - with type subrange_state := Subrange_state.t - - (** Corresponds to [Range_info] in the [S_functor] module type. *) - module Range_info : S_range_info - with type key := Key.t - with type index := Index.t - - module Subrange : sig - (** The type of subranges. Each subrange is a contiguous region of - code delimited by labels. *) - type t - - (** The caller's information about the subrange. *) - val info : t -> Subrange_info.t - - (** The label at the start of the range. *) - val start_pos : t -> Linear.label - - (** How many bytes from the label at [start_pos] the range actually - commences. If this value is zero, then the first byte of the range - has the address of the label given by [start_pos]. *) - val start_pos_offset : t -> int - - (** The label at the end of the range. *) - val end_pos : t -> Linear.label - - (** Like [start_pos_offset], but analogously for the end of the range. (The - sense is not inverted; a positive [end_pos_offset] means the range ends - at an address higher than the address of the [end_pos], just like a - positive [start_pos_offset] means the range starts at an address higher - than the [start_pos]. *) - val end_pos_offset : t -> int - end - - module Range : sig - (** The type of ranges. Each range is a list of subranges, so a - possibly-discontiguous region of code. *) - type t - - (** The caller's information about the range. *) - val info : t -> Range_info.t - - (** Estimate the pair of ([start_pos], [start_pos_offset]) (c.f. [Subrange], - above) found amongst the given ranges that yields the lowest machine - address. The assumption is made that no [start_pos_offset] or - [end_pos_offset] will cause the corresponding extremity of a range to - cross an extremity of any other range. (This should be satisfied in - typical uses because the offsets are typically zero or one.) If there - are no ranges supplied then [None] is returned. *) - val estimate_lowest_address : t -> (Linear.label * int) option - - (** Fold over all subranges within the given range. *) - val fold - : t - -> init:'a - -> f:('a -> Subrange.t -> 'a) - -> 'a - end - - (** The type holding information on computed ranges. *) - type t - - (** A value of type [t] that holds no range information. *) - val empty : t - - (** Compute ranges for the code in the given linearized function - declaration, returning the ranges as a value of type [t] and the - rewritten code that must go forward for emission. *) - val create : Linear.fundecl -> t * Linear.fundecl - - (** Iterate through ranges. Each range is associated with an index. *) - val iter : t -> f:(Index.t -> Range.t -> unit) -> unit - - (** Like [iter], but a fold. *) - val fold : t -> init:'a -> f:('a -> Index.t -> Range.t -> 'a) -> 'a - - (** Find the range for the given index, or raise an exception. *) - val find : t -> Index.t -> Range.t - - (** All indexes for which the given value of type [t] contains ranges. *) - val all_indexes : t -> Index.Set.t - - (** An internal function used by [Coalesce_labels]. - The [env] should come from [Coalesce_labels.fundecl]. *) - val rewrite_labels_and_remove_empty_subranges_and_ranges - : t - -> env:int Numbers.Int.Map.t - -> t -end diff --git a/asmcomp/debug/reg_availability_set.ml b/asmcomp/debug/reg_availability_set.ml deleted file mode 100644 index fbff598d..00000000 --- a/asmcomp/debug/reg_availability_set.ml +++ /dev/null @@ -1,111 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2016--2017 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -[@@@ocaml.warning "+a-4-9-30-40-41-42"] - -module RD = Reg_with_debug_info -module V = Backend_var - -type t = - | Ok of RD.Set.t - | Unreachable - -let inter regs1 regs2 = - match regs1, regs2 with - | Unreachable, _ -> regs2 - | _, Unreachable -> regs1 - | Ok avail1, Ok avail2 -> - let result = - RD.Set.fold (fun reg1 result -> - match RD.Set.find_reg_exn avail2 (RD.reg reg1) with - | exception Not_found -> result - | reg2 -> - let debug_info1 = RD.debug_info reg1 in - let debug_info2 = RD.debug_info reg2 in - let debug_info = - match debug_info1, debug_info2 with - | None, None -> None - (* Example for this next case: the value of a mutable variable x - is copied into another variable y; then there is a conditional - where on one branch x is assigned and on the other branch it - is not. This means that on the former branch we have - forgotten about y holding the value of x; but we have not on - the latter. At the join point we must have forgotten the - information. *) - | None, Some _ | Some _, None -> None - | Some debug_info1, Some debug_info2 -> - if RD.Debug_info.compare debug_info1 debug_info2 = 0 then - Some debug_info1 - else - None - in - let reg = - RD.create_with_debug_info ~reg:(RD.reg reg1) - ~debug_info - in - RD.Set.add reg result) - avail1 - RD.Set.empty - in - Ok result - -let equal t1 t2 = - match t1, t2 with - | Unreachable, Unreachable -> true - | Unreachable, Ok _ | Ok _, Unreachable -> false - | Ok regs1, Ok regs2 -> RD.Set.equal regs1 regs2 - -let canonicalise availability = - match availability with - | Unreachable -> Unreachable - | Ok availability -> - let regs_by_ident = V.Tbl.create 42 in - RD.Set.iter (fun reg -> - match RD.debug_info reg with - | None -> () - | Some debug_info -> - let name = RD.Debug_info.holds_value_of debug_info in - if not (V.persistent name) then begin - match V.Tbl.find regs_by_ident name with - | exception Not_found -> V.Tbl.add regs_by_ident name reg - | (reg' : RD.t) -> - (* We prefer registers that are assigned to the stack since - they probably give longer available ranges (less likely to - be clobbered). *) - match RD.location reg, RD.location reg' with - | Reg _, Stack _ - | Reg _, Reg _ - | Stack _, Stack _ - | _, Unknown - | Unknown, _ -> () - | Stack _, Reg _ -> - V.Tbl.remove regs_by_ident name; - V.Tbl.add regs_by_ident name reg - end) - availability; - let result = - V.Tbl.fold (fun _ident reg availability -> - RD.Set.add reg availability) - regs_by_ident - RD.Set.empty - in - Ok result - -let print ~print_reg ppf = function - | Unreachable -> Format.fprintf ppf "" - | Ok availability -> - Format.fprintf ppf "{%a}" - (Format.pp_print_list ~pp_sep:(fun ppf () -> Format.fprintf ppf ",@ ") - (Reg_with_debug_info.print ~print_reg)) - (RD.Set.elements availability) diff --git a/asmcomp/debug/reg_availability_set.mli b/asmcomp/debug/reg_availability_set.mli deleted file mode 100644 index ba24a02f..00000000 --- a/asmcomp/debug/reg_availability_set.mli +++ /dev/null @@ -1,37 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2016--2017 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -(** Register availability sets. *) - -type t = - | Ok of Reg_with_debug_info.Set.t - | Unreachable - -val inter : t -> t -> t -(** Intersection of availabilities. *) - -val canonicalise : t -> t -(** Return a subset of the given availability set which contains no registers - that are not associated with debug info (and holding values of - non-persistent identifiers); and where no two registers share the same - location. *) - -val equal : t -> t -> bool - -val print - : print_reg:(Format.formatter -> Reg.t -> unit) - -> Format.formatter - -> t - -> unit -(** For debugging purposes only. *) diff --git a/asmcomp/debug/reg_with_debug_info.ml b/asmcomp/debug/reg_with_debug_info.ml deleted file mode 100644 index 3dd0ce0c..00000000 --- a/asmcomp/debug/reg_with_debug_info.ml +++ /dev/null @@ -1,200 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2016--2017 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -[@@@ocaml.warning "+a-4-9-30-40-41-42"] - -module V = Backend_var - -module Debug_info = struct - type t = { - holds_value_of : V.t; - part_of_value : int; - num_parts_of_value : int; - which_parameter : int option; - provenance : unit option; - } - - let compare t1 t2 = - let c = V.compare t1.holds_value_of t2.holds_value_of in - if c <> 0 then c - else - Stdlib.compare - (t1.part_of_value, t1.num_parts_of_value, t1.which_parameter) - (t2.part_of_value, t2.num_parts_of_value, t2.which_parameter) - - let holds_value_of t = t.holds_value_of - let part_of_value t = t.part_of_value - let num_parts_of_value t = t.num_parts_of_value - let which_parameter t = t.which_parameter - let provenance t = t.provenance - - let print ppf t = - Format.fprintf ppf "%a" V.print t.holds_value_of; - if not (t.part_of_value = 0 && t.num_parts_of_value = 1) then begin - Format.fprintf ppf "(%d/%d)" t.part_of_value t.num_parts_of_value - end; - begin match t.which_parameter with - | None -> () - | Some index -> Format.fprintf ppf "[P%d]" index - end -end - -module T = struct - type t = { - reg : Reg.t; - debug_info : Debug_info.t option; - } - - module Order = struct - type t = Reg.t - let compare (t1 : t) (t2 : t) = t1.stamp - t2.stamp - end - - let compare t1 t2 = - Order.compare t1.reg t2.reg -end - -include T - -type reg_with_debug_info = t - -let create ~reg ~holds_value_of ~part_of_value ~num_parts_of_value - ~which_parameter ~provenance = - assert (num_parts_of_value >= 1); - assert (part_of_value >= 0 && part_of_value < num_parts_of_value); - assert (match which_parameter with None -> true | Some index -> index >= 0); - let debug_info : Debug_info.t = - { holds_value_of; - part_of_value; - num_parts_of_value; - which_parameter; - provenance; - } - in - { reg; - debug_info = Some debug_info; - } - -let create_with_debug_info ~reg ~debug_info = - { reg; - debug_info; - } - -let create_without_debug_info ~reg = - { reg; - debug_info = None; - } - -let create_copying_debug_info ~reg ~debug_info_from = - { reg; - debug_info = debug_info_from.debug_info; - } - -let reg t = t.reg -let location t = t.reg.loc - -let holds_pointer t = - match t.reg.typ with - | Addr | Val -> true - | Int | Float -> false - -let holds_non_pointer t = not (holds_pointer t) - -let assigned_to_stack t = - match t.reg.loc with - | Stack _ -> true - | Reg _ | Unknown -> false - -let regs_at_same_location (reg1 : Reg.t) (reg2 : Reg.t) ~register_class = - (* We need to check the register classes too: two locations both saying - "stack offset N" might actually be different physical locations, for - example if one is of class "Int" and another "Float" on amd64. - [register_class] will be [Proc.register_class], but cannot be here, - due to a circular dependency. *) - reg1.loc = reg2.loc - && register_class reg1 = register_class reg2 - -let at_same_location t (reg : Reg.t) ~register_class = - regs_at_same_location t.reg reg ~register_class - -let debug_info t = t.debug_info - -let clear_debug_info t = - { t with debug_info = None; } - -module Order_distinguishing_names_and_locations = struct - type nonrec t = t - - let compare t1 t2 = - match t1.debug_info, t2.debug_info with - | None, None -> 0 - | None, Some _ -> -1 - | Some _, None -> 1 - | Some di1, Some di2 -> - let c = V.compare di1.holds_value_of di2.holds_value_of in - if c <> 0 then c - else Stdlib.compare t1.reg.loc t2.reg.loc -end - -module Set_distinguishing_names_and_locations = - Set.Make (Order_distinguishing_names_and_locations) - -module Map_distinguishing_names_and_locations = - Map.Make (Order_distinguishing_names_and_locations) - -module Set = struct - include Set.Make (T) - - let of_array elts = - of_list (Array.to_list elts) - - let forget_debug_info t = - fold (fun t acc -> Reg.Set.add (reg t) acc) t Reg.Set.empty - - let without_debug_info regs = - Reg.Set.fold (fun reg acc -> add (create_without_debug_info ~reg) acc) - regs - empty - - let made_unavailable_by_clobber t ~regs_clobbered ~register_class = - Reg.Set.fold (fun reg acc -> - let made_unavailable = - filter (fun reg' -> - regs_at_same_location reg'.reg reg ~register_class) - t - in - union made_unavailable acc) - (Reg.set_of_array regs_clobbered) - (* ~init:*)empty - - let mem_reg t (reg : Reg.t) = - exists (fun t -> t.reg.stamp = reg.stamp) t - - let filter_reg t (reg : Reg.t) = - filter (fun t -> t.reg.stamp <> reg.stamp) t - - (* CR-someday mshinwell: Well, it looks like we should have used a map. - mshinwell: Also see @chambart's suggestion on GPR#856. *) - let find_reg_exn t (reg : Reg.t) = - match elements (filter (fun t -> t.reg.stamp = reg.stamp) t) with - | [] -> raise Not_found - | [reg] -> reg - | _ -> assert false -end - -let print ~print_reg ppf t = - match t.debug_info with - | None -> Format.fprintf ppf "%a" print_reg t.reg - | Some debug_info -> - Format.fprintf ppf "%a(%a)" print_reg t.reg Debug_info.print debug_info diff --git a/asmcomp/debug/reg_with_debug_info.mli b/asmcomp/debug/reg_with_debug_info.mli deleted file mode 100644 index b989bdeb..00000000 --- a/asmcomp/debug/reg_with_debug_info.mli +++ /dev/null @@ -1,112 +0,0 @@ -(**************************************************************************) -(* *) -(* OCaml *) -(* *) -(* Mark Shinwell, Jane Street Europe *) -(* *) -(* Copyright 2016--2017 Jane Street Group LLC *) -(* *) -(* All rights reserved. This file is distributed under the terms of *) -(* the GNU Lesser General Public License version 2.1, with the *) -(* special exception on linking described in the file LICENSE. *) -(* *) -(**************************************************************************) - -(** Registers equipped with information used for generating debugging - information. *) - -module Debug_info : sig - type t - - val compare : t -> t -> int - - val holds_value_of : t -> Backend_var.t - (** The identifier that the register holds (part of) the value of. *) - - val part_of_value : t -> int - val num_parts_of_value : t -> int - - val which_parameter : t -> int option - (** If the register corresponds to a function parameter, the value returned - is the zero-based index of said parameter; otherwise it is [None]. *) - - val provenance : t -> unit option -end - -type t - -type reg_with_debug_info = t - -val create - : reg:Reg.t - -> holds_value_of:Backend_var.t - -> part_of_value:int - -> num_parts_of_value:int - -> which_parameter:int option - -> provenance:unit option - -> t - -val create_with_debug_info : reg:Reg.t -> debug_info:Debug_info.t option -> t - -val create_without_debug_info : reg:Reg.t -> t - -val create_copying_debug_info : reg:Reg.t -> debug_info_from:t -> t - -val reg : t -> Reg.t -val location : t -> Reg.location -val debug_info : t -> Debug_info.t option - -val at_same_location : t -> Reg.t -> register_class:(Reg.t -> int) -> bool -(** [at_same_location t reg] holds iff the register [t] corresponds to - the same (physical or pseudoregister) location as the register [reg], - which is not equipped with debugging information. - [register_class] should be [Proc.register_class]. -*) - -val holds_pointer : t -> bool -val holds_non_pointer : t -> bool - -val assigned_to_stack : t -> bool -(** [assigned_to_stack t] holds iff the location of [t] is a hard stack - slot. *) - -val clear_debug_info : t -> t - -module Set_distinguishing_names_and_locations - : Set.S with type elt = t - -module Map_distinguishing_names_and_locations - : Map.S with type key = t - -module Set : sig - include Set.S with type elt = t - - val of_array : reg_with_debug_info array -> t - - val mem_reg : t -> Reg.t -> bool - - val find_reg_exn : t -> Reg.t -> reg_with_debug_info - - val filter_reg : t -> Reg.t -> t - - val forget_debug_info : t -> Reg.Set.t - - val without_debug_info : Reg.Set.t -> t - - val made_unavailable_by_clobber - : t - -> regs_clobbered:Reg.t array - -> register_class:(Reg.t -> int) - -> t - (** [made_unavailable_by_clobber t ~regs_clobbered ~register_class] returns - the largest subset of [t] whose locations do not overlap with any - registers in [regs_clobbered]. (Think of [t] as a set of available - registers.) - [register_class] should always be [Proc.register_class]. *) -end - -val print - : print_reg:(Format.formatter -> Reg.t -> unit) - -> Format.formatter - -> t - -> unit diff --git a/asmcomp/emitaux.ml b/asmcomp/emitaux.ml index 2e4664e8..d3587c1a 100644 --- a/asmcomp/emitaux.ml +++ b/asmcomp/emitaux.ml @@ -15,6 +15,11 @@ (* Common functions for emitting assembly code *) +type error = + | Stack_frame_too_large of int + +exception Error of error + let output_channel = ref stdout let emit_string s = output_string !output_channel s @@ -69,7 +74,7 @@ let emit_string_directive directive s = end else begin let i = ref 0 in while !i < l do - let n = min (l - !i) 80 in + let n = Int.min (l - !i) 80 in emit_string directive; emit_string_literal (String.sub s !i n); emit_char '\n'; @@ -178,6 +183,12 @@ let emit_frames a = Label_table.add debuginfos key lbl; lbl in + let efa_16_checked n = + assert (n >= 0); + if n < 0x1_0000 + then a.efa_16 n + else raise (Error(Stack_frame_too_large n)) + in let emit_frame fd = assert (fd.fd_frame_size land 3 = 0); let flags = @@ -191,9 +202,9 @@ let emit_frames a = then 3 else 2 in a.efa_code_label fd.fd_lbl; - a.efa_16 (fd.fd_frame_size + flags); - a.efa_16 (List.length fd.fd_live_offset); - List.iter a.efa_16 fd.fd_live_offset; + efa_16_checked (fd.fd_frame_size + flags); + efa_16_checked (List.length fd.fd_live_offset); + List.iter efa_16_checked fd.fd_live_offset; begin match fd.fd_debuginfo with | _ when flags = 0 -> () @@ -237,9 +248,9 @@ let emit_frames a = a.efa_string defname in let pack_info fd_raise d has_next = - let line = min 0xFFFFF d.Debuginfo.dinfo_line - and char_start = min 0xFF d.Debuginfo.dinfo_char_start - and char_end = min 0x3FF d.Debuginfo.dinfo_char_end + let line = Int.min 0xFFFFF d.Debuginfo.dinfo_line + and char_start = Int.min 0xFF d.Debuginfo.dinfo_char_start + and char_end = Int.min 0x3FF d.Debuginfo.dinfo_char_end and kind = if fd_raise then 1 else 0 and has_next = if has_next then 1 else 0 in Int64.(add (shift_left (of_int line) 44) @@ -370,3 +381,25 @@ let reset () = let binary_backend_available = ref false let create_asm_file = ref true + +let report_error ppf = function + | Stack_frame_too_large n -> + Format.fprintf ppf "stack frame too large (%d bytes)" n + +let mk_env f : Emitenv.per_function_env = + { + f; + stack_offset = 0; + call_gc_sites = []; + bound_error_sites = []; + bound_error_call = None; + call_gc_label = 0; + jumptables_lbl = None; + jumptables = []; + float_literals = []; + int_literals = []; + offset_literals = []; + gotrel_literals = []; + symbol_literals = []; + size_literals = 0; + } diff --git a/asmcomp/emitaux.mli b/asmcomp/emitaux.mli index 2b4867d0..df0b0197 100644 --- a/asmcomp/emitaux.mli +++ b/asmcomp/emitaux.mli @@ -71,7 +71,6 @@ val cfi_endproc : unit -> unit val cfi_adjust_cfa_offset : int -> unit val cfi_offset : reg:int -> offset:int -> unit - val binary_backend_available: bool ref (** Is a binary backend available. If yes, we don't need to generate the textual assembly file (unless the user @@ -79,3 +78,11 @@ val binary_backend_available: bool ref val create_asm_file: bool ref (** Are we actually generating the textual assembly file? *) + +type error = + | Stack_frame_too_large of int + +exception Error of error +val report_error: Format.formatter -> error -> unit + +val mk_env : Linear.fundecl -> Emitenv.per_function_env diff --git a/asmcomp/emitenv.mli b/asmcomp/emitenv.mli new file mode 100644 index 00000000..81638542 --- /dev/null +++ b/asmcomp/emitenv.mli @@ -0,0 +1,92 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy, projet Cristal, INRIA Rocquencourt *) +(* *) +(* Copyright 1996 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) +(* Per function environment for emit - common code for all targets. *) +type label = Linear.label + +(* Record calls to caml_call_gc, emitted out of line. *) +type gc_call = + { gc_lbl: label; (* Entry label *) + gc_return_lbl: label; (* Where to branch after GC *) + gc_frame_lbl: label; (* Label of frame descriptor *) + } + +(* Record calls to caml_ml_array_bound_error. + In -g mode, we maintain one call to caml_ml_array_bound_error + per bound check site. Without -g, we can share a single call. *) + +type bound_error_call = + { bd_lbl: label; (* Entry label *) + bd_frame: label; (* Label of frame descriptor *) + } + +(* Pending floating-point literals *) +type float_literal = + { + fl : int64; + lbl : label; + } + +(* Pending large integer literals *) +type int_literal = + { + n : nativeint; + n_lbl : label; + } + +(* Pending offset computations : {lbl; dst; src;} --> lbl: .word dst-(src+N) *) +type offset_computation = + { lbl : label; + dst : label; + src : label; + } + +(* Pending relative references to the global offset table *) +type gotrel_literal = + { lbl_got : label; + lbl_pic : label; + } + +(* Pending symbol literals *) +type symbol_literal = + { + sym : string; + lbl : label; + } + +(* Environment for emitting a function *) +type per_function_env = { + f : Linear.fundecl; + mutable stack_offset : int; + mutable call_gc_sites : gc_call list; (* used in all targets except power *) + mutable call_gc_label : label; (* used only in power *) + mutable bound_error_sites : bound_error_call list; + (* used in all targets except power *) + mutable bound_error_call : label option; (* used in amd64,i386,s390x *) + + (* record jump tables (for PPC64). In order to reduce the size of the TOC, + we concatenate all jumptables and emit them at the end of the function. *) + mutable jumptables_lbl : label option; (* used only in power *) + mutable jumptables : label list; (* in reverse order *) + + (* pending literals *) + mutable float_literals : float_literal list; (* in all except amd64,i386 *) + mutable int_literals : int_literal list; (* used only in s390x *) + mutable offset_literals : offset_computation list; (* used only in arm *) + mutable gotrel_literals : gotrel_literal list; (* used only in arm *) + mutable symbol_literals : symbol_literal list; (* used only in arm *) + (* [size_literals] is the total space (in words) occupied + by pending literals. *) + mutable size_literals : int; (* used only in arm *) +} diff --git a/asmcomp/i386/CSE.ml b/asmcomp/i386/CSE.ml index 6ef8fec6..907f955b 100644 --- a/asmcomp/i386/CSE.ml +++ b/asmcomp/i386/CSE.ml @@ -29,7 +29,7 @@ method! class_of_operation op = (* Operations that affect the floating-point stack cannot be factored *) | Iconst_float _ | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Iintoffloat | Ifloatofint - | Iload((Single | Double | Double_u), _) -> Op_other + | Iload((Single | Double | Double_u), _, _) -> Op_other (* Specific ops *) | Ispecific(Ilea _) -> Op_pure | Ispecific(Istore_int(_, _, is_asg)) -> Op_store is_asg diff --git a/asmcomp/i386/arch.ml b/asmcomp/i386/arch.ml index 17876c46..21057b36 100644 --- a/asmcomp/i386/arch.ml +++ b/asmcomp/i386/arch.ml @@ -162,3 +162,15 @@ let stack_alignment = | "win32" -> 4 (* MSVC *) | _ -> 16 (* PR#6038: GCC and Clang seem to require 16-byte alignment nowadays *) + +(* Specific operations that are pure *) + +let operation_is_pure = function + | Ilea _ -> true + | _ -> false +(* x87 floating-point operations are not pure because they push and pop + on the FP stack as a side effect *) + +(* Specific operations that can raise *) + +let operation_can_raise _ = false diff --git a/asmcomp/i386/emit.mlp b/asmcomp/i386/emit.mlp index 5444749b..f78c9857 100644 --- a/asmcomp/i386/emit.mlp +++ b/asmcomp/i386/emit.mlp @@ -24,6 +24,7 @@ open Reg open Mach open Linear open Emitaux +open Emitenv module String = Misc.Stdlib.String open X86_ast @@ -49,31 +50,22 @@ let cfi_adjust_cfa_offset n = let emit_debug_info dbg = emit_debug_info_gen dbg D.file D.loc -(* Tradeoff between code size and code speed *) - -let fastcode_flag = ref true - -let stack_offset = ref 0 - -(* Layout of the stack frame *) -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false - -let frame_size () = (* includes return address *) +let frame_size env = (* includes return address *) let sz = - !stack_offset + 4 * num_stack_slots.(0) + 8 * num_stack_slots.(1) + 4 + env.stack_offset + + 4 * env.f.fun_num_stack_slots.(0) + + 8 * env.f.fun_num_stack_slots.(1) + 4 in Misc.align sz stack_alignment -let slot_offset loc cl = +let slot_offset env loc cl = match loc with | Incoming n -> assert (n >= 0); - frame_size() + n + frame_size env + n | Local n -> if cl = 0 - then !stack_offset + n * 4 - else !stack_offset + num_stack_slots.(0) * 4 + n * 8 + then env.stack_offset + n * 4 + else env.stack_offset + env.f.fun_num_stack_slots.(0) * 4 + n * 8 | Outgoing n -> assert (n >= 0); n @@ -124,8 +116,8 @@ let label s = sym (emit_label s) let def_label s = D.label (emit_label s) -let emit_Llabel fallthrough lbl = - if not fallthrough && !fastcode_flag then D.align 16 ; +let emit_Llabel env fallthrough lbl = + if not fallthrough && env.f.fun_fast then D.align 16 ; def_label lbl (* Output a pseudo-register *) @@ -146,15 +138,15 @@ let domain_field f r = let load_domain_state r = I.mov (sym32 "Caml_state") r -let reg = function +let reg env = function | { loc = Reg r } -> register_name r | { loc = Stack(Incoming n | Outgoing n) } when n < 0 -> sym32 "caml_extra_params" ~ofs:(n + 64) | { loc = Stack s; typ = Float } as r -> - let ofs = slot_offset s (register_class r) in + let ofs = slot_offset env s (register_class r) in mem32 REAL8 ofs RSP | { loc = Stack s } as r -> - let ofs = slot_offset s (register_class r) in + let ofs = slot_offset env s (register_class r) in mem32 DWORD ofs RSP | { loc = Unknown } -> fatal_error "Emit_i386.reg" @@ -200,7 +192,7 @@ let addressing addr typ i n = (* Record live pointers at call points *) -let record_frame_label live dbg = +let record_frame_label env live dbg = let lbl = new_label () in let live_offset = ref [] in Reg.Set.iter @@ -208,55 +200,40 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; lbl -let record_frame live dbg = - let lbl = record_frame_label live dbg in +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in def_label lbl -(* Record calls to the GC -- we've moved them out of the way *) - -type gc_call = - { gc_lbl: label; (* Entry label *) - gc_return_lbl: label; (* Where to branch after GC *) - gc_frame: label } (* Label of frame descriptor *) - -let call_gc_sites = ref ([] : gc_call list) - let emit_call_gc gc = def_label gc.gc_lbl; emit_call "caml_call_gc"; - def_label gc.gc_frame; + def_label gc.gc_frame_lbl; I.jmp (label gc.gc_return_lbl) -(* Record calls to caml_ml_array_bound_error. - In -g mode, we maintain one call to caml_ml_array_bound_error - per bound check site. Without -g, we can share a single call. *) - -type bound_error_call = - { bd_lbl: label; (* Entry label *) - bd_frame: label } (* Label of frame descriptor *) - -let bound_error_sites = ref ([] : bound_error_call list) -let bound_error_call = ref 0 - -let bound_error_label dbg = +let bound_error_label env dbg = if !Clflags.debug then begin let lbl_bound_error = new_label() in - let lbl_frame = record_frame_label Reg.Set.empty (Dbg_other dbg) in - bound_error_sites := - { bd_lbl = lbl_bound_error; bd_frame = lbl_frame } :: !bound_error_sites; + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- + { bd_lbl = lbl_bound_error; bd_frame = lbl_frame; } + :: env.bound_error_sites; lbl_bound_error end else begin - if !bound_error_call = 0 then bound_error_call := new_label(); - !bound_error_call + match env.bound_error_call with + | None-> + let lbl = new_label () in + env.bound_error_call <- Some lbl; + lbl + | Some lbl -> lbl end let emit_call_bound_error bd = @@ -264,12 +241,13 @@ let emit_call_bound_error bd = emit_call "caml_ml_array_bound_error"; def_label bd.bd_frame -let emit_call_bound_errors () = - List.iter emit_call_bound_error !bound_error_sites; - if !bound_error_call > 0 then begin - def_label !bound_error_call; +let emit_call_bound_errors env = + List.iter emit_call_bound_error env.bound_error_sites; + match env.bound_error_call with + | Some lbl -> + def_label lbl; emit_call "caml_ml_array_bound_error" - end + | None -> () (* Names for instructions *) @@ -336,15 +314,15 @@ let cond = function (* Output an = 0 or <> 0 test. *) -let output_test_zero arg = +let output_test_zero env arg = match arg.loc with - | Reg.Reg _ -> I.test (reg arg) (reg arg) - | _ -> I.cmp (int 0) (reg arg) + | Reg.Reg _ -> I.test (reg env arg) (reg env arg) + | _ -> I.cmp (int 0) (reg env arg) (* Deallocate the stack frame before a return or tail call *) -let output_epilogue f = - let n = frame_size() - 4 in +let output_epilogue env f = + let n = frame_size env - 4 in if n > 0 then begin I.add (int n) esp; @@ -362,7 +340,7 @@ let is_tos = function { loc = Reg _; typ = Float } -> true | _ -> false (* Emit the code for a floating-point comparison *) -let emit_float_test cmp arg lbl = +let emit_float_test env cmp arg lbl = let actual_cmp = match (is_tos arg.(0), is_tos arg.(1)) with | (true, true) -> @@ -371,15 +349,15 @@ let emit_float_test cmp arg lbl = cmp | (true, false) -> (* first arg on top of FP stack *) - I.fcomp (reg arg.(1)); + I.fcomp (reg env arg.(1)); cmp | (false, true) -> (* second arg on top of FP stack *) - I.fcomp (reg arg.(0)); + I.fcomp (reg env arg.(0)); Cmm.swap_float_comparison cmp | (false, false) -> - I.fld (reg arg.(0)); - I.fcomp (reg arg.(1)); + I.fld (reg env arg.(0)); + I.fcomp (reg env arg.(1)); cmp in I.fnstsw ax; @@ -478,19 +456,14 @@ let emit_named_text_section func_name = else D.text () (* Output the assembly code for an instruction *) - -(* Name of current function *) -let function_name = ref "" -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 - -let emit_instr fallthrough i = +let emit_instr env fallthrough i = + let reg = reg env in emit_debug_info i.dbg; match i.desc with | Lend -> () | Lprologue -> - assert (!prologue_required); - let n = frame_size() - 4 in + assert (env.f.fun_prologue_required); + let n = frame_size env - 4 in if n > 0 then begin I.sub (int n) esp; cfi_adjust_cfa_offset n; @@ -536,18 +509,18 @@ let emit_instr fallthrough i = I.mov (immsym s) (reg i.res.(0)) | Lop(Icall_ind) -> I.call (reg i.arg.(0)); - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Icall_imm { func; }) -> add_used_symbol func; emit_call func; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Itailcall_ind) -> - output_epilogue (fun () -> I.jmp (reg i.arg.(0))) + output_epilogue env (fun () -> I.jmp (reg i.arg.(0))) | Lop(Itailcall_imm { func; }) -> - if func = !function_name then - I.jmp (label !tailrec_entry_point) + if func = env.f.fun_name then + I.jmp (label env.f.fun_tailrec_entry_point_label) else begin - output_epilogue begin fun () -> + output_epilogue env begin fun () -> add_used_symbol func; I.jmp (immsym func) end @@ -557,7 +530,7 @@ let emit_instr fallthrough i = if alloc then begin I.mov (immsym func) eax; emit_call "caml_c_call"; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) end else begin emit_call func end @@ -566,8 +539,8 @@ let emit_instr fallthrough i = then I.add (int (-n)) esp else I.sub (int n) esp; cfi_adjust_cfa_offset n; - stack_offset := !stack_offset + n - | Lop(Iload(chunk, addr)) -> + env.stack_offset <- env.stack_offset + n + | Lop(Iload(chunk, addr, _mut)) -> let dest = i.res.(0) in begin match chunk with | Word_int | Word_val | Thirtytwo_signed | Thirtytwo_unsigned -> @@ -608,8 +581,13 @@ let emit_instr fallthrough i = I.fstp (addressing addr REAL8 i 1) end end + | Lop(Ipoll { return_label }) -> + begin match return_label with + None -> () + | Some lbl -> I.jmp (label lbl) + end | Lop(Ialloc { bytes = n; dbginfo }) -> - if !fastcode_flag then begin + if env.f.fun_fast then begin load_domain_state ebx; I.mov (domain_field Domain_young_ptr RBX) eax; I.sub (int n) eax; @@ -617,16 +595,15 @@ let emit_instr fallthrough i = I.cmp (domain_field Domain_young_limit RBX) eax; let lbl_call_gc = new_label() in let lbl_frame = - record_frame_label - i.live (Dbg_alloc dbginfo) in + record_frame_label env i.live (Dbg_alloc dbginfo) in I.jb (label lbl_call_gc); let lbl_after_alloc = new_label() in def_label lbl_after_alloc; I.lea (mem32 NONE 4 RAX) (reg i.res.(0)); - call_gc_sites := + env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; - gc_frame = lbl_frame } :: !call_gc_sites + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites end else begin begin match n with 8 -> emit_call "caml_alloc1" @@ -636,10 +613,7 @@ let emit_instr fallthrough i = I.mov (int n) eax; emit_call "caml_allocN" end; - let label = - record_frame_label - i.live (Dbg_alloc dbginfo) - in + let label = record_frame_label env i.live (Dbg_alloc dbginfo) in def_label label; I.lea (mem32 NONE 4 RAX) (reg i.res.(0)) end @@ -652,11 +626,11 @@ let emit_instr fallthrough i = I.set (cond cmp) al; I.movzx al (reg i.res.(0)) | Lop(Iintop (Icheckbound)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in I.cmp (reg i.arg.(1)) (reg i.arg.(0)); I.jbe (label lbl) | Lop(Iintop_imm(Icheckbound, n)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in I.cmp (int n) (reg i.arg.(0)); I.jbe (label lbl) | Lop(Iintop(Idiv | Imod)) -> @@ -712,7 +686,7 @@ let emit_instr fallthrough i = | Lop(Iintoffloat) -> if not (is_tos i.arg.(0)) then I.fld (reg i.arg.(0)); - stack_offset := !stack_offset - 8; + env.stack_offset <- env.stack_offset - 8; I.sub (int 8) esp; cfi_adjust_cfa_offset 8; I.fnstcw (mem32 NONE 4 RSP); @@ -730,7 +704,9 @@ let emit_instr fallthrough i = I.fldcw (mem32 NONE 4 RSP); I.add (int 8) esp; cfi_adjust_cfa_offset (-8); - stack_offset := !stack_offset + 8 + env.stack_offset <- env.stack_offset + 8 + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific(Ilea addr)) -> I.lea (addressing addr DWORD i 0) (reg i.res.(0)) | Lop(Ispecific(Istore_int(n, addr, _))) -> @@ -749,9 +725,9 @@ let emit_instr fallthrough i = I.sub (int 8) esp; cfi_adjust_cfa_offset 8; I.fstp (mem32 REAL8 0 RSP); - stack_offset := !stack_offset + 8 + env.stack_offset <- env.stack_offset + 8 | {loc = Stack sl; typ = Float} -> - let ofs = slot_offset sl 1 in + let ofs = slot_offset env sl 1 in (* Use x87 stack to move from stack to stack, instead of two 32-bit push instructions, which could kill performance on modern CPUs (see #6979). @@ -760,30 +736,30 @@ let emit_instr fallthrough i = I.sub (int 8) esp; cfi_adjust_cfa_offset 8; I.fstp (mem32 REAL8 0 RSP); - stack_offset := !stack_offset + 8 + env.stack_offset <- env.stack_offset + 8 | _ -> I.push (reg r); cfi_adjust_cfa_offset 4; - stack_offset := !stack_offset + 4 + env.stack_offset <- env.stack_offset + 4 done | Lop(Ispecific(Ipush_int n)) -> I.push (nat n); cfi_adjust_cfa_offset 4; - stack_offset := !stack_offset + 4 + env.stack_offset <- env.stack_offset + 4 | Lop(Ispecific(Ipush_symbol s)) -> add_used_symbol s; I.push (immsym s); cfi_adjust_cfa_offset 4; - stack_offset := !stack_offset + 4 + env.stack_offset <- env.stack_offset + 4 | Lop(Ispecific(Ipush_load addr)) -> I.push (addressing addr DWORD i 0); cfi_adjust_cfa_offset 4; - stack_offset := !stack_offset + 4 + env.stack_offset <- env.stack_offset + 4 | Lop(Ispecific(Ipush_load_float addr)) -> I.push (addressing (offset_addressing addr 4) DWORD i 0); I.push (addressing addr DWORD i 0); cfi_adjust_cfa_offset 8; - stack_offset := !stack_offset + 8 + env.stack_offset <- env.stack_offset + 8 | Lop(Ispecific(Ifloatarithmem(double, op, addr))) -> if not (is_tos i.arg.(0)) then I.fld (reg i.arg.(0)); @@ -799,38 +775,37 @@ let emit_instr fallthrough i = if Array.length i.arg = 2 && is_tos i.arg.(1) then I.fxch st1; emit_floatspecial s - | Lop (Iname_for_debugger _) -> () | Lreloadretaddr -> () | Lreturn -> - output_epilogue begin fun () -> + output_epilogue env begin fun () -> I.ret () end | Llabel lbl -> - emit_Llabel fallthrough lbl + emit_Llabel env fallthrough lbl | Lbranch lbl -> I.jmp (label lbl) | Lcondbranch(tst, lbl) -> let lbl = label lbl in begin match tst with | Itruetest -> - output_test_zero i.arg.(0); + output_test_zero env i.arg.(0); I.jne lbl; | Ifalsetest -> - output_test_zero i.arg.(0); + output_test_zero env i.arg.(0); I.je lbl | Iinttest cmp -> I.cmp (reg i.arg.(1)) (reg i.arg.(0)); I.j (cond cmp) lbl | Iinttest_imm((Isigned Ceq | Isigned Cne | Iunsigned Ceq | Iunsigned Cne) as cmp, 0) -> - output_test_zero i.arg.(0); + output_test_zero env i.arg.(0); I.j (cond cmp) lbl | Iinttest_imm(cmp, n) -> I.cmp (int n) (reg i.arg.(0)); I.j (cond cmp) lbl | Ifloattest cmp -> - emit_float_test cmp i.arg lbl + emit_float_test env cmp i.arg lbl | Ioddtest -> I.test (int 1) (reg i.arg.(0)); I.jne lbl @@ -860,13 +835,13 @@ let emit_instr fallthrough i = for i = 0 to Array.length jumptbl - 1 do D.long (ConstLabel (emit_label jumptbl.(i))) done; - emit_named_text_section !function_name + emit_named_text_section env.f.fun_name | Lentertrap -> () | Ladjust_trap_depth { delta_traps } -> let delta = trap_frame_size * delta_traps in cfi_adjust_cfa_offset delta; - stack_offset := !stack_offset + delta + env.stack_offset <- env.stack_offset + delta | Lpushtrap { lbl_handler; } -> I.push (label lbl_handler); if trap_frame_size > 8 then @@ -875,7 +850,7 @@ let emit_instr fallthrough i = I.push (domain_field Domain_exception_pointer RDX); cfi_adjust_cfa_offset trap_frame_size; I.mov esp (domain_field Domain_exception_pointer RDX); - stack_offset := !stack_offset + trap_frame_size + env.stack_offset <- env.stack_offset + trap_frame_size | Lpoptrap -> I.mov edx (mem32 DWORD 4 RSP); load_domain_state edx; @@ -884,17 +859,17 @@ let emit_instr fallthrough i = if trap_frame_size > 8 then I.add (int (trap_frame_size - 8)) esp; cfi_adjust_cfa_offset (-trap_frame_size); - stack_offset := !stack_offset - trap_frame_size + env.stack_offset <- env.stack_offset - trap_frame_size | Lraise k -> begin match k with | Lambda.Raise_regular -> load_domain_state ebx; I.mov (int 0) (domain_field Domain_backtrace_pos RBX); emit_call "caml_raise_exn"; - record_frame Reg.Set.empty (Dbg_raise i.dbg) + record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_reraise -> emit_call "caml_raise_exn"; - record_frame Reg.Set.empty (Dbg_raise i.dbg) + record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_notrace -> load_domain_state ebx; I.mov (domain_field Domain_exception_pointer RBX) esp; @@ -905,39 +880,29 @@ let emit_instr fallthrough i = I.jmp ebx end -let rec emit_all fallthrough i = +let rec emit_all env fallthrough i = match i.desc with | Lend -> () | _ -> - emit_instr fallthrough i; - emit_all + emit_instr env fallthrough i; + emit_all env (system = S_win32 || Linear.has_fallthrough i.desc) i.next (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - fastcode_flag := fundecl.fun_fast; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - stack_offset := 0; - call_gc_sites := []; - bound_error_sites := []; - bound_error_call := 0; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - prologue_required := fundecl.fun_prologue_required; - emit_named_text_section !function_name; + let env = mk_env fundecl in + emit_named_text_section fundecl.fun_name; add_def_symbol fundecl.fun_name; D.align (if system = S_win32 then 4 else 16); D.global (emit_symbol fundecl.fun_name); D.label (emit_symbol fundecl.fun_name); emit_debug_info fundecl.fun_dbg; cfi_startproc (); - emit_all true fundecl.fun_body; - List.iter emit_call_gc !call_gc_sites; - emit_call_bound_errors (); + emit_all env true fundecl.fun_body; + List.iter emit_call_gc env.call_gc_sites; + emit_call_bound_errors env; cfi_endproc (); begin match system with | S_linux_elf | S_bsd_elf | S_gnu -> diff --git a/asmcomp/i386/proc.ml b/asmcomp/i386/proc.ml index 59798ffe..53799397 100644 --- a/asmcomp/i386/proc.ml +++ b/asmcomp/i386/proc.ml @@ -226,17 +226,6 @@ let max_register_pressure = function Iintoffloat -> [| 6; max_int |] | _ -> [|7; max_int |] -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false - | Ispecific(Ilea _) -> true - | Ispecific _ -> false - | _ -> true - (* Layout of the stack frame *) let frame_required fd = diff --git a/asmcomp/i386/selection.ml b/asmcomp/i386/selection.ml index 2300d2c0..083a60e8 100644 --- a/asmcomp/i386/selection.ml +++ b/asmcomp/i386/selection.ml @@ -133,7 +133,7 @@ let pseudoregs_for_operation op arg res = (* For floating-point operations and floating-point loads, the result is always left at the top of the floating-point stack *) | Iconst_float _ | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf - | Ifloatofint | Iload((Single | Double | Double_u), _) + | Ifloatofint | Iload((Single | Double | Double_u), _, _) | Ispecific(Isubfrev | Idivfrev | Ifloatarithmem _ | Ifloatspecial _) -> (arg, [| tos |], false) (* don't move it immediately *) (* For storing a byte, the argument must be in eax...edx. @@ -322,4 +322,5 @@ method! emit_extcall_args env _ty_args args = end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = (new selector)#emit_fundecl + ~future_funcnames f diff --git a/asmcomp/linearize.ml b/asmcomp/linearize.ml index 8355b831..bf983ae0 100644 --- a/asmcomp/linearize.ml +++ b/asmcomp/linearize.ml @@ -142,6 +142,19 @@ let linear i n contains_calls = | Iop(Imove | Ireload | Ispill) when i.Mach.arg.(0).loc = i.Mach.res.(0).loc -> linear i.Mach.next n + | Iop((Ipoll { return_label = None; _ }) as op) -> + (* If the poll call does not already specify where to jump to after + the poll (the expected situation in the current implementation), + absorb any branch after the poll call into the poll call itself. + This, in particular, optimises polls at the back edges of loops. *) + let n = linear i.Mach.next n in + let op, n = + match n.desc with + | Lbranch lbl -> + Mach.Ipoll { return_label = Some lbl }, n.next + | _ -> op, n + in + copy_instr (Lop op) i n | Iop op -> copy_instr (Lop op) i (linear i.Mach.next n) | Ireturn -> @@ -259,63 +272,52 @@ let linear i n contains_calls = in linear i n let add_prologue first_insn prologue_required = - (* The prologue needs to come after any [Iname_for_debugger] operations that - refer to parameters. (Such operations always come in a contiguous - block, cf. [Selectgen].) *) - let rec skip_naming_ops (insn : instruction) : label * instruction = - match insn.desc with - | Lop (Iname_for_debugger _) -> - let tailrec_entry_point_label, next = skip_naming_ops insn.next in - tailrec_entry_point_label, { insn with next; } - | _ -> - let tailrec_entry_point_label = Cmm.new_label () in - let tailrec_entry_point = - { desc = Llabel tailrec_entry_point_label; - next = insn; - arg = [| |]; - res = [| |]; - dbg = insn.dbg; - live = insn.live; - } - in - (* We expect [Lprologue] to expand to at least one instruction---as such, - if no prologue is required, we avoid adding the instruction here. - The reason is subtle: an empty expansion of [Lprologue] can cause - two labels, one either side of the [Lprologue], to point at the same - location. This means that we lose the property (cf. [Coalesce_labels]) - that we can check if two labels point at the same location by - comparing them for equality. This causes trouble when the function - whose prologue is in question lands at the top of the object file - and we are emitting DWARF debugging information: - foo_code_begin: - foo: - .L1: - ; empty prologue - .L2: - ... - If we were to emit a location list entry from L1...L2, not realising - that they point at the same location, then the beginning and ending - points of the range would be both equal to each other and (relative to - "foo_code_begin") equal to zero. This appears to confuse objdump, - which seemingly misinterprets the entry as an end-of-list entry - (which is encoded with two zero words), then complaining about a - "hole in location list" (as it ignores any remaining list entries - after the misinterpreted entry). *) - if prologue_required then - let prologue = - { desc = Lprologue; - next = tailrec_entry_point; - arg = [| |]; - res = [| |]; - dbg = tailrec_entry_point.dbg; - live = Reg.Set.empty; (* will not be used *) - } - in - tailrec_entry_point_label, prologue - else - tailrec_entry_point_label, tailrec_entry_point + let tailrec_entry_point_label = Cmm.new_label () in + let tailrec_entry_point = + { desc = Llabel tailrec_entry_point_label; + next = first_insn; + arg = [| |]; + res = [| |]; + dbg = first_insn.dbg; + live = first_insn.live; + } in - skip_naming_ops first_insn + (* We expect [Lprologue] to expand to at least one instruction---as such, + if no prologue is required, we avoid adding the instruction here. + The reason is subtle: an empty expansion of [Lprologue] can cause + two labels, one either side of the [Lprologue], to point at the same + location. This means that we lose the property (cf. [Coalesce_labels]) + that we can check if two labels point at the same location by + comparing them for equality. This causes trouble when the function + whose prologue is in question lands at the top of the object file + and we are emitting DWARF debugging information: + foo_code_begin: + foo: + .L1: + ; empty prologue + .L2: + ... + If we were to emit a location list entry from L1...L2, not realising + that they point at the same location, then the beginning and ending + points of the range would be both equal to each other and (relative to + "foo_code_begin") equal to zero. This appears to confuse objdump, + which seemingly misinterprets the entry as an end-of-list entry + (which is encoded with two zero words), then complaining about a + "hole in location list" (as it ignores any remaining list entries + after the misinterpreted entry). *) + if prologue_required then + let prologue = + { desc = Lprologue; + next = tailrec_entry_point; + arg = [| |]; + res = [| |]; + dbg = tailrec_entry_point.dbg; + live = Reg.Set.empty; (* will not be used *) + } + in + tailrec_entry_point_label, prologue + else + tailrec_entry_point_label, tailrec_entry_point let fundecl f = let fun_prologue_required = Proc.prologue_required f in diff --git a/asmcomp/liveness.ml b/asmcomp/liveness.ml index f07944ae..3cf1686a 100644 --- a/asmcomp/liveness.ml +++ b/asmcomp/liveness.ml @@ -18,130 +18,60 @@ open Mach -let live_at_exit = ref [] +module Domain = struct + type t = Reg.Set.t + let bot = Reg.Set.empty + let join = Reg.Set.union + let lessequal = Reg.Set.subset +end -let find_live_at_exit k = - try - List.assoc k !live_at_exit - with - | Not_found -> Misc.fatal_error "Liveness.find_live_at_exit" +module Analyzer = Dataflow.Backward(Domain) -let live_at_raise = ref Reg.Set.empty - -let rec live i finally = - (* finally is the set of registers live after execution of the - instruction sequence. - The result of the function is the set of registers live just - before the instruction sequence. - The instruction i is annotated by the set of registers live across - the instruction. *) +let transfer i ~next ~exn = match i.desc with - Iend -> - i.live <- finally; - finally | Ireturn | Iop(Itailcall_ind) | Iop(Itailcall_imm _) -> i.live <- Reg.Set.empty; (* no regs are live across *) Reg.set_of_array i.arg | Iop op -> - let after = live i.next finally in - if Proc.op_is_pure op (* no side effects *) - && Reg.disjoint_set_array after i.res (* results are not used after *) - && not (Proc.regs_are_volatile i.arg) (* no stack-like hard reg *) - && not (Proc.regs_are_volatile i.res) (* is involved *) + if operation_is_pure op (* no side effects *) + && Reg.disjoint_set_array next i.res (* results are not used after *) + && not (Proc.regs_are_volatile i.arg) (* no stack-like hard reg *) + && not (Proc.regs_are_volatile i.res) (* is involved *) then begin (* This operation is dead code. Ignore its arguments. *) - i.live <- after; - after + i.live <- next; + next end else begin - let across_after = Reg.diff_set_array after i.res in + let across1 = Reg.diff_set_array next i.res in let across = - match op with - | Icall_ind | Icall_imm _ | Iextcall _ | Ialloc _ - | Iintop (Icheckbound) | Iintop_imm(Icheckbound, _) -> - (* The function call may raise an exception, branching to the - nearest enclosing try ... with. Similarly for bounds checks - and allocation (for the latter: finalizers may throw - exceptions, as may signal handlers). - Hence, everything that must be live at the beginning of - the exception handler must also be live across this instr. *) - Reg.Set.union across_after !live_at_raise - | _ -> - across_after in + (* Operations that can raise an exception (function calls, + bounds checks, allocations) can branch to the + nearest enclosing try ... with. + Hence, everything that must be live at the beginning of + the exception handler must also be live across this instr. *) + if operation_can_raise op + then Reg.Set.union across1 exn + else across1 in i.live <- across; Reg.add_set_array across i.arg end - | Iifthenelse(_test, ifso, ifnot) -> - let at_join = live i.next finally in - let at_fork = Reg.Set.union (live ifso at_join) (live ifnot at_join) in - i.live <- at_fork; - Reg.add_set_array at_fork i.arg - | Iswitch(_index, cases) -> - let at_join = live i.next finally in - let at_fork = ref Reg.Set.empty in - for i = 0 to Array.length cases - 1 do - at_fork := Reg.Set.union !at_fork (live cases.(i) at_join) - done; - i.live <- !at_fork; - Reg.add_set_array !at_fork i.arg - | Icatch(rec_flag, handlers, body) -> - let at_join = live i.next finally in - let aux (nfail,handler) (nfail', before_handler) = - assert(nfail = nfail'); - let before_handler' = live handler at_join in - nfail, Reg.Set.union before_handler before_handler' - in - let aux_equal (nfail, before_handler) (nfail', before_handler') = - assert(nfail = nfail'); - Reg.Set.equal before_handler before_handler' - in - let live_at_exit_before = !live_at_exit in - let rec fixpoint before_handlers = - live_at_exit := before_handlers @ !live_at_exit; - let before_handlers' = List.map2 aux handlers before_handlers in - live_at_exit := live_at_exit_before; - match rec_flag with - | Cmm.Nonrecursive -> - before_handlers' - | Cmm.Recursive -> - if List.for_all2 aux_equal before_handlers before_handlers' - then before_handlers' - else fixpoint before_handlers' - in - let init_state = - List.map (fun (nfail, _handler) -> nfail, Reg.Set.empty) handlers - in - let before_handler = fixpoint init_state in - (* We could use handler.live instead of Reg.Set.empty as the initial - value but we would need to clean the live field before doing the - analysis (to remove remnants of previous passes). *) - live_at_exit := before_handler @ !live_at_exit; - let before_body = live body at_join in - live_at_exit := live_at_exit_before; - i.live <- before_body; - before_body - | Iexit nfail -> - let this_live = find_live_at_exit nfail in - i.live <- this_live ; - this_live - | Itrywith(body, handler) -> - let at_join = live i.next finally in - let before_handler = live handler at_join in - let saved_live_at_raise = !live_at_raise in - live_at_raise := Reg.Set.remove Proc.loc_exn_bucket before_handler; - let before_body = live body at_join in - live_at_raise := saved_live_at_raise; - i.live <- before_body; - before_body + | Iifthenelse _ + | Iswitch _ -> + i.live <- next; + Reg.add_set_array next i.arg + | Iend | Icatch _ | Iexit _ | Itrywith _ -> + i.live <- next; + next | Iraise _ -> - i.live <- !live_at_raise; - Reg.add_set_array !live_at_raise i.arg + i.live <- exn; + Reg.add_set_array exn i.arg -let reset () = - live_at_raise := Reg.Set.empty; - live_at_exit := [] +let exnhandler before_handler = + Reg.Set.remove Proc.loc_exn_bucket before_handler let fundecl f = - let initially_live = live f.fun_body Reg.Set.empty in + let (initially_live, _) = + Analyzer.analyze ~exnhandler ~transfer f.fun_body in (* Sanity check: only function parameters can be live at entrypoint *) let wrong_live = Reg.Set.diff initially_live (Reg.set_of_array f.fun_args) in if not (Reg.Set.is_empty wrong_live) then begin diff --git a/asmcomp/liveness.mli b/asmcomp/liveness.mli index 37f5c170..65504d81 100644 --- a/asmcomp/liveness.mli +++ b/asmcomp/liveness.mli @@ -16,5 +16,4 @@ (* Liveness analysis. Annotate mach code with the set of regs live at each point. *) -val reset : unit -> unit val fundecl: Mach.fundecl -> unit diff --git a/asmcomp/mach.ml b/asmcomp/mach.ml index bb1969ad..d1df6bd3 100644 --- a/asmcomp/mach.ml +++ b/asmcomp/mach.ml @@ -51,16 +51,16 @@ type operation = ty_res : Cmm.machtype; ty_args : Cmm.exttype list; alloc : bool; } | Istackoffset of int - | Iload of Cmm.memory_chunk * Arch.addressing_mode + | Iload of Cmm.memory_chunk * Arch.addressing_mode * Asttypes.mutable_flag | Istore of Cmm.memory_chunk * Arch.addressing_mode * bool | Ialloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo; } | Iintop of integer_operation | Iintop_imm of integer_operation * int | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Ifloatofint | Iintoffloat + | Iopaque | Ispecific of Arch.specific_operation - | Iname_for_debugger of { ident : Backend_var.t; which_parameter : int option; - provenance : unit option; is_assignment : bool; } + | Ipoll of { return_label: Cmm.label option } type instruction = { desc: instruction_desc; @@ -68,9 +68,7 @@ type instruction = arg: Reg.t array; res: Reg.t array; dbg: Debuginfo.t; - mutable live: Reg.Set.t; - mutable available_before: Reg_availability_set.t; - mutable available_across: Reg_availability_set.t option; + mutable live: Reg.Set.t } and instruction_desc = @@ -100,9 +98,7 @@ let rec dummy_instr = arg = [||]; res = [||]; dbg = Debuginfo.none; - live = Reg.Set.empty; - available_before = Reg_availability_set.Ok Reg_with_debug_info.Set.empty; - available_across = None; + live = Reg.Set.empty } let end_instr () = @@ -111,23 +107,16 @@ let end_instr () = arg = [||]; res = [||]; dbg = Debuginfo.none; - live = Reg.Set.empty; - available_before = Reg_availability_set.Ok Reg_with_debug_info.Set.empty; - available_across = None; + live = Reg.Set.empty } let instr_cons d a r n = { desc = d; next = n; arg = a; res = r; - dbg = Debuginfo.none; live = Reg.Set.empty; - available_before = Reg_availability_set.Ok Reg_with_debug_info.Set.empty; - available_across = None; + dbg = Debuginfo.none; live = Reg.Set.empty } let instr_cons_debug d a r dbg n = - { desc = d; next = n; arg = a; res = r; dbg = dbg; live = Reg.Set.empty; - available_before = Reg_availability_set.Ok Reg_with_debug_info.Set.empty; - available_across = None; - } + { desc = d; next = n; arg = a; res = r; dbg = dbg; live = Reg.Set.empty } let rec instr_iter f i = match i.desc with @@ -155,9 +144,17 @@ let rec instr_iter f i = | _ -> instr_iter f i.next +let operation_is_pure = function + | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ + | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ | Ipoll _ + | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) | Iopaque -> false + | Ispecific sop -> Arch.operation_is_pure sop + | _ -> true + let operation_can_raise op = match op with | Icall_ind | Icall_imm _ | Iextcall _ | Iintop (Icheckbound) | Iintop_imm (Icheckbound, _) - | Ialloc _ -> true + | Ialloc _ | Ipoll _ -> true + | Ispecific sop -> Arch.operation_can_raise sop | _ -> false diff --git a/asmcomp/mach.mli b/asmcomp/mach.mli index 323a668b..4e004004 100644 --- a/asmcomp/mach.mli +++ b/asmcomp/mach.mli @@ -51,7 +51,7 @@ type operation = ty_res : Cmm.machtype; ty_args : Cmm.exttype list; alloc : bool; } | Istackoffset of int - | Iload of Cmm.memory_chunk * Arch.addressing_mode + | Iload of Cmm.memory_chunk * Arch.addressing_mode * Asttypes.mutable_flag | Istore of Cmm.memory_chunk * Arch.addressing_mode * bool (* false = initialization, true = assignment *) | Ialloc of { bytes : int; dbginfo : Debuginfo.alloc_dbginfo; } @@ -59,15 +59,9 @@ type operation = | Iintop_imm of integer_operation * int | Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf | Ifloatofint | Iintoffloat + | Iopaque | Ispecific of Arch.specific_operation - | Iname_for_debugger of { ident : Backend_var.t; which_parameter : int option; - provenance : unit option; is_assignment : bool; } - (** [Iname_for_debugger] has the following semantics: - (a) The argument register(s) is/are deemed to contain the value of the - given identifier. - (b) If [is_assignment] is [true], any information about other [Reg.t]s - that have been previously deemed to hold the value of that - identifier is forgotten. *) + | Ipoll of { return_label: Cmm.label option } type instruction = { desc: instruction_desc; @@ -75,9 +69,7 @@ type instruction = arg: Reg.t array; res: Reg.t array; dbg: Debuginfo.t; - mutable live: Reg.Set.t; - mutable available_before: Reg_availability_set.t; - mutable available_across: Reg_availability_set.t option; + mutable live: Reg.Set.t } and instruction_desc = @@ -111,4 +103,11 @@ val instr_cons_debug: instruction -> instruction val instr_iter: (instruction -> unit) -> instruction -> unit +val operation_is_pure : operation -> bool + (** Returns [true] if the given operation only produces a result + in its destination registers, but has no side effects whatsoever: + it doesn't raise exceptions, it doesn't modify already-allocated + blocks, it doesn't adjust the stack frame, etc. *) + val operation_can_raise : operation -> bool + (** Returns [true] if the given operation can raise an exception. *) diff --git a/asmcomp/polling.ml b/asmcomp/polling.ml new file mode 100644 index 00000000..c498b9a1 --- /dev/null +++ b/asmcomp/polling.ml @@ -0,0 +1,258 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy and Damien Doligez, projet Cambium, INRIA Paris *) +(* Sadiq Jaffer, OCaml Labs Consultancy Ltd *) +(* Stephen Dolan and Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2021 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2021 OCaml Labs Consultancy Ltd *) +(* Copyright 2021 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +open Mach + +module Int = Numbers.Int +module String = Misc.Stdlib.String + +let function_is_assumed_to_never_poll func = + String.starts_with ~prefix:"caml_apply" func + || String.starts_with ~prefix:"caml_send" func + +(* Detection of recursive handlers that are not guaranteed to poll + at every loop iteration. *) + +(* We use a backwards dataflow analysis to compute a mapping from handlers H + (= loop heads) to either "safe" or "unsafe". + + H is "safe" if every path starting from H goes through an Ialloc, + Ipoll, Ireturn, Itailcall_ind or Itailcall_imm instruction. + + H is "unsafe", therefore, if starting from H we can loop infinitely + without crossing an Ialloc or Ipoll instruction. +*) + +type unsafe_or_safe = Unsafe | Safe + +module Unsafe_or_safe = struct + type t = unsafe_or_safe + + let bot = Unsafe + + let join t1 t2 = + match t1, t2 with + | Unsafe, Unsafe + | Unsafe, Safe + | Safe, Unsafe -> Unsafe + | Safe, Safe -> Safe + + let lessequal t1 t2 = + match t1, t2 with + | Unsafe, Unsafe + | Unsafe, Safe + | Safe, Safe -> true + | Safe, Unsafe -> false +end + +module PolledLoopsAnalysis = Dataflow.Backward(Unsafe_or_safe) + +let polled_loops_analysis funbody = + let transfer i ~next ~exn = + match i.desc with + | Iend -> next + | Iop (Ialloc _ | Ipoll _) + | Iop (Itailcall_ind | Itailcall_imm _) -> Safe + | Iop op -> + if operation_can_raise op + then Unsafe_or_safe.join next exn + else next + | Ireturn -> Safe + | Iifthenelse _ | Iswitch _ | Icatch _ | Iexit _ | Itrywith _ -> next + | Iraise _ -> exn + in + (* [exnescape] is [Safe] because we can't loop infinitely having + returned from the function via an unhandled exception. *) + snd (PolledLoopsAnalysis.analyze ~exnescape:Safe ~transfer funbody) + +(* Detection of functions that can loop via a tail-call without going + through a poll point. *) + +(* We use a backwards dataflow analysis to compute a single value: either + "Might_not_poll" or "Always_polls". + + "Might_not_poll" means there exists a path from the function entry to a + Potentially Recursive Tail Call (an Itailcall_ind or + Itailcall_imm to a forward function) + that does not go through an Ialloc or Ipoll instruction. + + "Always_polls", therefore, means the function always polls (via Ialloc or + Ipoll) before doing a PRTC. This includes the case where it does not + perform any PRTC. + + A note on Potentially Recursive Tail Calls + ------------------------------------------ + + Tail calls can create infinite loops, of course. (Consider a function + that tail-calls itself.) But not all tail calls need to be flagged + as potential infinite loops. + + We optimise by making a partial ordering over Mach functions: in + definition order within a compilation unit, and dependency + order between compilation units. This order is acyclic, as + OCaml does not allow circular dependencies between modules. + It's also finite, so if there's an infinite sequence of + function calls then something has to make a forward reference. + + Also, in such an infinite sequence of function calls, at most finitely + many of them can be non-tail calls. (If there are infinitely many + non-tail calls, then the program soon terminates with a stack + overflow). + + So, every such infinite sequence must contain many forward-referencing + tail calls. These tail calls are the Potentially Recursive Tail Calls + (PTRCs). Polling only on those calls suffices. + + Several functions below take a parameter [future_funcnames] + which is the set of functions defined "after" the current function + in the current compilation unit. The PTRCs are tail calls + to known functions in [future_funcnames], or tail calls to + unknown functions. +*) + +type polls_before_prtc = Might_not_poll | Always_polls + +module Polls_before_prtc = struct + type t = polls_before_prtc + + let bot = Always_polls + + let join t1 t2 = + match t1, t2 with + | Might_not_poll, Might_not_poll + | Might_not_poll, Always_polls + | Always_polls, Might_not_poll -> Might_not_poll + | Always_polls, Always_polls -> Always_polls + + let lessequal t1 t2 = + match t1, t2 with + | Always_polls, Always_polls + | Always_polls, Might_not_poll + | Might_not_poll, Might_not_poll -> true + | Might_not_poll, Always_polls -> false +end + +module PTRCAnalysis = Dataflow.Backward(Polls_before_prtc) + +let potentially_recursive_tailcall ~future_funcnames funbody = + let transfer i ~next ~exn = + match i.desc with + | Iend -> next + | Iop (Ialloc _ | Ipoll _) -> Always_polls + | Iop (Itailcall_ind) -> Might_not_poll (* this is a PTRC *) + | Iop (Itailcall_imm { func }) -> + if String.Set.mem func future_funcnames + || function_is_assumed_to_never_poll func + then Might_not_poll (* this is a PTRC *) + else Always_polls (* this is not a PTRC *) + | Iop op -> + if operation_can_raise op + then Polls_before_prtc.join next exn + else next + | Ireturn -> Always_polls + | Iifthenelse _ | Iswitch _ | Icatch _ | Iexit _ | Itrywith _ -> next + | Iraise _ -> exn + in + fst (PTRCAnalysis.analyze ~transfer funbody) + +(* We refer to the set of recursive handler labels that need extra polling + as the "unguarded back edges" ("ube"). + + Given the result of the analysis of recursive handlers, add [Ipoll] + instructions at the [Iexit] instructions before unguarded back edges, + thus ensuring that every loop contains a poll point. Also compute whether + the resulting function contains any [Ipoll] instructions. +*) + +let contains_polls = ref false + +let add_poll i = + contains_polls := true; + Mach.instr_cons (Iop (Ipoll { return_label = None })) [||] [||] i + +let instr_body handler_safe i = + let add_unsafe_handler ube (k, _) = + match handler_safe k with + | Safe -> ube + | Unsafe -> Int.Set.add k ube + in + let rec instr ube i = + match i.desc with + | Iifthenelse (test, i0, i1) -> + { i with + desc = Iifthenelse (test, instr ube i0, instr ube i1); + next = instr ube i.next; + } + | Iswitch (index, cases) -> + { i with + desc = Iswitch (index, Array.map (instr ube) cases); + next = instr ube i.next; + } + | Icatch (rc, hdl, body) -> + let ube' = + match rc with + | Cmm.Recursive -> List.fold_left add_unsafe_handler ube hdl + | Cmm.Nonrecursive -> ube in + let instr_handler (k, i0) = + let i1 = instr ube' i0 in + (k, i1) in + (* Since we are only interested in unguarded _back_ edges, we don't + use [ube'] for instrumenting [body], but just [ube] instead. *) + let body = instr ube body in + { i with + desc = Icatch (rc, + List.map instr_handler hdl, + body); + next = instr ube i.next; + } + | Iexit k -> + if Int.Set.mem k ube + then add_poll i + else i + | Itrywith (body, hdl) -> + { i with + desc = Itrywith (instr ube body, instr ube hdl); + next = instr ube i.next; + } + | Iend | Ireturn | Iraise _ -> i + | Iop op -> + begin match op with + | Ipoll _ -> contains_polls := true + | _ -> () + end; + { i with next = instr ube i.next } + in + instr Int.Set.empty i + +let instrument_fundecl ~future_funcnames:_ (f : Mach.fundecl) : Mach.fundecl = + if function_is_assumed_to_never_poll f.fun_name then f + else begin + let handler_needs_poll = polled_loops_analysis f.fun_body in + contains_polls := false; + let new_body = instr_body handler_needs_poll f.fun_body in + let new_contains_calls = f.fun_contains_calls || !contains_polls in + { f with fun_body = new_body; fun_contains_calls = new_contains_calls } + end + +let requires_prologue_poll ~future_funcnames ~fun_name i = + if function_is_assumed_to_never_poll fun_name then false + else + match potentially_recursive_tailcall ~future_funcnames i with + | Might_not_poll -> true + | Always_polls -> false diff --git a/asmcomp/polling.mli b/asmcomp/polling.mli new file mode 100644 index 00000000..c4629a78 --- /dev/null +++ b/asmcomp/polling.mli @@ -0,0 +1,26 @@ +(**************************************************************************) +(* *) +(* OCaml *) +(* *) +(* Xavier Leroy and Damien Doligez, projet Cambium, INRIA Paris *) +(* Sadiq Jaffer, OCaml Labs Consultancy Ltd *) +(* Stephen Dolan and Mark Shinwell, Jane Street Europe *) +(* *) +(* Copyright 2021 Institut National de Recherche en Informatique et *) +(* en Automatique. *) +(* Copyright 2021 OCaml Labs Consultancy Ltd *) +(* Copyright 2021 Jane Street Group LLC *) +(* *) +(* All rights reserved. This file is distributed under the terms of *) +(* the GNU Lesser General Public License version 2.1, with the *) +(* special exception on linking described in the file LICENSE. *) +(* *) +(**************************************************************************) + +(** Analyses related to the insertion of [Ipoll] operations. *) + +val instrument_fundecl : future_funcnames:Misc.Stdlib.String.Set.t + -> Mach.fundecl -> Mach.fundecl + +val requires_prologue_poll : future_funcnames:Misc.Stdlib.String.Set.t + -> fun_name:string -> Mach.instruction -> bool diff --git a/asmcomp/power/CSE.ml b/asmcomp/power/CSE.ml index b8454ffd..1e8a4690 100644 --- a/asmcomp/power/CSE.ml +++ b/asmcomp/power/CSE.ml @@ -26,7 +26,7 @@ inherit cse_generic as super method! class_of_operation op = match op with | Ispecific(Imultaddf | Imultsubf) -> Op_pure - | Ispecific(Ialloc_far _) -> Op_other + | Ispecific(Ialloc_far _) | Ispecific(Ipoll_far _) -> Op_other | _ -> super#class_of_operation op method! is_cheap_operation op = diff --git a/asmcomp/power/arch.ml b/asmcomp/power/arch.ml index 6f5898ed..a84f8e3b 100644 --- a/asmcomp/power/arch.ml +++ b/asmcomp/power/arch.ml @@ -32,6 +32,9 @@ let abi = | "ppc64le" -> ELF64v2 | _ -> assert false +type cmm_label = int +(* Do not introduce a dependency to Cmm *) + (* Machine-specific command-line options *) let big_toc = ref true @@ -50,6 +53,7 @@ type specific_operation = | Imultsubf (* multiply and subtract *) | Ialloc_far of (* allocation in large functions *) { bytes : int; dbginfo : Debuginfo.alloc_dbginfo } + | Ipoll_far of { return_label : cmm_label option } (* Addressing modes *) @@ -115,3 +119,17 @@ let print_specific_operation printreg op ppf arg = printreg arg.(0) printreg arg.(1) printreg arg.(2) | Ialloc_far { bytes; _ } -> fprintf ppf "alloc_far %d" bytes + | Ipoll_far _ -> + fprintf ppf "poll_far" + +(* Specific operations that are pure *) + +let operation_is_pure = function + | Ialloc_far _ | Ipoll_far _ -> false + | _ -> true + +(* Specific operations that can raise *) + +let operation_can_raise = function + | Ialloc_far _ | Ipoll_far _ -> true + | _ -> false diff --git a/asmcomp/power/emit.mlp b/asmcomp/power/emit.mlp index 08ae3137..badabd2e 100644 --- a/asmcomp/power/emit.mlp +++ b/asmcomp/power/emit.mlp @@ -23,6 +23,7 @@ open Reg open Mach open Linear open Emitaux +open Emitenv (* Reserved space at bottom of stack *) @@ -34,44 +35,39 @@ let reserved_stack_space = (* Layout of the stack. The stack is kept 16-aligned. *) -let stack_offset = ref 0 - -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false - -let contains_calls = ref false - -let initial_stack_offset () = +let initial_stack_offset f = reserved_stack_space + - size_int * num_stack_slots.(0) + (* Local int variables *) - size_float * num_stack_slots.(1) + (* Local float variables *) - (if !contains_calls && abi = ELF32 then size_int else 0) + size_int * f.fun_num_stack_slots.(0) + (* Local int variables *) + size_float * f.fun_num_stack_slots.(1) + (* Local float variables *) + (if f.fun_contains_calls && abi = ELF32 then size_int else 0) (* The return address *) -let frame_size () = +let frame_size env = let size = - !stack_offset + (* Trap frame, outgoing parameters *) - initial_stack_offset () in + env.stack_offset + (* Trap frame, outgoing parameters *) + initial_stack_offset env.f in Misc.align size 16 -let slot_offset loc cls = +let slot_offset env loc cls = match loc with Local n -> - reserved_stack_space + !stack_offset + - (if cls = 0 then num_stack_slots.(1) * size_float + n * size_int + reserved_stack_space + env.stack_offset + + (if cls = 0 then env.f.fun_num_stack_slots.(1) * size_float + n * size_int else n * size_float) - | Incoming n -> frame_size() + reserved_stack_space + n + | Incoming n -> + (* Callee's [reserved_stack_space] is included in [frame_size]. + To access incoming arguments, add caller's [reserverd_stack_space]. *) + frame_size env + reserved_stack_space + n | Outgoing n -> reserved_stack_space + n -let retaddr_offset () = +let retaddr_offset env = match abi with - | ELF32 -> frame_size() - size_addr - | ELF64v1 | ELF64v2 -> frame_size() + 16 + | ELF32 -> frame_size env - size_addr + | ELF64v1 | ELF64v2 -> frame_size env + 16 -let toc_save_offset () = +let toc_save_offset env = match abi with | ELF32 -> assert false - | ELF64v1 | ELF64v2 -> frame_size() + 8 + | ELF64v1 | ELF64v2 -> frame_size env + 8 let (trap_size, trap_handler_offset, trap_previous_offset) = match abi with @@ -135,10 +131,10 @@ let emit_reg r = (* Output a stack reference *) -let emit_stack r = +let emit_stack env r = match r.loc with | Stack s -> - let ofs = slot_offset s (register_class r) in `{emit_int ofs}(1)` + let ofs = slot_offset env s (register_class r) in `{emit_int ofs}(1)` | _ -> Misc.fatal_error "Emit.emit_stack" (* Output the name of a symbol plus an optional offset *) @@ -244,7 +240,12 @@ let emit_load_store instr addressing_mode addr n arg = let (lo, hi) = low_high_s d in if hi <> 0 then ` addis 11, 11, {emit_int hi}\n`; - ` {emit_string instr} {emit_reg arg}, {emit_int lo}(11)\n` + if valid_offset instr lo then + ` {emit_string instr} {emit_reg arg}, {emit_int lo}(11)\n` + else begin + ` li 0, {emit_int lo}\n`; + ` {emit_string instr}x {emit_reg arg}, 11, 0\n` + end end | Iindexed ofs -> if is_immediate ofs && valid_offset instr ofs then @@ -276,8 +277,8 @@ let emit_set_comp cmp res = (* Free the stack frame *) -let emit_free_frame () = - let n = frame_size() in +let emit_free_frame env = + let n = frame_size env in if n > 0 then ` addi 1, 1, {emit_int n}\n` @@ -299,18 +300,18 @@ let emit_call_nop () = (* Reload the TOC register r2 from the value saved on the stack *) -let emit_reload_toc () = - ` ld 2, {emit_int (toc_save_offset())}(1)\n` +let emit_reload_toc env = + ` ld 2, {emit_int (toc_save_offset env)}(1)\n` (* Adjust stack_offset and emit corresponding CFI directive *) -let adjust_stack_offset delta = - stack_offset := !stack_offset + delta; +let adjust_stack_offset env delta = + env.stack_offset <- env.stack_offset + delta; cfi_adjust_cfa_offset delta (* Record live pointers at call points *) -let record_frame live dbg = +let record_frame env live dbg = let lbl = new_label() in let live_offset = ref [] in Reg.Set.iter @@ -318,26 +319,15 @@ let record_frame live dbg = | {typ = Val; loc = Reg r} -> live_offset := ((r lsl 1) + 1) :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; `{emit_label lbl}:\n` -(* Record floating-point literals (for PPC32) *) - -let float_literals = ref ([] : (int64 * int) list) - -(* Record jump tables (for PPC64). In order to reduce the size of the TOC, - we concatenate all jumptables and emit them at the end of the compilation - unit. *) - -let jumptables = ref ([] : label list) (* in reverse order *) -let jumptables_lbl = ref (-1) - (* Names for conditional branches after comparisons *) let branch_for_comparison = function @@ -392,13 +382,6 @@ let name_for_specific = function | Imultsubf -> "fmsub" | _ -> Misc.fatal_error "Emit.Ispecific" -(* Name of current function *) -let function_name = ref "" -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 -(* Label of glue code for calling the GC *) -let call_gc_label = ref 0 - (* Relaxation of branches that exceed the span of a relative branch. *) module BR = Branch_relaxation.Make (struct @@ -415,6 +398,7 @@ module BR = Branch_relaxation.Make (struct let classify_instr = function | Lop (Ialloc _) + | Lop (Ipoll _) (* [Ialloc_far] does not need to be here, since its code sequence never involves any conditional branches that might need relaxing. *) | Lcondbranch _ @@ -435,10 +419,10 @@ module BR = Branch_relaxation.Make (struct | ELF32 -> 5 | ELF64v1 | ELF64v2 -> 6 - let prologue_size () = + let prologue_size f = profiling_prologue_size () - + (if initial_stack_offset () > 0 then 1 else 0) - + (if !contains_calls then + + (if initial_stack_offset f > 0 then 1 else 0) + + (if f.fun_contains_calls then 2 + match abi with | ELF32 -> 0 @@ -457,9 +441,9 @@ module BR = Branch_relaxation.Make (struct | Iindexed ofs -> if is_immediate ofs then 1 else 3 | Iindexed2 -> 1 - let instr_size = function + let instr_size f = function | Lend -> 0 - | Lprologue -> prologue_size () + | Lprologue -> prologue_size f | Lop(Imove | Ispill | Ireload) -> 1 | Lop(Iconst_int n) -> if is_native_immediate n then 1 @@ -474,20 +458,24 @@ module BR = Branch_relaxation.Make (struct | Lop(Icall_imm _) -> size 1 3 3 | Lop(Itailcall_ind) -> size 5 7 6 | Lop(Itailcall_imm { func; _ }) -> - if func = !function_name + if func = f.fun_name then 1 else size 4 (7 + tocload_size()) (6 + tocload_size()) | Lop(Iextcall { alloc = true; _ }) -> size 3 (2 + tocload_size()) (2 + tocload_size()) | Lop(Iextcall { alloc = false; _}) -> size 1 2 2 | Lop(Istackoffset _) -> 1 - | Lop(Iload(chunk, addr)) -> + | Lop(Iload(chunk, addr, _mut)) -> if chunk = Byte_signed then load_store_size addr + 1 else load_store_size addr | Lop(Istore(_chunk, addr, _)) -> load_store_size addr - | Lop(Ialloc _) -> 4 - | Lop(Ispecific(Ialloc_far _)) -> 5 + | Lop(Ialloc _) -> 5 + | Lop(Ispecific(Ialloc_far _)) -> 6 + | Lop(Ipoll { return_label = Some(_) }) -> 5 + | Lop(Ipoll { return_label = None }) -> 3 + | Lop(Ispecific(Ipoll_far { return_label = Some(_) } )) -> 5 + | Lop(Ispecific(Ipoll_far { return_label = None } )) -> 4 | Lop(Iintop Imod) -> 3 | Lop(Iintop(Icomp _)) -> 4 | Lop(Iintop _) -> 1 @@ -496,8 +484,8 @@ module BR = Branch_relaxation.Make (struct | Lop(Inegf | Iabsf | Iaddf | Isubf | Imulf | Idivf) -> 1 | Lop(Ifloatofint) -> 9 | Lop(Iintoffloat) -> 4 + | Lop(Iopaque) -> 0 | Lop(Ispecific _) -> 1 - | Lop (Iname_for_debugger _) -> 0 | Lreloadretaddr -> 2 | Lreturn -> 2 | Llabel _ -> 0 @@ -517,6 +505,9 @@ module BR = Branch_relaxation.Make (struct let relax_allocation ~num_bytes:bytes ~dbginfo = Lop (Ispecific (Ialloc_far { bytes; dbginfo })) + let relax_poll ~return_label = + Lop (Ispecific (Ipoll_far { return_label })) + (* [classify_addr], above, never identifies these instructions as needing relaxing. As such, these functions should never be called. *) let relax_specific_op _ = assert false @@ -524,28 +515,78 @@ module BR = Branch_relaxation.Make (struct let relax_intop_imm_checkbound ~bound:_ = assert false end) +(* Assembly code for inlined allocation *) + +let emit_alloc env i bytes dbginfo far = + if env.call_gc_label = 0 then env.call_gc_label <- new_label (); + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in + ` {emit_string lg} 0, {emit_int offset}(30)\n`; + ` addi 31, 31, {emit_int(-bytes)}\n`; + ` {emit_string cmplg} 31, 0\n`; + if not far then begin + ` bltl {emit_label env.call_gc_label}\n`; + record_frame env i.live (Dbg_alloc dbginfo); + ` addi {emit_reg i.res.(0)}, 31, {emit_int size_addr}\n` + end else begin + let lbl = new_label() in + ` bge {emit_label lbl}\n`; + ` bl {emit_label env.call_gc_label}\n`; + record_frame env i.live (Dbg_alloc dbginfo); + `{emit_label lbl}: addi {emit_reg i.res.(0)}, 31, {emit_int size_addr}\n` + end + +let emit_poll env i return_label far = + if env.call_gc_label = 0 then env.call_gc_label <- new_label (); + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in + ` {emit_string lg} 0, {emit_int offset}(30)\n`; + ` {emit_string cmplg} 31, 0\n`; + if not far then begin + begin match return_label with + | None -> + begin + ` bltl {emit_label env.call_gc_label}\n`; + record_frame env i.live (Dbg_alloc []) + end + | Some return_label -> + begin + ` bltl {emit_label env.call_gc_label}\n`; + record_frame env i.live (Dbg_alloc []); + ` b {emit_label return_label}\n` + end + end; + end else begin + let lbl = new_label () in + ` bge {emit_label lbl}\n`; + ` bl {emit_label env.call_gc_label}\n`; + record_frame env i.live (Dbg_alloc []); + ` {emit_label lbl}: \n`; + match return_label with + | None -> () + | Some return_label -> ` b {emit_label return_label}\n` + end + (* Output the assembly code for an instruction *) -let emit_instr i = +let emit_instr env i = emit_debug_info i.dbg; match i.desc with | Lend -> () | Lprologue -> - assert (!prologue_required); - let n = frame_size() in + assert (env.f.fun_prologue_required); + let n = frame_size env in if n > 0 then begin ` addi 1, 1, {emit_int(-n)}\n`; cfi_adjust_cfa_offset n end; - if !contains_calls then begin - let ra = retaddr_offset() in + if env.f.fun_contains_calls then begin + let ra = retaddr_offset env in ` mflr 0\n`; ` {emit_string stg} 0, {emit_int ra}(1)\n`; cfi_offset ~reg: 65 (* LR *) ~offset: (ra - n); match abi with | ELF32 -> () | ELF64v1 | ELF64v2 -> - ` std 2, {emit_int(toc_save_offset())}(1)\n` + ` std 2, {emit_int(toc_save_offset env)}(1)\n` end | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in @@ -556,13 +597,13 @@ let emit_instr i = | {loc = Reg _; typ = Float}, {loc = Reg _; typ = Float} -> ` fmr {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack _} -> - ` {emit_string stg} {emit_reg src}, {emit_stack dst}\n` + ` {emit_string stg} {emit_reg src}, {emit_stack env dst}\n` | {loc = Reg _; typ = Float}, {loc = Stack _} -> - ` stfd {emit_reg src}, {emit_stack dst}\n` + ` stfd {emit_reg src}, {emit_stack env dst}\n` | {loc = Stack _; typ = (Val | Int | Addr)}, {loc = Reg _} -> - ` {emit_string lg} {emit_reg dst}, {emit_stack src}\n` + ` {emit_string lg} {emit_reg dst}, {emit_stack env src}\n` | {loc = Stack _; typ = Float}, {loc = Reg _} -> - ` lfd {emit_reg dst}, {emit_stack src}\n` + ` lfd {emit_reg dst}, {emit_stack env src}\n` | (_, _) -> Misc.fatal_error "Emit: Imove" end @@ -594,7 +635,7 @@ let emit_instr i = begin match abi with | ELF32 -> let lbl = new_label() in - float_literals := (f, lbl) :: !float_literals; + env.float_literals <- { fl=f; lbl } :: env.float_literals; ` addis 11, 0, {emit_upper emit_label lbl}\n`; ` lfd {emit_reg i.res.(0)}, {emit_lower emit_label lbl}(11)\n` | ELF64v1 | ELF64v2 -> @@ -620,26 +661,26 @@ let emit_instr i = | ELF32 -> ` mtctr {emit_reg i.arg.(0)}\n`; ` bctrl\n`; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | ELF64v1 -> ` ld 0, 0({emit_reg i.arg.(0)})\n`; (* code pointer *) ` mtctr 0\n`; ` ld 2, 8({emit_reg i.arg.(0)})\n`; (* TOC for callee *) ` bctrl\n`; - record_frame i.live (Dbg_other i.dbg); - emit_reload_toc() + record_frame env i.live (Dbg_other i.dbg); + emit_reload_toc env | ELF64v2 -> ` mtctr {emit_reg i.arg.(0)}\n`; ` mr 12, {emit_reg i.arg.(0)}\n`; (* addr of fn in r12 *) ` bctrl\n`; - record_frame i.live (Dbg_other i.dbg); - emit_reload_toc() + record_frame env i.live (Dbg_other i.dbg); + emit_reload_toc env end | Lop(Icall_imm { func; }) -> begin match abi with | ELF32 -> emit_call func; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | ELF64v1 | ELF64v2 -> (* For PPC64, we cannot just emit a "bl s; nop" sequence, because of the following scenario: @@ -659,9 +700,9 @@ let emit_instr i = Cost: 3 instructions if same TOC, 7 if different TOC. Let's try option 2. *) emit_call func; - record_frame i.live (Dbg_other i.dbg); + record_frame env i.live (Dbg_other i.dbg); ` nop\n`; - emit_reload_toc() + emit_reload_toc env end | Lop(Itailcall_ind) -> begin match abi with @@ -675,15 +716,15 @@ let emit_instr i = ` mtctr {emit_reg i.arg.(0)}\n`; ` mr 12, {emit_reg i.arg.(0)}\n` (* addr of fn in r12 *) end; - if !contains_calls then begin - ` {emit_string lg} 11, {emit_int(retaddr_offset())}(1)\n`; + if env.f.fun_contains_calls then begin + ` {emit_string lg} 11, {emit_int(retaddr_offset env)}(1)\n`; ` mtlr 11\n` end; - emit_free_frame(); + emit_free_frame env; ` bctr\n` | Lop(Itailcall_imm { func; }) -> - if func = !function_name then - ` b {emit_label !tailrec_entry_point}\n` + if func = env.f.fun_name then + ` b {emit_label env.f.fun_tailrec_entry_point_label}\n` else begin begin match abi with | ELF32 -> @@ -697,11 +738,11 @@ let emit_instr i = emit_tocload emit_gpr 12 (TocSym func); (* addr of fn must be in r12 *) ` mtctr 12\n` end; - if !contains_calls then begin - ` {emit_string lg} 11, {emit_int(retaddr_offset())}(1)\n`; + if env.f.fun_contains_calls then begin + ` {emit_string lg} 11, {emit_int(retaddr_offset env)}(1)\n`; ` mtlr 11\n` end; - emit_free_frame(); + emit_free_frame env; begin match abi with | ELF32 -> ` b {emit_symbol func}\n` @@ -719,17 +760,17 @@ let emit_instr i = ` addis 25, 0, {emit_upper emit_symbol func}\n`; ` addi 25, 25, {emit_lower emit_symbol func}\n`; emit_call "caml_c_call"; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | ELF64v1 | ELF64v2 -> emit_tocload emit_gpr 25 (TocSym func); emit_call "caml_c_call"; - record_frame i.live (Dbg_other i.dbg); + record_frame env i.live (Dbg_other i.dbg); ` nop\n` end | Lop(Istackoffset n) -> ` addi 1, 1, {emit_int (-n)}\n`; - adjust_stack_offset n - | Lop(Iload(chunk, addr)) -> + adjust_stack_offset env n + | Lop(Iload(chunk, addr, _mut)) -> let loadinstr = match chunk with | Byte_unsigned -> "lbz" @@ -754,22 +795,14 @@ let emit_instr i = | Single -> "stfs" | Double | Double_u -> "stfd" in emit_load_store storeinstr addr i.arg 1 i.arg.(0) - | Lop(Ialloc { bytes = n; dbginfo }) -> - if !call_gc_label = 0 then call_gc_label := new_label (); - ` addi 31, 31, {emit_int(-n)}\n`; - ` {emit_string cmplg} 31, 30\n`; - ` bltl {emit_label !call_gc_label}\n`; - record_frame i.live (Dbg_alloc dbginfo); - ` addi {emit_reg i.res.(0)}, 31, {emit_int size_addr}\n`; - | Lop(Ispecific(Ialloc_far { bytes = n; dbginfo })) -> - if !call_gc_label = 0 then call_gc_label := new_label (); - let lbl = new_label() in - ` addi 31, 31, {emit_int(-n)}\n`; - ` {emit_string cmplg} 31, 30\n`; - ` bge {emit_label lbl}\n`; - ` bl {emit_label !call_gc_label}\n`; - record_frame i.live (Dbg_alloc dbginfo); - `{emit_label lbl}: addi {emit_reg i.res.(0)}, 31, {emit_int size_addr}\n` + | Lop(Ialloc { bytes; dbginfo }) -> + emit_alloc env i bytes dbginfo false + | Lop(Ispecific(Ialloc_far { bytes; dbginfo })) -> + emit_alloc env i bytes dbginfo true + | Lop(Ipoll { return_label }) -> + emit_poll env i return_label false + | Lop(Ispecific(Ipoll_far { return_label })) -> + emit_poll env i return_label true | Lop(Iintop Isub) -> (* subfc has swapped arguments *) ` subfc {emit_reg i.res.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(0)}\n` | Lop(Iintop Imod) -> @@ -787,7 +820,7 @@ let emit_instr i = end | Lop(Iintop (Icheckbound)) -> if !Clflags.debug then - record_frame Reg.Set.empty (Dbg_other i.dbg); + record_frame env Reg.Set.empty (Dbg_other i.dbg); ` {emit_string tglle} {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` | Lop(Iintop op) -> let instr = name_for_intop op in @@ -805,7 +838,7 @@ let emit_instr i = end | Lop(Iintop_imm(Icheckbound, n)) -> if !Clflags.debug then - record_frame Reg.Set.empty (Dbg_other i.dbg); + record_frame env Reg.Set.empty (Dbg_other i.dbg); ` {emit_string tglle}i {emit_reg i.arg.(0)}, {emit_int n}\n` | Lop(Iintop_imm(op, n)) -> let instr = name_for_intop_imm op in @@ -824,7 +857,7 @@ let emit_instr i = ` fcfid {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` end else begin let lbl = new_label() in - float_literals := (0x4330000080000000L, lbl) :: !float_literals; + env.float_literals <- {fl=0x4330000080000000L; lbl} :: env.float_literals; ` addis 11, 0, {emit_upper emit_label lbl}\n`; ` lfd 0, {emit_lower emit_label lbl}(11)\n`; ` lis 0, 0x4330\n`; @@ -847,15 +880,16 @@ let emit_instr i = ` lwz {emit_reg i.res.(0)}, 4(1)\n`; ` addi 1, 1, 16\n` end + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific sop) -> let instr = name_for_specific sop in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` - | Lop (Iname_for_debugger _) -> () | Lreloadretaddr -> - ` {emit_string lg} 11, {emit_int(retaddr_offset())}(1)\n`; + ` {emit_string lg} 11, {emit_int(retaddr_offset env)}(1)\n`; ` mtlr 11\n` | Lreturn -> - emit_free_frame(); + emit_free_frame env; ` blr\n` | Llabel lbl -> `{emit_label lbl}:\n` @@ -922,10 +956,16 @@ let emit_instr i = | Lswitch jumptbl -> let lbl = new_label() in if ppc64 then begin - if !jumptables_lbl < 0 then jumptables_lbl := lbl; - let start = List.length !jumptables in + let jumptables_lbl = match env.jumptables_lbl with + | None -> + env.jumptables_lbl <- Some lbl; + assert (List.length env.jumptables = 0); + lbl + | Some l-> l + in + let start = List.length env.jumptables in let (start_lo, start_hi) = low_high_s start in - emit_tocload emit_gpr 11 (TocLabel !jumptables_lbl); + emit_tocload emit_gpr 11 (TocLabel jumptables_lbl); ` addi 12, {emit_reg i.arg.(0)}, {emit_int start_lo}\n`; if start_hi <> 0 then ` addis 12, 12, {emit_int start_hi}\n`; @@ -940,7 +980,7 @@ let emit_instr i = ` mtctr 0\n`; ` bctr\n`; if ppc64 then begin - jumptables := List.rev_append (Array.to_list jumptbl) !jumptables + env.jumptables <- List.rev_append (Array.to_list jumptbl) env.jumptables end else begin emit_string rodata_space; `{emit_label lbl}:`; @@ -952,22 +992,22 @@ let emit_instr i = | Lentertrap -> begin match abi with | ELF32 -> () - | ELF64v1 | ELF64v2 -> emit_reload_toc() + | ELF64v1 | ELF64v2 -> emit_reload_toc env end | Ladjust_trap_depth { delta_traps } -> - adjust_stack_offset (trap_size * delta_traps) + adjust_stack_offset env (trap_size * delta_traps) | Lpushtrap { lbl_handler; } -> begin match abi with | ELF32 -> ` addis 11, 0, {emit_upper emit_label lbl_handler}\n`; ` addi 11, 11, {emit_lower emit_label lbl_handler}\n`; ` stwu 11, -16(1)\n`; - adjust_stack_offset 16; + adjust_stack_offset env 16; ` stw 29, 4(1)\n`; ` mr 29, 1\n` | ELF64v1 | ELF64v2 -> ` addi 1, 1, {emit_int (-trap_size)}\n`; - adjust_stack_offset trap_size; + adjust_stack_offset env trap_size; ` std 29, {emit_int trap_previous_offset}(1)\n`; emit_tocload emit_gpr 29 (TocLabel lbl_handler); ` std 29, {emit_int trap_handler_offset}(1)\n`; @@ -976,7 +1016,7 @@ let emit_instr i = | Lpoptrap -> ` {emit_string lg} 29, {emit_int trap_previous_offset}(1)\n`; ` addi 1, 1, {emit_int trap_size}\n`; - adjust_stack_offset (-trap_size) + adjust_stack_offset env (-trap_size) | Lraise k -> begin match k with | Lambda.Raise_regular -> @@ -985,15 +1025,15 @@ let emit_instr i = Domainstate.(idx_of_field Domain_backtrace_pos) in begin match abi with - | ELF32 -> ` stw 0, {emit_int (backtrace_pos * 8)}(28)\n` - | _ -> ` std 0, {emit_int (backtrace_pos * 8)}(28)\n` + | ELF32 -> ` stw 0, {emit_int (backtrace_pos * 8)}(30)\n` + | _ -> ` std 0, {emit_int (backtrace_pos * 8)}(30)\n` end; emit_call "caml_raise_exn"; - record_frame Reg.Set.empty (Dbg_raise i.dbg); + record_frame env Reg.Set.empty (Dbg_raise i.dbg); emit_call_nop() | Lambda.Raise_reraise -> emit_call "caml_raise_exn"; - record_frame Reg.Set.empty (Dbg_raise i.dbg); + record_frame env Reg.Set.empty (Dbg_raise i.dbg); emit_call_nop() | Lambda.Raise_notrace -> ` {emit_string lg} 0, {emit_int trap_handler_offset}(29)\n`; @@ -1006,25 +1046,15 @@ let emit_instr i = (* Emit a sequence of instructions *) -let rec emit_all i = +let rec emit_all env i = match i.desc with | Lend -> () - | _ -> emit_instr i; emit_all i.next + | _ -> emit_instr env i; emit_all env i.next (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - stack_offset := 0; - call_gc_label := 0; - float_literals := []; - jumptables := []; jumptables_lbl := -1; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - prologue_required := fundecl.fun_prologue_required; - contains_calls := fundecl.fun_contains_calls; + let env = mk_env fundecl in begin match abi with | ELF32 -> emit_string code_space; @@ -1057,11 +1087,11 @@ let fundecl fundecl = (* On this target, there is at most one "out of line" code block per function: a single "call GC" point. It comes immediately after the function's body. *) - BR.relax fundecl.fun_body ~max_out_of_line_code_offset:0; - emit_all fundecl.fun_body; + BR.relax fundecl ~max_out_of_line_code_offset:0; + emit_all env fundecl.fun_body; (* Emit the glue code to call the GC *) - if !call_gc_label > 0 then begin - `{emit_label !call_gc_label}:\n`; + if env.call_gc_label > 0 then begin + `{emit_label env.call_gc_label}:\n`; match abi with | ELF32 -> ` b {emit_symbol "caml_call_gc"}\n` @@ -1088,25 +1118,27 @@ let fundecl fundecl = ` .size {emit_symbol fundecl.fun_name}, . - .L.{emit_symbol fundecl.fun_name}\n` end; (* Emit the numeric literals *) - if !float_literals <> [] then begin + if env.float_literals <> [] then begin emit_string rodata_space; ` .align 3\n`; List.iter - (fun (f, lbl) -> + (fun { fl; lbl } -> `{emit_label lbl}:`; - emit_float64_split_directive ".long" f) - !float_literals + emit_float64_split_directive ".long" fl) + env.float_literals end; (* Emit the jump tables *) - if !jumptables <> [] then begin + match env.jumptables, env.jumptables_lbl with + | _ :: _, None | [], Some _ -> assert false (* Sanity check *) + | [], None -> () + | _ :: _, Some j -> emit_string rodata_space; ` .align 2\n`; - `{emit_label !jumptables_lbl}:`; + `{emit_label j}:`; List.iter (fun lbl -> - ` .long {emit_label lbl} - {emit_label !jumptables_lbl}\n`) - (List.rev !jumptables) - end + ` .long {emit_label lbl} - {emit_label j}\n`) + (List.rev env.jumptables) (* Emission of data *) diff --git a/asmcomp/power/proc.ml b/asmcomp/power/proc.ml index eec140db..c080768c 100644 --- a/asmcomp/power/proc.ml +++ b/asmcomp/power/proc.ml @@ -34,10 +34,9 @@ let word_addressed = false 3 - 10 function arguments and results 11 - 12 temporaries 13 pointer to small data area - 14 - 27 general purpose, preserved by C - 28 domain state pointer + 14 - 28 general purpose, preserved by C 29 trap pointer - 30 allocation limit + 30 domain state pointer 31 allocation pointer Floating-point register map: 0 temporary @@ -46,9 +45,9 @@ let word_addressed = false *) let int_reg_name = - [| "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; - "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; - "22"; "23"; "24"; "25"; "26"; "27" |] + [| "3"; "4"; "5"; "6"; "7"; "8"; "9"; "10"; (* 0 - 7 *) + "14"; "15"; "16"; "17"; "18"; "19"; "20"; "21"; (* 8 - 15 *) + "22"; "23"; "24"; "25"; "26"; "27"; "28" |] (* 16 - 22 *) let float_reg_name = [| "1"; "2"; "3"; "4"; "5"; "6"; "7"; "8"; @@ -63,7 +62,7 @@ let register_class r = | Val | Int | Addr -> 0 | Float -> 1 -let num_available_registers = [| 22; 31 |] +let num_available_registers = [| 23; 31 |] let first_available_register = [| 0; 100 |] @@ -75,7 +74,7 @@ let rotate_registers = true (* Representation of hard registers by pseudo-registers *) let hard_int_reg = - let v = Array.make 22 Reg.dummy in + let v = Array.make 23 Reg.dummy in for i = 0 to 21 do v.(i) <- Reg.at_location Int (Reg i) done; v let hard_float_reg = @@ -314,22 +313,11 @@ let destroyed_at_reloadretaddr = [| phys_reg 11 |] let safe_register_pressure = function Iextcall _ -> 14 - | _ -> 22 + | _ -> 23 let max_register_pressure = function Iextcall _ -> [| 14; 18 |] - | _ -> [| 22; 30 |] - -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false - | Ispecific(Imultaddf | Imultsubf) -> true - | Ispecific _ -> false - | _ -> true + | _ -> [| 23; 30 |] (* Layout of the stack *) diff --git a/asmcomp/power/scheduling.ml b/asmcomp/power/scheduling.ml index dcbfca79..8438a7d0 100644 --- a/asmcomp/power/scheduling.ml +++ b/asmcomp/power/scheduling.ml @@ -26,7 +26,7 @@ inherit Schedgen.scheduler_generic method oper_latency = function Ireload -> 2 - | Iload(_, _) -> 2 + | Iload(_, _, _) -> 2 | Iconst_float _ -> 2 (* turned into a load *) | Iconst_symbol _ -> 1 | Iintop(Imul | Imulh) -> 9 @@ -46,7 +46,7 @@ method! reload_retaddr_latency = 12 method oper_issue_cycles = function Iconst_float _ | Iconst_symbol _ -> 2 - | Iload(_, Ibased(_, _)) -> 2 + | Iload(_, Ibased(_, _), _) -> 2 | Istore(_, Ibased(_, _), _) -> 2 | Ialloc _ -> 4 | Iintop(Imod) -> 40 (* assuming full stall *) diff --git a/asmcomp/power/selection.ml b/asmcomp/power/selection.ml index 0e8d088a..ba95a61e 100644 --- a/asmcomp/power/selection.ml +++ b/asmcomp/power/selection.ml @@ -92,4 +92,5 @@ method! select_operation op args dbg = end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = + (new selector)#emit_fundecl ~future_funcnames f diff --git a/asmcomp/printcmm.ml b/asmcomp/printcmm.ml index d54a97d9..56bb967a 100644 --- a/asmcomp/printcmm.ml +++ b/asmcomp/printcmm.ml @@ -156,6 +156,7 @@ let operation d = function | Ccmpf c -> Printf.sprintf "%sf" (float_comparison c) | Craise k -> Lambda.raise_kind k ^ location d | Ccheckbound -> "checkbound" ^ location d + | Copaque -> "opaque" let rec expr ppf = function | Cconst_int (n, _dbg) -> fprintf ppf "%i" n diff --git a/asmcomp/printlinear.ml b/asmcomp/printlinear.ml index 433366c4..2ffe4092 100644 --- a/asmcomp/printlinear.ml +++ b/asmcomp/printlinear.ml @@ -30,7 +30,7 @@ let instr ppf i = fprintf ppf "prologue" | Lop op -> begin match op with - | Ialloc _ | Icall_ind | Icall_imm _ | Iextcall _ -> + | Ialloc _ | Ipoll _ | Icall_ind | Icall_imm _ | Iextcall _ -> fprintf ppf "@[<1>{%a}@]@," regsetaddr i.live | _ -> () end; diff --git a/asmcomp/printmach.ml b/asmcomp/printmach.ml index 3d6689c4..a0afc1a4 100644 --- a/asmcomp/printmach.ml +++ b/asmcomp/printmach.ml @@ -21,8 +21,6 @@ open Reg open Mach open Interval -module V = Backend_var - let reg ppf r = if not (Reg.anonymous r) then fprintf ppf "%s" (Reg.name r) @@ -122,9 +120,12 @@ let operation op arg ppf res = (if alloc then "" else " (noalloc)") | Istackoffset n -> fprintf ppf "offset stack %i" n - | Iload(chunk, addr) -> + | Iload(chunk, addr, Immutable) -> fprintf ppf "%s[%a]" (Printcmm.chunk chunk) (Arch.print_addressing reg addr) arg + | Iload(chunk, addr, Mutable) -> + fprintf ppf "%s mut[%a]" + (Printcmm.chunk chunk) (Arch.print_addressing reg addr) arg | Istore(chunk, addr, is_assign) -> fprintf ppf "%s[%a] := %a %s" (Printcmm.chunk chunk) @@ -144,31 +145,21 @@ let operation op arg ppf res = | Idivf -> fprintf ppf "%a /f %a" reg arg.(0) reg arg.(1) | Ifloatofint -> fprintf ppf "floatofint %a" reg arg.(0) | Iintoffloat -> fprintf ppf "intoffloat %a" reg arg.(0) - | Iname_for_debugger { ident; which_parameter; } -> - fprintf ppf "name_for_debugger %a%s=%a" - V.print ident - (match which_parameter with - | None -> "" - | Some index -> sprintf "[P%d]" index) - reg arg.(0) + | Iopaque -> fprintf ppf "opaque %a" reg arg.(0) | Ispecific op -> Arch.print_specific_operation reg op ppf arg + | Ipoll { return_label } -> + fprintf ppf "poll call"; + match return_label with + | None -> () + | Some return_label -> + fprintf ppf " returning to L%d" return_label let rec instr ppf i = if !Clflags.dump_live then begin fprintf ppf "@[<1>{%a" regsetaddr i.live; if Array.length i.arg > 0 then fprintf ppf "@ +@ %a" regs i.arg; fprintf ppf "}@]@,"; - if !Clflags.dump_avail then begin - let module RAS = Reg_availability_set in - fprintf ppf "@[<1>AB={%a}" (RAS.print ~print_reg:reg) i.available_before; - begin match i.available_across with - | None -> () - | Some available_across -> - fprintf ppf ",AA={%a}" (RAS.print ~print_reg:reg) available_across - end; - fprintf ppf "@]@," - end end; begin match i.desc with | Iend -> () diff --git a/asmcomp/proc.mli b/asmcomp/proc.mli index a92b1e9c..c1692c06 100644 --- a/asmcomp/proc.mli +++ b/asmcomp/proc.mli @@ -58,9 +58,6 @@ val destroyed_at_reloadretaddr : Reg.t array (* Volatile registers: those that change value when read *) val regs_are_volatile: Reg.t array -> bool -(* Pure operations *) -val op_is_pure: Mach.operation -> bool - (* Info for laying out the stack frame *) val frame_required : Mach.fundecl -> bool diff --git a/asmcomp/reloadgen.ml b/asmcomp/reloadgen.ml index a3505e15..a4ca5593 100644 --- a/asmcomp/reloadgen.ml +++ b/asmcomp/reloadgen.ml @@ -70,6 +70,10 @@ method reload_operation op arg res = | _ -> (arg, res) end + | Iopaque -> + (* arg = result, can be on stack or register *) + assert (arg.(0).stamp = res.(0).stamp); + (arg, res) | _ -> (self#makeregs arg, self#makeregs res) diff --git a/asmcomp/riscv/arch.ml b/asmcomp/riscv/arch.ml index 415c4792..3c4bb943 100644 --- a/asmcomp/riscv/arch.ml +++ b/asmcomp/riscv/arch.ml @@ -82,3 +82,11 @@ let print_specific_operation printreg op ppf arg = | Imultsubf true -> fprintf ppf "-f (%a *f %a -f %a)" printreg arg.(0) printreg arg.(1) printreg arg.(2) + +(* Specific operations that are pure *) + +let operation_is_pure _ = true + +(* Specific operations that can raise *) + +let operation_can_raise _ = false diff --git a/asmcomp/riscv/emit.mlp b/asmcomp/riscv/emit.mlp index 524087f9..47b09243 100644 --- a/asmcomp/riscv/emit.mlp +++ b/asmcomp/riscv/emit.mlp @@ -23,32 +23,27 @@ open Reg open Mach open Linear open Emitaux +open Emitenv (* Layout of the stack. The stack is kept 16-aligned. *) -let stack_offset = ref 0 - -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false - -let contains_calls = ref false - -let frame_size () = +let frame_size env = let size = - !stack_offset + (* Trap frame, outgoing parameters *) - size_int * num_stack_slots.(0) + (* Local int variables *) - size_float * num_stack_slots.(1) + (* Local float variables *) - (if !contains_calls then size_addr else 0) in (* The return address *) + env.stack_offset + (* Trap frame, outgoing parameters *) + size_int * env.f.fun_num_stack_slots.(0) + (* Local int variables *) + size_float * env.f.fun_num_stack_slots.(1) + (* Local float variables *) + (if env.f.fun_contains_calls then size_addr else 0) (* Return address *) + in Misc.align size 16 -let slot_offset loc cls = +let slot_offset env loc cls = match loc with | Local n -> if cls = 0 - then !stack_offset + num_stack_slots.(1) * size_float + n * size_int - else !stack_offset + n * size_float - | Incoming n -> frame_size() + n + then env.stack_offset + env.f.fun_num_stack_slots.(1) * size_float + + n * size_int + else env.stack_offset + n * size_float + | Incoming n -> frame_size env + n | Outgoing n -> n (* Output a symbol *) @@ -82,12 +77,11 @@ let rodata_space = (* Names for special regs *) -let reg_tmp = phys_reg 22 +let reg_tmp = phys_reg 23 let reg_t2 = phys_reg 16 -let reg_domain_state_ptr = phys_reg 23 +let reg_domain_state_ptr = phys_reg 26 let reg_trap = phys_reg 24 let reg_alloc_ptr = phys_reg 25 -let reg_alloc_lim = phys_reg 26 (* Output a pseudo-register *) @@ -143,7 +137,7 @@ let emit_float_store src ofs = (* Record live pointers at call points *) -let record_frame_label live dbg = +let record_frame_label env live dbg = let lbl = new_label () in let live_offset = ref [] in Reg.Set.iter @@ -151,65 +145,42 @@ let record_frame_label live dbg = {typ = Val; loc = Reg r} -> live_offset := (r lsl 1) + 1 :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> () ) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; lbl -let record_frame live dbg = - let lbl = record_frame_label live dbg in +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in `{emit_label lbl}:\n` -(* Record calls to the GC -- we've moved them out of the way *) - -type gc_call = - { gc_lbl: label; (* Entry label *) - gc_return_lbl: label; (* Where to branch after GC *) - gc_frame_lbl: label } (* Label of frame descriptor *) - -let call_gc_sites = ref ([] : gc_call list) - let emit_call_gc gc = `{emit_label gc.gc_lbl}:\n`; ` {emit_call "caml_call_gc"}\n`; `{emit_label gc.gc_frame_lbl}:\n`; ` j {emit_label gc.gc_return_lbl}\n` -(* Record calls to caml_ml_array_bound_error. - In debug mode, we maintain one call to caml_ml_array_bound_error - per bound check site. Otherwise, we can share a single call. *) - -type bound_error_call = - { bd_lbl: label; (* Entry label *) - bd_frame_lbl: label } (* Label of frame descriptor *) - -let bound_error_sites = ref ([] : bound_error_call list) - -let bound_error_label dbg = - if !Clflags.debug || !bound_error_sites = [] then begin +let bound_error_label env dbg = + if !Clflags.debug || env.bound_error_sites = [] then begin let lbl_bound_error = new_label() in - let lbl_frame = record_frame_label Reg.Set.empty (Dbg_other dbg) in - bound_error_sites := + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- { bd_lbl = lbl_bound_error; - bd_frame_lbl = lbl_frame } :: !bound_error_sites; + bd_frame = lbl_frame; } :: env.bound_error_sites; lbl_bound_error end else - let bd = List.hd !bound_error_sites in + let bd = List.hd env.bound_error_sites in bd.bd_lbl let emit_call_bound_error bd = `{emit_label bd.bd_lbl}:\n`; ` {emit_call "caml_ml_array_bound_error"}\n`; - `{emit_label bd.bd_frame_lbl}:\n` - -(* Record floating-point literals *) - -let float_literals = ref ([] : (int64 * int) list) + `{emit_label bd.bd_frame}:\n` (* Names for various instructions *) @@ -256,23 +227,17 @@ let name_for_specific = function | Imultsubf false -> "fmsub.d" | Imultsubf true -> "fnmsub.d" -(* Name of current function *) -let function_name = ref "" - -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 - (* Output the assembly code for an instruction *) -let emit_instr i = +let emit_instr env i = emit_debug_info i.dbg; match i.desc with Lend -> () | Lprologue -> - assert (!prologue_required); - let n = frame_size() in + assert (env.f.fun_prologue_required); + let n = frame_size env in emit_stack_adjustment (-n); - if !contains_calls then store_ra n + if env.f.fun_contains_calls then store_ra n | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in if src.loc <> dst.loc then begin @@ -284,16 +249,16 @@ let emit_instr i = | {loc = Reg _; typ = Float}, {loc = Reg _; typ = (Val | Int | Addr)} -> ` fmv.x.d {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack s} -> - let ofs = slot_offset s (register_class dst) in + let ofs = slot_offset env s (register_class dst) in emit_store src ofs | {loc = Reg _; typ = Float}, {loc = Stack s} -> - let ofs = slot_offset s (register_class dst) in + let ofs = slot_offset env s (register_class dst) in emit_float_store src ofs | {loc = Stack s; typ = (Val | Int | Addr)}, {loc = Reg _} -> - let ofs = slot_offset s (register_class src) in + let ofs = slot_offset env s (register_class src) in emit_load dst ofs | {loc = Stack s; typ = Float}, {loc = Reg _} -> - let ofs = slot_offset s (register_class src) in + let ofs = slot_offset env s (register_class src) in emit_float_load dst ofs | {loc = Stack _}, {loc = Stack _} | {loc = Unknown}, _ | _, {loc = Unknown} -> @@ -303,44 +268,44 @@ let emit_instr i = ` li {emit_reg i.res.(0)}, {emit_nativeint n}\n` | Lop(Iconst_float f) -> let lbl = new_label() in - float_literals := (f, lbl) :: !float_literals; + env.float_literals <- {fl=f; lbl} :: env.float_literals; ` fld {emit_reg i.res.(0)}, {emit_label lbl}, {emit_reg reg_tmp}\n` | Lop(Iconst_symbol s) -> ` la {emit_reg i.res.(0)}, {emit_symbol s}\n` | Lop(Icall_ind) -> ` jalr {emit_reg i.arg.(0)}\n`; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Icall_imm {func}) -> ` {emit_call func}\n`; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Itailcall_ind) -> - let n = frame_size() in - if !contains_calls then reload_ra n; + let n = frame_size env in + if env.f.fun_contains_calls then reload_ra n; emit_stack_adjustment n; ` jr {emit_reg i.arg.(0)}\n` | Lop(Itailcall_imm {func}) -> - if func = !function_name then begin - ` j {emit_label !tailrec_entry_point}\n` + if func = env.f.fun_name then begin + ` j {emit_label env.f.fun_tailrec_entry_point_label}\n` end else begin - let n = frame_size() in - if !contains_calls then reload_ra n; + let n = frame_size env in + if env.f.fun_contains_calls then reload_ra n; emit_stack_adjustment n; ` {emit_tail func}\n` end | Lop(Iextcall{func; alloc = true}) -> ` la {emit_reg reg_t2}, {emit_symbol func}\n`; ` {emit_call "caml_c_call"}\n`; - record_frame i.live (Dbg_other i.dbg) + record_frame env i.live (Dbg_other i.dbg) | Lop(Iextcall{func; alloc = false}) -> ` {emit_call func}\n` | Lop(Istackoffset n) -> assert (n mod 16 = 0); emit_stack_adjustment (-n); - stack_offset := !stack_offset + n - | Lop(Iload(Single, Iindexed ofs)) -> + env.stack_offset <- env.stack_offset + n + | Lop(Iload(Single, Iindexed ofs, _mut)) -> ` flw {emit_reg i.res.(0)}, {emit_int ofs}({emit_reg i.arg.(0)})\n`; ` fcvt.d.s {emit_reg i.res.(0)}, {emit_reg i.res.(0)}\n` - | Lop(Iload(chunk, Iindexed ofs)) -> + | Lop(Iload(chunk, Iindexed ofs, _mut)) -> let instr = match chunk with | Byte_unsigned -> "lbu" @@ -370,23 +335,43 @@ let emit_instr i = in ` {emit_string instr} {emit_reg i.arg.(0)}, {emit_int ofs}({emit_reg i.arg.(1)})\n` | Lop(Ialloc {bytes; dbginfo}) -> - let lbl_frame_lbl = record_frame_label i.live (Dbg_alloc dbginfo) in + let lbl_frame_lbl = record_frame_label env i.live (Dbg_alloc dbginfo) in let lbl_after_alloc = new_label () in let lbl_call_gc = new_label () in let n = -bytes in + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in if is_immediate n then ` addi {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, {emit_int n}\n` else begin ` li {emit_reg reg_tmp}, {emit_int n}\n`; ` add {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}\n` end; - ` bltu {emit_reg reg_alloc_ptr}, {emit_reg reg_alloc_lim}, {emit_label lbl_call_gc}\n`; + ` ld {emit_reg reg_tmp}, {emit_int offset}({emit_reg reg_domain_state_ptr})\n`; + ` bltu {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}, {emit_label lbl_call_gc}\n`; `{emit_label lbl_after_alloc}:\n`; ` addi {emit_reg i.res.(0)}, {emit_reg reg_alloc_ptr}, {emit_int size_addr}\n`; - call_gc_sites := + env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; - gc_frame_lbl = lbl_frame_lbl } :: !call_gc_sites + gc_frame_lbl = lbl_frame_lbl } :: env.call_gc_sites + | Lop(Ipoll { return_label }) -> + let lbl_frame_lbl = record_frame_label env i.live (Dbg_alloc []) in + let lbl_after_poll = match return_label with + | None -> new_label() + | Some(lbl) -> lbl in + let lbl_call_gc = new_label () in + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in + ` ld {emit_reg reg_tmp}, {emit_int offset}({emit_reg reg_domain_state_ptr})\n`; + begin match return_label with + | None -> ` bltu {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}, {emit_label lbl_call_gc}\n`; + `{emit_label lbl_after_poll}:\n`; + | Some lbl -> ` bgeu {emit_reg reg_alloc_ptr}, {emit_reg reg_tmp}, {emit_label lbl}\n`; + ` j {emit_label lbl_call_gc}\n` + end; + env.call_gc_sites <- + { gc_lbl = lbl_call_gc; + gc_return_lbl = lbl_after_poll; + gc_frame_lbl = lbl_frame_lbl } :: env.call_gc_sites | Lop(Iintop(Icomp cmp)) -> begin match cmp with | Isigned Clt -> @@ -417,7 +402,7 @@ let emit_instr i = ` xori {emit_reg i.res.(0)}, {emit_reg i.res.(0)}, 1\n`; end | Lop(Iintop (Icheckbound)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in ` bleu {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_label lbl}\n` | Lop(Iintop op) -> let instr = name_for_intop op in @@ -437,16 +422,16 @@ let emit_instr i = ` fcvt.d.l {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}\n` | Lop(Iintoffloat) -> ` fcvt.l.d {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, rtz\n` + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific sop) -> let instr = name_for_specific sop in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}, {emit_reg i.arg.(2)}\n` - | Lop (Iname_for_debugger _) -> - () | Lreloadretaddr -> - let n = frame_size () in + let n = frame_size env in reload_ra n | Lreturn -> - let n = frame_size() in + let n = frame_size env in emit_stack_adjustment n; ` ret\n` | Llabel lbl -> @@ -522,28 +507,28 @@ let emit_instr i = | Ladjust_trap_depth { delta_traps } -> (* each trap occupes 16 bytes on the stack *) let delta = 16 * delta_traps in - stack_offset := !stack_offset + delta + env.stack_offset <- env.stack_offset + delta | Lpushtrap {lbl_handler} -> ` la {emit_reg reg_tmp}, {emit_label lbl_handler}\n`; ` addi sp, sp, -16\n`; - stack_offset := !stack_offset + 16; + env.stack_offset <- env.stack_offset + 16; emit_store reg_tmp size_addr; emit_store reg_trap 0; ` mv {emit_reg reg_trap}, sp\n` | Lpoptrap -> emit_load reg_trap 0; ` addi sp, sp, 16\n`; - stack_offset := !stack_offset - 16 + env.stack_offset <- env.stack_offset - 16 | Lraise k -> begin match k with | Lambda.Raise_regular -> let offset = Domainstate.(idx_of_field Domain_backtrace_pos) * 8 in ` sd zero, {emit_int offset}({emit_reg reg_domain_state_ptr})\n`; ` {emit_call "caml_raise_exn"}\n`; - record_frame Reg.Set.empty (Dbg_raise i.dbg) + record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_reraise -> ` {emit_call "caml_raise_exn"}\n`; - record_frame Reg.Set.empty (Dbg_raise i.dbg) + record_frame env Reg.Set.empty (Dbg_raise i.dbg) | Lambda.Raise_notrace -> ` mv sp, {emit_reg reg_trap}\n`; emit_load reg_tmp size_addr; @@ -554,42 +539,32 @@ let emit_instr i = (* Emit a sequence of instructions *) -let rec emit_all = function - | {desc = Lend} -> () | i -> emit_instr i; emit_all i.next +let rec emit_all env = function + | {desc = Lend} -> () | i -> emit_instr env i; emit_all env i.next (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - stack_offset := 0; - call_gc_sites := []; - bound_error_sites := []; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - prologue_required := fundecl.fun_prologue_required; - contains_calls := fundecl.fun_contains_calls; - float_literals := []; + let env = mk_env fundecl in ` .globl {emit_symbol fundecl.fun_name}\n`; ` .type {emit_symbol fundecl.fun_name}, @function\n`; ` {emit_string code_space}\n`; ` .align 2\n`; `{emit_symbol fundecl.fun_name}:\n`; emit_debug_info fundecl.fun_dbg; - emit_all fundecl.fun_body; - List.iter emit_call_gc !call_gc_sites; - List.iter emit_call_bound_error !bound_error_sites; + emit_all env fundecl.fun_body; + List.iter emit_call_gc env.call_gc_sites; + List.iter emit_call_bound_error env.bound_error_sites; ` .size {emit_symbol fundecl.fun_name}, .-{emit_symbol fundecl.fun_name}\n`; (* Emit the float literals *) - if !float_literals <> [] then begin + if env.float_literals <> [] then begin ` {emit_string rodata_space}\n`; ` .align 3\n`; List.iter - (fun (f, lbl) -> + (fun {fl; lbl} -> `{emit_label lbl}:\n`; - emit_float64_directive ".quad" f) - !float_literals; + emit_float64_directive ".quad" fl) + env.float_literals; end (* Emission of data *) diff --git a/asmcomp/riscv/proc.ml b/asmcomp/riscv/proc.ml index 4e30e02b..0b37de4c 100644 --- a/asmcomp/riscv/proc.ml +++ b/asmcomp/riscv/proc.ml @@ -36,12 +36,12 @@ let word_addressed = false a0-a7 0-7 arguments/results s2-s9 8-15 arguments/results (preserved by C) t2-t6 16-20 temporary - t0 21 temporary - t1 22 temporary (used by code generator) - s0 23 domain pointer (preserved by C) + s0 21 general purpose (preserved by C) + t0 22 temporary + t1 23 temporary (used by code generator) s1 24 trap pointer (preserved by C) s10 25 allocation pointer (preserved by C) - s11 26 allocation limit (preserved by C) + s11 26 domain pointer (preserved by C) Floating-point register map --------------------------- @@ -65,11 +65,12 @@ let word_addressed = false *) let int_reg_name = - [| "a0"; "a1"; "a2"; "a3"; "a4"; "a5"; "a6"; "a7"; - "s2"; "s3"; "s4"; "s5"; "s6"; "s7"; "s8"; "s9"; - "t2"; "t3"; "t4"; "t5"; "t6"; - "t0"; "t1"; - "s0"; "s1"; "s10"; "s11" |] + [| "a0"; "a1"; "a2"; "a3"; "a4"; "a5"; "a6"; "a7"; (* 0 - 7 *) + "s2"; "s3"; "s4"; "s5"; "s6"; "s7"; "s8"; "s9"; (* 8 - 15 *) + "t2"; "t3"; "t4"; "t5"; "t6"; (* 16 - 20 *) + "s0"; (* 21 *) + "t0"; "t1"; (* 22 - 23 *) + "s1"; "s10"; "s11" |] (* 24 - 26 *) let float_reg_name = [| "ft0"; "ft1"; "ft2"; "ft3"; "ft4"; "ft5"; "ft6"; "ft7"; @@ -85,7 +86,7 @@ let register_class r = | Val | Int | Addr -> 0 | Float -> 1 -let num_available_registers = [| 22; 32 |] +let num_available_registers = [| 23; 32 |] let first_available_register = [| 0; 100 |] @@ -232,23 +233,24 @@ let regs_are_volatile _ = false (* Registers destroyed by operations *) let destroyed_at_c_call = - (* s0-s11 and fs0-fs11 are callee-save *) + (* s0-s11 and fs0-fs11 are callee-save. However s2 needs to be in this + list since it is clobbered by caml_c_call itself. *) Array.of_list(List.map phys_reg - [0; 1; 2; 3; 4; 5; 6; 7; 16; 17; 18; 19; 20; 21; + [0; 1; 2; 3; 4; 5; 6; 7; 8; 16; 17; 18; 19; 20; 22; 100; 101; 102; 103; 104; 105; 106; 107; 110; 111; 112; 113; 114; 115; 116; 117; 128; 129; 130; 131]) let destroyed_at_alloc = - (* t0-t3 are used for PLT stubs *) - if !Clflags.dlcode then Array.map phys_reg [|16; 17; 18; 19; 20; 21|] + (* t0-t6 are used for PLT stubs *) + if !Clflags.dlcode then Array.map phys_reg [|16; 17; 18; 19; 20; 22|] else [| |] let destroyed_at_oper = function | Iop(Icall_ind | Icall_imm _ | Iextcall{alloc = true; _}) -> all_phys_regs | Iop(Iextcall{alloc = false; _}) -> destroyed_at_c_call - | Iop(Ialloc _) -> destroyed_at_alloc + | Iop(Ialloc _) | Iop(Ipoll _) -> destroyed_at_alloc | Iop(Istore(Single, _, _)) -> [| phys_reg 100 |] - | Iswitch _ -> [| phys_reg 21 |] + | Iswitch _ -> [| phys_reg 22 |] (* t0 *) | _ -> [||] let destroyed_at_raise = all_phys_regs @@ -258,22 +260,12 @@ let destroyed_at_reloadretaddr = [| |] (* Maximal register pressure *) let safe_register_pressure = function - | Iextcall _ -> 15 - | _ -> 22 + | Iextcall _ -> 9 + | _ -> 23 let max_register_pressure = function - | Iextcall _ -> [| 15; 18 |] - | _ -> [| 22; 30 |] - -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false - | Ispecific(Imultaddf _ | Imultsubf _) -> true - | _ -> true + | Iextcall _ -> [| 9; 12 |] + | _ -> [| 23; 30 |] (* Layout of the stack *) @@ -292,8 +284,9 @@ let int_dwarf_reg_numbers = [| 10; 11; 12; 13; 14; 15; 16; 17; 18; 19; 20; 21; 22; 23; 24; 25; 7; 28; 29; 30; 31; + 8; 5; 6; - 8; 9; 26; 27; + 9; 26; 27; |] let float_dwarf_reg_numbers = diff --git a/asmcomp/riscv/selection.ml b/asmcomp/riscv/selection.ml index c99e1b3c..d56ed90f 100644 --- a/asmcomp/riscv/selection.ml +++ b/asmcomp/riscv/selection.ml @@ -61,4 +61,5 @@ method! select_operation op args dbg = end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = + (new selector)#emit_fundecl ~future_funcnames f diff --git a/asmcomp/s390x/arch.ml b/asmcomp/s390x/arch.ml index a6353fdf..d755a6de 100644 --- a/asmcomp/s390x/arch.ml +++ b/asmcomp/s390x/arch.ml @@ -87,3 +87,11 @@ let print_specific_operation printreg op ppf arg = | Imultsubf -> fprintf ppf "%a *f %a -f %a" printreg arg.(0) printreg arg.(1) printreg arg.(2) + +(* Specific operations that are pure *) + +let operation_is_pure _ = true + +(* Specific operations that can raise *) + +let operation_can_raise _ = false diff --git a/asmcomp/s390x/emit.mlp b/asmcomp/s390x/emit.mlp index 5088075c..8713a1c0 100644 --- a/asmcomp/s390x/emit.mlp +++ b/asmcomp/s390x/emit.mlp @@ -24,32 +24,24 @@ open Reg open Mach open Linear open Emitaux +open Emitenv -(* Layout of the stack. The stack is kept 8-aligned. *) - -let stack_offset = ref 0 - -let num_stack_slots = Array.make Proc.num_register_classes 0 - -let prologue_required = ref false - -let contains_calls = ref false - -let frame_size () = +let frame_size env = let size = - !stack_offset + (* Trap frame, outgoing parameters *) - size_int * num_stack_slots.(0) + (* Local int variables *) - size_float * num_stack_slots.(1) + (* Local float variables *) - (if !contains_calls then size_addr else 0) in (* The return address *) + env.stack_offset + (* Trap frame, outgoing parameters *) + size_int * env.f.fun_num_stack_slots.(0) + (* Local int variables *) + size_float * env.f.fun_num_stack_slots.(1) + (* Local float variables *) + (if env.f.fun_contains_calls then size_addr else 0) in (* The return address *) Misc.align size 8 -let slot_offset loc cls = +let slot_offset env loc cls = match loc with Local n -> if cls = 0 - then !stack_offset + num_stack_slots.(1) * size_float + n * size_int - else !stack_offset + n * size_float - | Incoming n -> frame_size() + n + then env.stack_offset + + env.f.fun_num_stack_slots.(1) * size_float + n * size_int + else env.stack_offset + n * size_float + | Incoming n -> frame_size env + n | Outgoing n -> n (* Output a symbol *) @@ -99,10 +91,10 @@ let reg_r7 = check_phys_reg 5 "%r7" (* Output a stack reference *) -let emit_stack r = +let emit_stack env r = match r.loc with Stack s -> - let ofs = slot_offset s (register_class r) in `{emit_int ofs}(%r15)` + let ofs = slot_offset env s (register_class r) in `{emit_int ofs}(%r15)` | _ -> fatal_error "Emit.emit_stack" @@ -168,7 +160,7 @@ let emit_set_comp cmp res = (* Record live pointers at call points *) -let record_frame_label live dbg = +let record_frame_label env live dbg = let lbl = new_label() in let live_offset = ref [] in Reg.Set.iter @@ -176,67 +168,49 @@ let record_frame_label live dbg = | {typ = Val; loc = Reg r} -> live_offset := (r lsl 1) + 1 :: !live_offset | {typ = Val; loc = Stack s} as reg -> - live_offset := slot_offset s (register_class reg) :: !live_offset + live_offset := slot_offset env s (register_class reg) :: !live_offset | {typ = Addr} as r -> Misc.fatal_error ("bad GC root " ^ Reg.name r) | _ -> ()) live; - record_frame_descr ~label:lbl ~frame_size:(frame_size()) + record_frame_descr ~label:lbl ~frame_size:(frame_size env) ~live_offset:!live_offset dbg; lbl -let record_frame live dbg = - let lbl = record_frame_label live dbg in +let record_frame env live dbg = + let lbl = record_frame_label env live dbg in `{emit_label lbl}:` -(* Record calls to caml_call_gc, emitted out of line. *) - -type gc_call = - { gc_lbl: label; (* Entry label *) - gc_return_lbl: label; (* Where to branch after GC *) - gc_frame_lbl: label } (* Label of frame descriptor *) - -let call_gc_sites = ref ([] : gc_call list) - let emit_call_gc gc = `{emit_label gc.gc_lbl}:`; emit_call "caml_call_gc"; `{emit_label gc.gc_frame_lbl}: brcl 15, {emit_label gc.gc_return_lbl}\n` -(* Record calls to caml_ml_array_bound_error, emitted out of line. *) - -type bound_error_call = - { bd_lbl: label; (* Entry label *) - bd_frame: label } (* Label of frame descriptor *) - -let bound_error_sites = ref ([] : bound_error_call list) -let bound_error_call = ref 0 - -let bound_error_label dbg = +let bound_error_label env dbg = if !Clflags.debug then begin let lbl_bound_error = new_label() in - let lbl_frame = record_frame_label Reg.Set.empty (Dbg_other dbg) in - bound_error_sites := - { bd_lbl = lbl_bound_error; bd_frame = lbl_frame } :: !bound_error_sites; + let lbl_frame = record_frame_label env Reg.Set.empty (Dbg_other dbg) in + env.bound_error_sites <- + { bd_lbl = lbl_bound_error; bd_frame = lbl_frame; } + :: env.bound_error_sites; lbl_bound_error end else begin - if !bound_error_call = 0 then bound_error_call := new_label(); - !bound_error_call + match env.bound_error_call with + | None -> let lbl = new_label() in + env.bound_error_call <- Some lbl; + lbl + | Some lbl -> lbl end let emit_call_bound_error bd = `{emit_label bd.bd_lbl}:`; emit_call "caml_ml_array_bound_error"; `{emit_label bd.bd_frame}:\n` -let emit_call_bound_errors () = - List.iter emit_call_bound_error !bound_error_sites; - if !bound_error_call > 0 then begin - `{emit_label !bound_error_call}:`; emit_call "caml_ml_array_bound_error"; - end - -(* Record floating-point and large integer literals *) - -let float_literals = ref ([] : (int64 * int) list) -let int_literals = ref ([] : (nativeint * int) list) +let emit_call_bound_errors env = + List.iter emit_call_bound_error env.bound_error_sites; + match env.bound_error_call with + | None -> () + | Some lbl -> + `{emit_label lbl}:`; emit_call "caml_ml_array_bound_error" (* Masks for conditional branches after comparisons *) @@ -298,22 +272,17 @@ let name_for_specific = function Imultaddf -> "madbr" | Imultsubf -> "msdbr" -(* Name of current function *) -let function_name = ref "" -(* Entry point for tail recursive calls *) -let tailrec_entry_point = ref 0 - (* Output the assembly code for an instruction *) -let emit_instr i = +let emit_instr env i = emit_debug_info i.dbg; match i.desc with Lend -> () | Lprologue -> - assert (!prologue_required); - let n = frame_size() in + assert (env.f.fun_prologue_required); + let n = frame_size env in emit_stack_adjust n; - if !contains_calls then + if env.f.fun_contains_calls then ` stg %r14, {emit_int(n - size_addr)}(%r15)\n` | Lop(Imove | Ispill | Ireload) -> let src = i.arg.(0) and dst = i.res.(0) in @@ -324,13 +293,13 @@ let emit_instr i = | {loc = Reg _; typ = Float}, {loc = Reg _; typ = Float} -> ` ldr {emit_reg dst}, {emit_reg src}\n` | {loc = Reg _; typ = (Val | Int | Addr)}, {loc = Stack _} -> - ` stg {emit_reg src}, {emit_stack dst}\n` + ` stg {emit_reg src}, {emit_stack env dst}\n` | {loc = Reg _; typ = Float}, {loc = Stack _} -> - ` std {emit_reg src}, {emit_stack dst}\n` + ` std {emit_reg src}, {emit_stack env dst}\n` | {loc = Stack _; typ = (Val | Int | Addr)}, {loc = Reg _} -> - ` lg {emit_reg dst}, {emit_stack src}\n` + ` lg {emit_reg dst}, {emit_stack env src}\n` | {loc = Stack _; typ = Float}, {loc = Reg _} -> - ` ldy {emit_reg dst}, {emit_stack src}\n` + ` ldy {emit_reg dst}, {emit_stack env src}\n` | (_, _) -> fatal_error "Emit: Imove" end @@ -340,36 +309,36 @@ let emit_instr i = end else if n >= -0x8000_0000n && n <= 0x7FFF_FFFFn then begin ` lgfi {emit_reg i.res.(0)}, {emit_nativeint n}\n`; end else begin - let lbl = new_label() in - int_literals := (n, lbl) :: !int_literals; - ` lgrl {emit_reg i.res.(0)}, {emit_label lbl}\n`; + let n_lbl = new_label() in + env.int_literals <- {n; n_lbl} :: env.int_literals; + ` lgrl {emit_reg i.res.(0)}, {emit_label n_lbl}\n`; end - | Lop(Iconst_float f) -> + | Lop(Iconst_float fl) -> let lbl = new_label() in - float_literals := (f, lbl) :: !float_literals; + env.float_literals <- { fl; lbl } :: env.float_literals; ` larl %r1, {emit_label lbl}\n`; ` ld {emit_reg i.res.(0)}, 0(%r1)\n` | Lop(Iconst_symbol s) -> emit_load_symbol_addr i.res.(0) s | Lop(Icall_ind) -> ` basr %r14, {emit_reg i.arg.(0)}\n`; - `{record_frame i.live (Dbg_other i.dbg)}\n` + `{record_frame env i.live (Dbg_other i.dbg)}\n` | Lop(Icall_imm { func; }) -> emit_call func; - `{record_frame i.live (Dbg_other i.dbg)}\n` + `{record_frame env i.live (Dbg_other i.dbg)}\n` | Lop(Itailcall_ind) -> - let n = frame_size() in - if !contains_calls then + let n = frame_size env in + if env.f.fun_contains_calls then ` lg %r14, {emit_int(n - size_addr)}(%r15)\n`; emit_stack_adjust (-n); ` br {emit_reg i.arg.(0)}\n` | Lop(Itailcall_imm { func; }) -> - if func = !function_name then - ` brcl 15, {emit_label !tailrec_entry_point}\n` + if func = env.f.fun_name then + ` brcl 15, {emit_label env.f.fun_tailrec_entry_point_label}\n` else begin - let n = frame_size() in - if !contains_calls then + let n = frame_size env in + if env.f.fun_contains_calls then ` lg %r14, {emit_int(n - size_addr)}(%r15)\n`; emit_stack_adjust (-n); if !pic_code then @@ -383,14 +352,14 @@ let emit_instr i = else begin emit_load_symbol_addr reg_r7 func; emit_call "caml_c_call"; - `{record_frame i.live (Dbg_other i.dbg)}\n` + `{record_frame env i.live (Dbg_other i.dbg)}\n` end | Lop(Istackoffset n) -> emit_stack_adjust n; - stack_offset := !stack_offset + n + env.stack_offset <- env.stack_offset + n - | Lop(Iload(chunk, addr)) -> + | Lop(Iload(chunk, addr, _mut)) -> let loadinstr = match chunk with Byte_unsigned -> "llgc" @@ -424,19 +393,40 @@ let emit_instr i = let lbl_after_alloc = new_label() in let lbl_call_gc = new_label() in let lbl_frame = - record_frame_label i.live (Dbg_alloc dbginfo) + record_frame_label env i.live (Dbg_alloc dbginfo) in - call_gc_sites := + env.call_gc_sites <- { gc_lbl = lbl_call_gc; gc_return_lbl = lbl_after_alloc; - gc_frame_lbl = lbl_frame } :: !call_gc_sites; + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites; ` lay %r11, {emit_int(-n)}(%r11)\n`; let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in ` clg %r11, {emit_int offset}(%r10)\n`; ` brcl 4, {emit_label lbl_call_gc}\n`; (* less than *) `{emit_label lbl_after_alloc}:`; ` la {emit_reg i.res.(0)}, 8(%r11)\n` - + | Lop(Ipoll { return_label }) -> + let offset = Domainstate.(idx_of_field Domain_young_limit) * 8 in + ` clg %r11, {emit_int offset}(%r10)\n`; + let lbl_call_gc = new_label () in + let label_after_gc = match return_label with + | None -> new_label() + | Some(lbl) -> lbl in + let lbl_frame = + record_frame_label env i.live (Dbg_alloc []) + in + begin match return_label with + | None -> ` brcl 4, {emit_label lbl_call_gc}\n`; (* less than *) + | Some return_label -> ` brcl 10, {emit_label return_label}\n`; (* greater or equal *) + end; + env.call_gc_sites <- + { gc_lbl = lbl_call_gc; + gc_return_lbl = label_after_gc; + gc_frame_lbl = lbl_frame; } :: env.call_gc_sites; + begin match return_label with + | None -> `{emit_label label_after_gc}:`; + | Some _ -> ` brcl 15, {emit_label lbl_call_gc}\n`; (* unconditional *) + end | Lop(Iintop Imulh) -> (* Hacker's Delight section 8.3: mul-high-signed(a, b) = mul-high-unsigned(a, b) @@ -480,7 +470,7 @@ let emit_instr i = ` lghi {emit_reg i.res.(0)}, 0\n`; `{emit_label lbl}:\n` | Lop(Iintop (Icheckbound)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in ` clgr {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n`; ` brcl 12, {emit_label lbl}\n` (* branch if unsigned le *) | Lop(Iintop op) -> @@ -500,7 +490,7 @@ let emit_instr i = ` lghi {emit_reg i.res.(0)}, 0\n`; `{emit_label lbl}:\n` | Lop(Iintop_imm(Icheckbound, n)) -> - let lbl = bound_error_label i.dbg in + let lbl = bound_error_label env i.dbg in if n >= 0 then begin ` clgfi {emit_reg i.arg.(0)}, {emit_int n}\n`; ` brcl 12, {emit_label lbl}\n` (* branch if unsigned le *) @@ -539,16 +529,17 @@ let emit_instr i = | Lop(Iintoffloat) -> (* rounding method #5 = round toward 0 *) ` cgdbr {emit_reg i.res.(0)}, 5, {emit_reg i.arg.(0)}\n` + | Lop(Iopaque) -> + assert (i.arg.(0).loc = i.res.(0).loc) | Lop(Ispecific sop) -> assert (i.arg.(2).loc = i.res.(0).loc); let instr = name_for_specific sop in ` {emit_string instr} {emit_reg i.res.(0)}, {emit_reg i.arg.(0)}, {emit_reg i.arg.(1)}\n` - | Lop (Iname_for_debugger _) -> () | Lreloadretaddr -> - let n = frame_size() in + let n = frame_size env in ` lg %r14, {emit_int(n - size_addr)}(%r15)\n` | Lreturn -> - let n = frame_size() in + let n = frame_size env in emit_stack_adjust (-n); ` br %r14\n` | Llabel lbl -> @@ -617,9 +608,9 @@ let emit_instr i = (* each trap occupies 16 bytes on the stack *) let delta = 16 * delta_traps in emit_stack_adjust delta; - stack_offset := !stack_offset + delta + env.stack_offset <- env.stack_offset + delta | Lpushtrap { lbl_handler; } -> - stack_offset := !stack_offset + 16; + env.stack_offset <- env.stack_offset + 16; emit_stack_adjust 16; ` larl %r14, {emit_label lbl_handler}\n`; ` stg %r14, 0(%r15)\n`; @@ -628,7 +619,7 @@ let emit_instr i = | Lpoptrap -> ` lg %r13, {emit_int size_addr}(%r15)\n`; emit_stack_adjust (-16); - stack_offset := !stack_offset - 16 + env.stack_offset <- env.stack_offset - 16 | Lraise k -> begin match k with | Lambda.Raise_regular-> @@ -636,10 +627,10 @@ let emit_instr i = ` lghi %r1, 0\n`; ` stg %r1, {emit_int offset}(%r10)\n`; emit_call "caml_raise_exn"; - `{record_frame Reg.Set.empty (Dbg_raise i.dbg)}\n` + `{record_frame env Reg.Set.empty (Dbg_raise i.dbg)}\n` | Lambda.Raise_reraise -> emit_call "caml_raise_exn"; - `{record_frame Reg.Set.empty (Dbg_raise i.dbg)}\n` + `{record_frame env Reg.Set.empty (Dbg_raise i.dbg)}\n` | Lambda.Raise_notrace -> ` lg %r1, 0(%r13)\n`; ` lgr %r15, %r13\n`; @@ -651,53 +642,41 @@ let emit_instr i = (* Emit a sequence of instructions *) -let rec emit_all i = +let rec emit_all env i = match i with {desc = Lend} -> () | _ -> - emit_instr i; - emit_all i.next + emit_instr env i; + emit_all env i.next (* Emission of a function declaration *) let fundecl fundecl = - function_name := fundecl.fun_name; - tailrec_entry_point := fundecl.fun_tailrec_entry_point_label; - stack_offset := 0; - call_gc_sites := []; - bound_error_sites := []; - bound_error_call := 0; - float_literals := []; - int_literals := []; - for i = 0 to Proc.num_register_classes - 1 do - num_stack_slots.(i) <- fundecl.fun_num_stack_slots.(i); - done; - prologue_required := fundecl.fun_prologue_required; - contains_calls := fundecl.fun_contains_calls; + let env = mk_env fundecl in ` .globl {emit_symbol fundecl.fun_name}\n`; emit_debug_info fundecl.fun_dbg; ` .type {emit_symbol fundecl.fun_name}, @function\n`; emit_string code_space; ` .align 8\n`; `{emit_symbol fundecl.fun_name}:\n`; - emit_all fundecl.fun_body; + emit_all env fundecl.fun_body; (* Emit the glue code to call the GC *) - List.iter emit_call_gc !call_gc_sites; + List.iter emit_call_gc env.call_gc_sites; (* Emit the glue code to handle bound errors *) - emit_call_bound_errors(); + emit_call_bound_errors env; (* Emit the numeric literals *) - if !float_literals <> [] || !int_literals <> [] then begin + if env.float_literals <> [] || env.int_literals <> [] then begin emit_string rodata_space; ` .align 8\n`; List.iter - (fun (f, lbl) -> + (fun {fl; lbl} -> `{emit_label lbl}:`; - emit_float64_directive ".quad" f) - !float_literals; + emit_float64_directive ".quad" fl) + env.float_literals; List.iter - (fun (n, lbl) -> - `{emit_label lbl}: .quad {emit_nativeint n}\n`) - !int_literals + (fun {n; n_lbl} -> + `{emit_label n_lbl}: .quad {emit_nativeint n}\n`) + env.int_literals end (* Emission of data *) diff --git a/asmcomp/s390x/proc.ml b/asmcomp/s390x/proc.ml index d9aa9ea3..1319359f 100644 --- a/asmcomp/s390x/proc.ml +++ b/asmcomp/s390x/proc.ml @@ -209,16 +209,6 @@ let max_register_pressure = function Iextcall _ -> [| 4; 7 |] | _ -> [| 9; 15 |] -(* Pure operations (without any side effect besides updating their result - registers). *) - -let op_is_pure = function - | Icall_ind | Icall_imm _ | Itailcall_ind | Itailcall_imm _ - | Iextcall _ | Istackoffset _ | Istore _ | Ialloc _ - | Iintop(Icheckbound) | Iintop_imm(Icheckbound, _) -> false - | Ispecific(Imultaddf | Imultsubf) -> true - | _ -> true - (* Layout of the stack *) let frame_required fd = diff --git a/asmcomp/s390x/scheduling.ml b/asmcomp/s390x/scheduling.ml index a766d6a3..a3098470 100644 --- a/asmcomp/s390x/scheduling.ml +++ b/asmcomp/s390x/scheduling.ml @@ -35,7 +35,7 @@ inherit Schedgen.scheduler_generic method oper_latency = function Ireload -> 4 - | Iload(_, _) -> 4 + | Iload(_, _, _) -> 4 | Iconst_float _ -> 4 (* turned into a load *) | Iintop(Imul) -> 10 | Iintop_imm(Imul, _) -> 10 @@ -49,7 +49,7 @@ method! reload_retaddr_latency = 4 (* Issue cycles. Rough approximations. *) method oper_issue_cycles = function - | Ialloc _ -> 4 + | Ialloc _ | Ipoll _ -> 4 | Iintop(Imulh) -> 15 | Iintop(Idiv|Imod) -> 20 | Iintop(Icomp _) -> 4 diff --git a/asmcomp/s390x/selection.ml b/asmcomp/s390x/selection.ml index 604fd7a3..96bd6a99 100644 --- a/asmcomp/s390x/selection.ml +++ b/asmcomp/s390x/selection.ml @@ -114,4 +114,5 @@ method! insert_op_debug env op dbg rs rd = end -let fundecl f = (new selector)#emit_fundecl f +let fundecl ~future_funcnames f = + (new selector)#emit_fundecl ~future_funcnames f diff --git a/asmcomp/schedgen.ml b/asmcomp/schedgen.ml index e138930e..942e35e8 100644 --- a/asmcomp/schedgen.ml +++ b/asmcomp/schedgen.ml @@ -121,7 +121,7 @@ let rec longest_path critical_outputs node = node.length <- List.fold_left (fun len (son, delay) -> - max len (longest_path critical_outputs son + delay)) + Int.max len (longest_path critical_outputs son + delay)) 0 sons end; node.length @@ -135,7 +135,7 @@ let rec remove_instr node = function (* We treat Lreloadretaddr as a word-sized load *) -let some_load = (Iload(Cmm.Word_int, Arch.identity_addressing)) +let some_load = (Iload(Cmm.Word_int, Arch.identity_addressing, Mutable)) (* The generic scheduler *) @@ -154,7 +154,7 @@ method oper_in_basic_block = function | Itailcall_imm _ -> false | Iextcall _ -> false | Istackoffset _ -> false - | Ialloc _ -> false + | Ialloc _ | Ipoll _ -> false | _ -> true (* Determine whether an instruction ends a basic block or not *) @@ -181,7 +181,7 @@ method is_store = function | _ -> false method is_load = function - Iload(_, _) -> true + Iload(_, _, _) -> true | _ -> false method is_checkbound = function diff --git a/asmcomp/selectgen.ml b/asmcomp/selectgen.ml index 4571c340..d2498276 100644 --- a/asmcomp/selectgen.ml +++ b/asmcomp/selectgen.ml @@ -85,6 +85,7 @@ let oper_result_type = function | Cintoffloat -> typ_int | Craise _ -> typ_void | Ccheckbound -> typ_void + | Copaque -> typ_val (* Infer the size in bytes of the result of an expression whose evaluation may be deferred (cf. [emit_parts]). *) @@ -322,7 +323,7 @@ method is_simple_expr = function | Cop(op, args, _) -> begin match op with (* The following may have side effects *) - | Capply _ | Cextcall _ | Calloc | Cstore _ | Craise _ -> false + | Capply _ | Cextcall _ | Calloc | Cstore _ | Craise _ | Copaque -> false (* The remaining operations are simple if their args are *) | Cload _ | Caddi | Csubi | Cmuli | Cmulhi | Cdivi | Cmodi | Cand | Cor | Cxor | Clsl | Clsr | Casr | Ccmpi _ | Caddv | Cadda | Ccmpa _ | Cnegf @@ -361,7 +362,7 @@ method effects_of exp = | Cop (op, args, _) -> let from_op = match op with - | Capply _ | Cextcall _ -> EC.arbitrary + | Capply _ | Cextcall _ | Copaque -> EC.arbitrary | Calloc -> EC.none | Cstore _ -> EC.effect_only Effect.Arbitrary | Craise _ | Ccheckbound -> EC.effect_only Effect.Raise @@ -414,9 +415,9 @@ method mark_instr = function self#mark_call | Iop (Itailcall_ind | Itailcall_imm _) -> self#mark_tailcall - | Iop (Ialloc _) -> - self#mark_call (* caml_alloc*, caml_garbage_collection *) - | Iop (Iintop(Icheckbound) | Iintop_imm(Icheckbound, _)) -> + | Iop (Ialloc _) | Iop (Ipoll _) -> + self#mark_call (* caml_alloc*, caml_garbage_collection (incl. polls) *) + | Iop (Iintop (Icheckbound) | Iintop_imm(Icheckbound, _)) -> self#mark_c_tailcall (* caml_ml_array_bound_error *) | Iraise raise_kind -> begin match raise_kind with @@ -442,9 +443,9 @@ method select_operation op args _dbg = (Icall_ind, args) | (Cextcall(func, ty_res, ty_args, alloc), _) -> Iextcall { func; ty_res; ty_args; alloc; }, args - | (Cload (chunk, _mut), [arg]) -> + | (Cload (chunk, mut), [arg]) -> let (addr, eloc) = self#select_addressing chunk arg in - (Iload(chunk, addr), [eloc]) + (Iload(chunk, addr, mut), [eloc]) | (Cstore (chunk, init), [arg1; arg2]) -> let (addr, eloc) = self#select_addressing chunk arg1 in let is_assign = @@ -555,12 +556,15 @@ method insert_debug _env desc dbg arg res = method insert _env desc arg res = instr_seq <- instr_cons desc arg res instr_seq -method extract = +method extract_onto o = let rec extract res i = if i == dummy_instr - then res - else extract {i with next = res} i.next in - extract (end_instr ()) instr_seq + then res + else extract {i with next = res} i.next in + extract o instr_seq + +method extract = + self#extract_onto (end_instr ()) (* Insert a sequence of moves from one pseudoreg set to another. *) @@ -569,7 +573,7 @@ method insert_move env src dst = self#insert env (Iop Imove) [|src|] [|dst|] method insert_moves env src dst = - for i = 0 to min (Array.length src) (Array.length dst) - 1 do + for i = 0 to Stdlib.Int.min (Array.length src) (Array.length dst) - 1 do self#insert_move env src.(i) dst.(i) done @@ -674,6 +678,13 @@ method emit_expr (env:environment) exp = dbg, Cconst_int (1, dbg), dbg, Cconst_int (0, dbg), dbg)) + | Cop(Copaque, args, dbg) -> + begin match self#emit_parts_list env args with + None -> None + | Some (simple_args, env) -> + let rs = self#emit_tuple env simple_args in + Some (self#insert_op_debug env Iopaque dbg rs rs) + end | Cop(op, args, dbg) -> begin match self#emit_parts_list env args with None -> None @@ -1150,7 +1161,7 @@ method private emit_tail_sequence env exp = (* Sequentialization of a function definition *) -method emit_fundecl f = +method emit_fundecl ~future_funcnames f = current_function_name := f.Cmm.fun_name; let rargs = List.map @@ -1162,13 +1173,23 @@ method emit_fundecl f = List.fold_right2 (fun (id, _ty) r env -> env_add id r env) f.Cmm.fun_args rargs env_empty in - self#insert_moves env loc_arg rarg; self#emit_tail env f.Cmm.fun_body; let body = self#extract in - instr_iter (fun instr -> self#mark_instr instr.Mach.desc) body; + instr_seq <- dummy_instr; + self#insert_moves env loc_arg rarg; + let polled_body = + if Polling.requires_prologue_poll ~future_funcnames + ~fun_name:f.Cmm.fun_name body + then + instr_cons (Iop(Ipoll { return_label = None })) [||] [||] body + else + body + in + let body_with_prologue = self#extract_onto polled_body in + instr_iter (fun instr -> self#mark_instr instr.Mach.desc) body_with_prologue; { fun_name = f.Cmm.fun_name; fun_args = loc_arg; - fun_body = body; + fun_body = body_with_prologue; fun_codegen_options = f.Cmm.fun_codegen_options; fun_dbg = f.Cmm.fun_dbg; fun_num_stack_slots = Array.make Proc.num_register_classes 0; diff --git a/asmcomp/selectgen.mli b/asmcomp/selectgen.mli index c657e109..d7147192 100644 --- a/asmcomp/selectgen.mli +++ b/asmcomp/selectgen.mli @@ -63,7 +63,7 @@ class virtual selector_generic : object (* The following methods must or can be overridden by the processor description *) method is_immediate : Mach.integer_operation -> int -> bool - (* Must be overriden to indicate whether a constant is a suitable + (* Must be overridden to indicate whether a constant is a suitable immediate operand to the given integer arithmetic instruction. The default implementation handles shifts by immediate amounts, but produces no immediate operations otherwise. *) @@ -139,12 +139,14 @@ class virtual selector_generic : object above; overloading this is useful if Ispecific instructions need marking *) - (* The following method is the entry point and should not be overridden. *) - method emit_fundecl : Cmm.fundecl -> Mach.fundecl + (* The following method is the entry point and should not be overridden *) + method emit_fundecl : future_funcnames:Misc.Stdlib.String.Set.t + -> Cmm.fundecl -> Mach.fundecl (* The following methods should not be overridden. They cannot be declared "private" in the current implementation because they are not always applied to "self", but ideally they should be private. *) + method extract_onto : Mach.instruction -> Mach.instruction method extract : Mach.instruction method insert : environment -> Mach.instruction_desc -> Reg.t array -> Reg.t array -> unit diff --git a/asmcomp/selection.mli b/asmcomp/selection.mli index 3c055fe0..0a0680bd 100644 --- a/asmcomp/selection.mli +++ b/asmcomp/selection.mli @@ -16,4 +16,5 @@ (* Selection of pseudo-instructions, assignment of pseudo-registers, sequentialization. *) -val fundecl: Cmm.fundecl -> Mach.fundecl +val fundecl: future_funcnames:Misc.Stdlib.String.Set.t + -> Cmm.fundecl -> Mach.fundecl diff --git a/asmcomp/spill.ml b/asmcomp/spill.ml index 870c46f6..195974b6 100644 --- a/asmcomp/spill.ml +++ b/asmcomp/spill.ml @@ -124,13 +124,15 @@ let add_reloads regset i = (fun r i -> instr_cons (Iop Ireload) [|spill_reg r|] [|r|] i) regset i -let reload_at_exit = ref [] +let reload_at_exit : (int, Reg.Set.t) Hashtbl.t = Hashtbl.create 20 -let find_reload_at_exit k = - try - List.assoc k !reload_at_exit - with - | Not_found -> Misc.fatal_error "Spill.find_reload_at_exit" +let get_reload_at_exit k = + match Hashtbl.find_opt reload_at_exit k with + | None -> Reg.Set.empty + | Some s -> s + +let set_reload_at_exit k s = + Hashtbl.replace reload_at_exit k s let rec reload i before = incr current_date; @@ -169,7 +171,7 @@ let rec reload i before = let date_ifso = !current_date in current_date := date_fork; let (new_ifnot, after_ifnot) = reload ifnot at_fork in - current_date := max date_ifso !current_date; + current_date := Int.max date_ifso !current_date; let (new_next, finally) = reload i.next (Reg.Set.union after_ifso after_ifnot) in let new_i = @@ -189,7 +191,7 @@ let rec reload i before = current_date := date_fork; let (new_c, after_c) = reload c at_fork in after_cases := Reg.Set.union !after_cases after_c; - date_join := max !date_join !current_date; + date_join := Int.max !date_join !current_date; new_c) cases in current_date := !date_join; @@ -199,31 +201,32 @@ let rec reload i before = i.arg i.res new_next), finally) | Icatch(rec_flag, handlers, body) -> - let new_sets = List.map - (fun (nfail, _) -> nfail, ref Reg.Set.empty) handlers in - let previous_reload_at_exit = !reload_at_exit in - reload_at_exit := new_sets @ !reload_at_exit ; let (new_body, after_body) = reload body before in let rec fixpoint () = - let at_exits = List.map (fun (nfail, set) -> (nfail, !set)) new_sets in + let at_exits = + List.map (fun (nfail, _) -> (nfail, get_reload_at_exit nfail)) + handlers in let res = - List.map2 (fun (nfail', handler) (nfail, at_exit) -> + List.map2 + (fun (nfail', handler) (nfail, at_exit) -> assert(nfail = nfail'); - reload handler at_exit) handlers at_exits in + reload handler at_exit) + handlers at_exits in match rec_flag with | Cmm.Nonrecursive -> res | Cmm.Recursive -> - let equal = List.for_all2 (fun (nfail', at_exit) (nfail, new_set) -> - assert(nfail = nfail'); - Reg.Set.equal at_exit !new_set) - at_exits new_sets in + let equal = + List.for_all2 + (fun (nfail', _) (nfail, at_exit) -> + assert(nfail = nfail'); + Reg.Set.equal at_exit (get_reload_at_exit nfail)) + handlers at_exits in if equal then res else fixpoint () in let res = fixpoint () in - reload_at_exit := previous_reload_at_exit; let union = List.fold_left (fun acc (_, after_handler) -> Reg.Set.union acc after_handler) after_body res in @@ -235,8 +238,8 @@ let rec reload i before = (Icatch(rec_flag, new_handlers, new_body)) i.arg i.res new_next, finally) | Iexit nfail -> - let set = find_reload_at_exit nfail in - set := Reg.Set.union !set before; + set_reload_at_exit nfail + (Reg.Set.union (get_reload_at_exit nfail) before); (i, Reg.Set.empty) | Itrywith(body, handler) -> let (new_body, after_body) = reload body before in @@ -268,17 +271,15 @@ let rec reload i before = NB ter: is it the same thing for catch bodies ? *) -(* CR mshinwell for pchambart: Try to test the new algorithms for dealing - with Icatch. *) +let spill_at_exit : (int, Reg.Set.t) Hashtbl.t = Hashtbl.create 20 -let spill_at_exit = ref [] -let find_spill_at_exit k = - try - let used, set = List.assoc k !spill_at_exit in - used := true; - set - with - | Not_found -> Misc.fatal_error "Spill.find_spill_at_exit" +let get_spill_at_exit k = + match Hashtbl.find_opt spill_at_exit k with + | None -> Reg.Set.empty + | Some s -> s + +let set_spill_at_exit k s = + Hashtbl.replace spill_at_exit k s let spill_at_raise = ref Reg.Set.empty let inside_loop = ref false @@ -301,16 +302,13 @@ let rec spill i finally = let before1 = Reg.diff_set_array after i.res in (instr_cons i.desc i.arg i.res new_next, Reg.add_set_array before1 i.res) - | Iop _ -> + | Iop op -> let (new_next, after) = spill i.next finally in let before1 = Reg.diff_set_array after i.res in let before = - match i.desc with - Iop(Icall_ind) | Iop(Icall_imm _) | Iop(Iextcall _) | Iop(Ialloc _) - | Iop(Iintop (Icheckbound)) | Iop(Iintop_imm(Icheckbound, _)) -> - Reg.Set.union before1 !spill_at_raise - | _ -> - before1 in + if operation_can_raise op + then Reg.Set.union before1 !spill_at_raise + else before1 in (instr_cons_debug i.desc i.arg i.res i.dbg (add_spills (Reg.inter_set_array after i.res) new_next), before) @@ -357,45 +355,30 @@ let rec spill i finally = let (new_next, at_join) = spill i.next finally in let saved_inside_catch = !inside_catch in inside_catch := true ; - let previous_spill_at_exit = !spill_at_exit in - let spill_at_exit_add at_exits = List.map2 - (fun (nfail,_) at_exit -> nfail, (ref false, at_exit)) - handlers at_exits - in - let rec fixpoint at_exits = - let spill_at_exit_add = spill_at_exit_add at_exits in - spill_at_exit := spill_at_exit_add @ !spill_at_exit; + let rec fixpoint () = let res = - List.map (fun (_, handler) -> spill handler at_join) handlers - in - spill_at_exit := previous_spill_at_exit; - match rec_flag with - | Cmm.Nonrecursive -> - res - | Cmm.Recursive -> - let equal = - List.for_all2 - (fun (_new_handler, new_at_exit) (_, (used, at_exit)) -> - Reg.Set.equal at_exit new_at_exit || not !used) - res spill_at_exit_add in - if equal - then res - else fixpoint (List.map snd res) + List.map (fun (_, handler) -> spill handler at_join) handlers in + let update changed (k, _handler) (_new_handler, before_handler) = + if Reg.Set.equal before_handler (get_spill_at_exit k) + then changed + else (set_spill_at_exit k before_handler; true) in + let changed = + List.fold_left2 update false handlers res in + if rec_flag = Cmm.Recursive && changed + then fixpoint () + else res in - let res = fixpoint (List.map (fun _ -> Reg.Set.empty) handlers) in + let res = fixpoint () in inside_catch := saved_inside_catch ; - let spill_at_exit_add = spill_at_exit_add (List.map snd res) in - spill_at_exit := spill_at_exit_add @ !spill_at_exit; let (new_body, before) = spill body at_join in - spill_at_exit := previous_spill_at_exit; let new_handlers = List.map2 - (fun (nfail, _) (handler, _) -> nfail, handler) + (fun (nfail, _) (new_handler, _) -> (nfail, new_handler)) handlers res in (instr_cons (Icatch(rec_flag, new_handlers, new_body)) i.arg i.res new_next, before) | Iexit nfail -> - (i, find_spill_at_exit nfail) + (i, get_spill_at_exit nfail) | Itrywith(body, handler) -> let (new_next, at_join) = spill i.next finally in let (new_handler, before_handler) = spill handler at_join in @@ -414,18 +397,17 @@ let reset () = spill_env := Reg.Map.empty; use_date := Reg.Map.empty; current_date := 0; - destroyed_at_fork := [] + destroyed_at_fork := []; + Hashtbl.clear reload_at_exit; + Hashtbl.clear spill_at_exit let fundecl f = reset (); - let (body1, _) = reload f.fun_body Reg.Set.empty in let (body2, tospill_at_entry) = spill body1 Reg.Set.empty in let new_body = add_spills (Reg.inter_set_array tospill_at_entry f.fun_args) body2 in - spill_env := Reg.Map.empty; - use_date := Reg.Map.empty; - destroyed_at_fork := []; + reset (); { fun_name = f.fun_name; fun_args = f.fun_args; fun_body = new_body; diff --git a/boot/menhir/menhirLib.ml b/boot/menhir/menhirLib.ml index 8e1dc20f..f1782933 100644 --- a/boot/menhir/menhirLib.ml +++ b/boot/menhir/menhirLib.ml @@ -43,7 +43,7 @@ let rec uniq1 cmp x ys = [] | y :: ys -> if cmp x y = 0 then - uniq1 compare x ys + uniq1 cmp x ys else y :: uniq1 cmp y ys @@ -85,7 +85,6 @@ let rec foldr f xs accu = accu | Cons (x, xs) -> f x (foldr f xs accu) - end module Convert = struct (******************************************************************************) @@ -291,9 +290,9 @@ module type INCREMENTAL_ENGINE = sig | Rejected (* [offer] allows the user to resume the parser after it has suspended - itself with a checkpoint of the form [InputNeeded env]. [offer] expects the - old checkpoint as well as a new token and produces a new checkpoint. It does not - raise any exception. *) + itself with a checkpoint of the form [InputNeeded env]. [offer] expects + the old checkpoint as well as a new token and produces a new checkpoint. + It does not raise any exception. *) val offer: 'a checkpoint -> @@ -302,10 +301,30 @@ module type INCREMENTAL_ENGINE = sig (* [resume] allows the user to resume the parser after it has suspended itself with a checkpoint of the form [AboutToReduce (env, prod)] or - [HandlingError env]. [resume] expects the old checkpoint and produces a new - checkpoint. It does not raise any exception. *) + [HandlingError env]. [resume] expects the old checkpoint and produces a + new checkpoint. It does not raise any exception. *) + + (* The optional argument [strategy] influences the manner in which [resume] + deals with checkpoints of the form [ErrorHandling _]. Its default value + is [`Legacy]. It can be briefly described as follows: + + - If the [error] token is used only to report errors (that is, if the + [error] token appears only at the end of a production, whose semantic + action raises an exception) then the simplified strategy should be + preferred. (This includes the case where the [error] token does not + appear at all in the grammar.) + + - If the [error] token is used to recover after an error, or if + perfect backward compatibility is required, the legacy strategy + should be selected. + + More details on these strategies appear in the file [Engine.ml]. *) + + type strategy = + [ `Legacy | `Simplified ] val resume: + ?strategy:strategy -> 'a checkpoint -> 'a checkpoint @@ -315,7 +334,8 @@ module type INCREMENTAL_ENGINE = sig type supplier = unit -> token * position * position - (* A pair of a lexer and a lexing buffer can be easily turned into a supplier. *) + (* A pair of a lexer and a lexing buffer can be easily turned into a + supplier. *) val lexer_lexbuf_to_supplier: (Lexing.lexbuf -> token) -> @@ -330,9 +350,11 @@ module type INCREMENTAL_ENGINE = sig (* [loop supplier checkpoint] begins parsing from [checkpoint], reading tokens from [supplier]. It continues parsing until it reaches a checkpoint of the form [Accepted v] or [Rejected]. In the former case, it - returns [v]. In the latter case, it raises the exception [Error]. *) + returns [v]. In the latter case, it raises the exception [Error]. + The optional argument [strategy], whose default value is [Legacy], + is passed to [resume] and influences the error-handling strategy. *) - val loop: supplier -> 'a checkpoint -> 'a + val loop: ?strategy:strategy -> supplier -> 'a checkpoint -> 'a (* [loop_handle succeed fail supplier checkpoint] begins parsing from [checkpoint], reading tokens from [supplier]. It continues parsing until @@ -341,10 +363,10 @@ module type INCREMENTAL_ENGINE = sig observed first). In the former case, it calls [succeed v]. In the latter case, it calls [fail] with this checkpoint. It cannot raise [Error]. - This means that Menhir's traditional error-handling procedure (which pops - the stack until a state that can act on the [error] token is found) does - not get a chance to run. Instead, the user can implement her own error - handling code, in the [fail] continuation. *) + This means that Menhir's error-handling procedure does not get a chance + to run. For this reason, there is no [strategy] parameter. Instead, the + user can implement her own error handling code, in the [fail] + continuation. *) val loop_handle: ('a -> 'answer) -> @@ -1012,6 +1034,7 @@ module type MONOLITHIC_ENGINE = sig exception Error val entry: + (* strategy: *) [ `Legacy | `Simplified ] -> (* see [IncrementalEngine] *) state -> (Lexing.lexbuf -> token) -> Lexing.lexbuf -> @@ -1137,6 +1160,74 @@ module Make (T : TABLE) = struct (* ------------------------------------------------------------------------ *) + (* As of 2020/12/16, we introduce a choice between multiple error handling + strategies. *) + + (* Regardless of the strategy, when a syntax error is encountered, the + function [initiate] is called, a [HandlingError] checkpoint is produced, + and (after resuming) the function [error] is called. This function checks + whether the current state allows shifting, reducing, or neither, when the + lookahead token is [error]. Its behavior, then, depends on the strategy, + as follows. *) + + (* In the legacy strategy, which until now was the only strategy, + + - If shifting is possible, then a [Shifting] checkpoint is produced, + whose field [please_discard] is [true], so (after resuming) an + [InputNeeded] checkpoint is produced, and (after a new token + has been provided) the parser leaves error-handling mode and + returns to normal mode. + + - If reducing is possible, then one or more reductions are performed. + Default reductions are announced via [AboutToReduce] checkpoints, + whereas ordinary reductions are performed silently. (It is unclear + why this is so.) The parser remains in error-handling mode, so + another [HandlingError] checkpoint is produced, and the function + [error] is called again. + + - If neither action is possible and if the stack is nonempty, then a + cell is popped off the stack, then a [HandlingError] checkpoint is + produced, and the function [error] is called again. + + - If neither action is possible and if the stack is empty, then the + parse dies with a [Reject] checkpoint. *) + + (* The simplified strategy differs from the legacy strategy as follows: + + - When shifting, a [Shifting] checkpoint is produced, whose field + [please_discard] is [false], so the parser does not request another + token, and the parser remains in error-handling mode. (If the + destination state of this shift transition has a default reduction, + then the parser will perform this reduction as its next step.) + + - When reducing, all reductions are announced by [AboutToReduce] + checkpoints. + + - If neither shifting [error] nor reducing on [error] is possible, + then the parser dies with a [Reject] checkpoint. (The parser does + not attempt to pop cells off the stack one by one.) + + This simplified strategy is appropriate when the grammar uses the [error] + token in a limited way, where the [error] token always appears at the end + of a production whose semantic action raises an exception (whose purpose + is to signal a syntax error and perhaps produce a custom message). Then, + the parser must not request one token past the syntax error. (In a REPL, + that would be undesirable.) It must perform as many reductions on [error] + as possible, then (if possible) shift the [error] token and move to a new + state where a default reduction will be possible. (Because the [error] + token always appears at the end of a production, no other action can + exist in that state, so a default reduction must exist.) The semantic + action raises an exception, and that is it. *) + + (* Let us note that it is also possible to perform no error handling at + all, or to perform customized error handling, by stopping as soon as + the first [ErrorHandling] checkpoint appears. *) + + type strategy = + [ `Legacy | `Simplified ] + + (* ------------------------------------------------------------------------ *) + (* In the code-based back-end, the [run] function is sometimes responsible for pushing a new cell on the stack. This is motivated by code sharing concerns. In this interpreter, there is no such concern; [run]'s caller @@ -1222,8 +1313,9 @@ module Make (T : TABLE) = struct (* Note that, if [please_discard] was true, then we have just called [discard], so the lookahead token cannot be [error]. *) - (* Returning [HandlingError env] is equivalent to calling [error env] - directly, except it allows the user to regain control. *) + (* Returning [HandlingError env] is like calling [error ~strategy env] + directly, except it allows the user to regain control and choose an + error-handling strategy. *) if env.error then begin if log then @@ -1374,7 +1466,7 @@ module Make (T : TABLE) = struct (* [error] handles errors. *) - and error env = + and error ~strategy env = assert env.error; (* Consult the column associated with the [error] pseudo-token in the @@ -1384,39 +1476,64 @@ module Make (T : TABLE) = struct env.current (* determines a row *) T.error_terminal (* determines a column *) T.error_value - error_shift (* shift continuation *) - error_reduce (* reduce continuation *) - error_fail (* failure continuation *) + (error_shift ~strategy) (* shift continuation *) + (error_reduce ~strategy) (* reduce continuation *) + (error_fail ~strategy) (* failure continuation *) env - and error_shift env please_discard terminal value s' = - - (* Here, [terminal] is [T.error_terminal], - and [value] is [T.error_value]. *) - + and error_shift ~strategy env please_discard terminal value s' = assert (terminal = T.error_terminal && value = T.error_value); (* This state is capable of shifting the [error] token. *) if log then Log.handling_error env.current; + + (* In the simplified strategy, we change [please_discard] to [false], + which means that we won't request the next token and (therefore) + we will remain in error-handling mode after shifting the [error] + token. *) + + let please_discard = + match strategy with `Legacy -> please_discard | `Simplified -> false + in + shift env please_discard terminal value s' - and error_reduce env prod = + and error_reduce ~strategy env prod = (* This state is capable of performing a reduction on [error]. *) if log then Log.handling_error env.current; - reduce env prod - (* Intentionally calling [reduce] instead of [announce_reduce]. - It does not seem very useful, and it could be confusing, to - expose the reduction steps taken during error handling. *) - and error_fail env = + (* In the legacy strategy, we call [reduce] instead of [announce_reduce], + apparently in an attempt to hide the reduction steps performed during + error handling. This seems inconsistent, as the default reduction steps + are still announced. In the simplified strategy, all reductions are + announced. *) + + match strategy with + | `Legacy -> + reduce env prod + | `Simplified -> + announce_reduce env prod + + and error_fail ~strategy env = - (* This state is unable to handle errors. Attempt to pop a stack - cell. *) + (* This state is unable to handle errors. In the simplified strategy, we + die immediately. In the legacy strategy, we attempt to pop a stack + cell. (This amounts to forgetting part of what we have just read, in + the hope of reaching a state where we can shift the [error] token and + resume parsing in normal mode. Forgetting past input is not appropriate + when the goal is merely to produce a good syntax error message.) *) + + match strategy with + | `Simplified -> + Rejected + | `Legacy -> + + (* Attempt to pop a stack cell. *) let cell = env.stack in let next = cell.next in @@ -1526,9 +1643,11 @@ module Make (T : TABLE) = struct | _ -> invalid_arg "offer expects InputNeeded" - let resume : 'a . 'a checkpoint -> 'a checkpoint = function + let resume : 'a . ?strategy:strategy -> 'a checkpoint -> 'a checkpoint = + fun ?(strategy=`Legacy) checkpoint -> + match checkpoint with | HandlingError env -> - Obj.magic error env + Obj.magic error ~strategy env | Shifting (_, env, please_discard) -> Obj.magic run env please_discard | AboutToReduce (env, prod) -> @@ -1572,8 +1691,8 @@ module Make (T : TABLE) = struct All of the cheating resides in the types assigned to [offer] and [handle] above. *) - let rec loop : 'a . supplier -> 'a checkpoint -> 'a = - fun read checkpoint -> + let rec loop : 'a . ?strategy:strategy -> supplier -> 'a checkpoint -> 'a = + fun ?(strategy=`Legacy) read checkpoint -> match checkpoint with | InputNeeded _ -> (* The parser needs a token. Request one from the lexer, @@ -1581,14 +1700,14 @@ module Make (T : TABLE) = struct checkpoint. Then, repeat. *) let triple = read() in let checkpoint = offer checkpoint triple in - loop read checkpoint + loop ~strategy read checkpoint | Shifting _ | AboutToReduce _ | HandlingError _ -> (* The parser has suspended itself, but does not need new input. Just resume the parser. Then, repeat. *) - let checkpoint = resume checkpoint in - loop read checkpoint + let checkpoint = resume ~strategy checkpoint in + loop ~strategy read checkpoint | Accepted v -> (* The parser has succeeded and produced a semantic value. Return this semantic value to the user. *) @@ -1597,9 +1716,9 @@ module Make (T : TABLE) = struct (* The parser rejects this input. Raise an exception. *) raise Error - let entry (s : state) lexer lexbuf : semantic_value = + let entry strategy (s : state) lexer lexbuf : semantic_value = let initial = lexbuf.Lexing.lex_curr_p in - loop (lexer_lexbuf_to_supplier lexer lexbuf) (start s initial) + loop ~strategy (lexer_lexbuf_to_supplier lexer lexbuf) (start s initial) (* ------------------------------------------------------------------------ *) @@ -1615,6 +1734,8 @@ module Make (T : TABLE) = struct loop_handle succeed fail read checkpoint | Shifting _ | AboutToReduce _ -> + (* Which strategy is passed to [resume] here is irrelevant, + since this checkpoint is not [HandlingError _]. *) let checkpoint = resume checkpoint in loop_handle succeed fail read checkpoint | HandlingError _ @@ -1648,6 +1769,8 @@ module Make (T : TABLE) = struct loop_handle_undo succeed fail read (inputneeded, checkpoint) | Shifting _ | AboutToReduce _ -> + (* Which strategy is passed to [resume] here is irrelevant, + since this checkpoint is not [HandlingError _]. *) let checkpoint = resume checkpoint in loop_handle_undo succeed fail read (inputneeded, checkpoint) | HandlingError _ @@ -1681,6 +1804,8 @@ module Make (T : TABLE) = struct Some env | AboutToReduce _ -> (* The parser wishes to reduce. Just follow. *) + (* Which strategy is passed to [resume] here is irrelevant, + since this checkpoint is not [HandlingError _]. *) shifts (resume checkpoint) | HandlingError _ -> (* The parser fails, which means it rejects the terminal symbol @@ -1965,9 +2090,6 @@ let update buffer x = | Two (_, x1), x2 -> Two (x1, x2) -(* [show f buffer] prints the contents of the buffer. The function [f] is - used to print an element. *) - let show f buffer : string = match !buffer with | Zero -> @@ -1981,9 +2103,6 @@ let show f buffer : string = (* In the most likely case, we have read two tokens. *) Printf.sprintf "after '%s' and before '%s'" (f valid) (f invalid) -(* [last buffer] returns the last element of the buffer (that is, the invalid - token). *) - let last buffer = match !buffer with | Zero -> @@ -1994,8 +2113,6 @@ let last buffer = | Two (_, invalid) -> invalid -(* [wrap buffer lexer] *) - open Lexing let wrap lexer = @@ -2006,7 +2123,156 @@ let wrap lexer = update buffer (lexbuf.lex_start_p, lexbuf.lex_curr_p); token +let wrap_supplier supplier = + let buffer = ref Zero in + buffer, + fun () -> + let (_token, pos1, pos2) as triple = supplier() in + update buffer (pos1, pos2); + triple + (* -------------------------------------------------------------------------- *) + +let extract text (pos1, pos2) : string = + let ofs1 = pos1.pos_cnum + and ofs2 = pos2.pos_cnum in + let len = ofs2 - ofs1 in + try + String.sub text ofs1 len + with Invalid_argument _ -> + (* In principle, this should not happen, but if it does, let's make this + a non-fatal error. *) + "???" + +let sanitize text = + String.map (fun c -> + if Char.code c < 32 then ' ' else c + ) text + +(* If we were willing to depend on [Str], we could implement [compress] as + follows: + + let compress text = + Str.global_replace (Str.regexp "[ \t\n\r]+") " " text + + *) + +let rec compress n b i j skipping = + if j < n then + let c, j = Bytes.get b j, j + 1 in + match c with + | ' ' | '\t' | '\n' | '\r' -> + let i = if not skipping then (Bytes.set b i ' '; i + 1) else i in + let skipping = true in + compress n b i j skipping + | _ -> + let i = Bytes.set b i c; i + 1 in + let skipping = false in + compress n b i j skipping + else + Bytes.sub_string b 0 i + +let compress text = + let b = Bytes.of_string text in + let n = Bytes.length b in + compress n b 0 0 false + +let shorten k text = + let n = String.length text in + if n <= 2 * k + 3 then + text + else + String.sub text 0 k ^ + "..." ^ + String.sub text (n - k) k + +let is_digit c = + let c = Char.code c in + Char.code '0' <= c && c <= Char.code '9' + +exception Copy + +let expand f text = + let n = String.length text in + let b = Buffer.create n in + let rec loop i = + if i < n then begin + let c, i = text.[i], i + 1 in + loop ( + try + if c <> '$' then raise Copy; + let j = ref i in + while !j < n && is_digit text.[!j] do incr j done; + if i = !j then raise Copy; + let k = int_of_string (String.sub text i (!j - i)) in + Buffer.add_string b (f k); + !j + with Copy -> + (* We reach this point if either [c] is not '$' or [c] is '$' + but is not followed by an integer literal. *) + Buffer.add_char b c; + i + ) + end + else + Buffer.contents b + in + loop 0 +end +module LexerUtil = struct +(******************************************************************************) +(* *) +(* Menhir *) +(* *) +(* François Pottier, Inria Paris *) +(* Yann Régis-Gianas, PPS, Université Paris Diderot *) +(* *) +(* Copyright Inria. All rights reserved. This file is distributed under the *) +(* terms of the GNU Library General Public License version 2, with a *) +(* special exception on linking, as described in the file LICENSE. *) +(* *) +(******************************************************************************) + +open Lexing +open Printf + +let init filename lexbuf = + lexbuf.lex_curr_p <- { + pos_fname = filename; + pos_lnum = 1; + pos_bol = 0; + pos_cnum = 0 + }; + lexbuf + +let read filename = + let c = open_in filename in + let text = really_input_string c (in_channel_length c) in + close_in c; + let lexbuf = Lexing.from_string text in + text, init filename lexbuf + +let newline lexbuf = + let pos = lexbuf.lex_curr_p in + lexbuf.lex_curr_p <- { pos with + pos_lnum = pos.pos_lnum + 1; + pos_bol = pos.pos_cnum; + } + +let is_dummy (pos1, pos2) = + pos1 == dummy_pos || pos2 == dummy_pos + +let range ((pos1, pos2) as range) = + if is_dummy range then + sprintf "At an unknown location:\n" + else + let file = pos1.pos_fname in + let line = pos1.pos_lnum in + let char1 = pos1.pos_cnum - pos1.pos_bol in + let char2 = pos2.pos_cnum - pos1.pos_bol in (* yes, [pos1.pos_bol] *) + sprintf "File \"%s\", line %d, characters %d-%d:\n" + file line char1 char2 + (* use [char1 + 1] and [char2 + 1] if *not* using Caml mode *) end module Printers = struct (******************************************************************************) @@ -3133,8 +3399,14 @@ module Make type item = int * int + let low_bits = + 10 + + let low_limit = + 1 lsl low_bits + let export t : item = - (t lsr 7, t mod 128) + (t lsr low_bits, t mod low_limit) let items s = (* Map [s] to its LR(0) core. *) @@ -3513,5 +3785,5 @@ module MakeEngineTable (T : TableFormat.TABLES) = struct end end module StaticVersion = struct -let require_20190924 = () +let require_20201216 = () end diff --git a/boot/menhir/menhirLib.mli b/boot/menhir/menhirLib.mli index fa523f59..98db99e6 100644 --- a/boot/menhir/menhirLib.mli +++ b/boot/menhir/menhirLib.mli @@ -222,9 +222,9 @@ module type INCREMENTAL_ENGINE = sig | Rejected (* [offer] allows the user to resume the parser after it has suspended - itself with a checkpoint of the form [InputNeeded env]. [offer] expects the - old checkpoint as well as a new token and produces a new checkpoint. It does not - raise any exception. *) + itself with a checkpoint of the form [InputNeeded env]. [offer] expects + the old checkpoint as well as a new token and produces a new checkpoint. + It does not raise any exception. *) val offer: 'a checkpoint -> @@ -233,10 +233,30 @@ module type INCREMENTAL_ENGINE = sig (* [resume] allows the user to resume the parser after it has suspended itself with a checkpoint of the form [AboutToReduce (env, prod)] or - [HandlingError env]. [resume] expects the old checkpoint and produces a new - checkpoint. It does not raise any exception. *) + [HandlingError env]. [resume] expects the old checkpoint and produces a + new checkpoint. It does not raise any exception. *) + + (* The optional argument [strategy] influences the manner in which [resume] + deals with checkpoints of the form [ErrorHandling _]. Its default value + is [`Legacy]. It can be briefly described as follows: + + - If the [error] token is used only to report errors (that is, if the + [error] token appears only at the end of a production, whose semantic + action raises an exception) then the simplified strategy should be + preferred. (This includes the case where the [error] token does not + appear at all in the grammar.) + + - If the [error] token is used to recover after an error, or if + perfect backward compatibility is required, the legacy strategy + should be selected. + + More details on these strategies appear in the file [Engine.ml]. *) + + type strategy = + [ `Legacy | `Simplified ] val resume: + ?strategy:strategy -> 'a checkpoint -> 'a checkpoint @@ -246,7 +266,8 @@ module type INCREMENTAL_ENGINE = sig type supplier = unit -> token * position * position - (* A pair of a lexer and a lexing buffer can be easily turned into a supplier. *) + (* A pair of a lexer and a lexing buffer can be easily turned into a + supplier. *) val lexer_lexbuf_to_supplier: (Lexing.lexbuf -> token) -> @@ -261,9 +282,11 @@ module type INCREMENTAL_ENGINE = sig (* [loop supplier checkpoint] begins parsing from [checkpoint], reading tokens from [supplier]. It continues parsing until it reaches a checkpoint of the form [Accepted v] or [Rejected]. In the former case, it - returns [v]. In the latter case, it raises the exception [Error]. *) + returns [v]. In the latter case, it raises the exception [Error]. + The optional argument [strategy], whose default value is [Legacy], + is passed to [resume] and influences the error-handling strategy. *) - val loop: supplier -> 'a checkpoint -> 'a + val loop: ?strategy:strategy -> supplier -> 'a checkpoint -> 'a (* [loop_handle succeed fail supplier checkpoint] begins parsing from [checkpoint], reading tokens from [supplier]. It continues parsing until @@ -272,10 +295,10 @@ module type INCREMENTAL_ENGINE = sig observed first). In the former case, it calls [succeed v]. In the latter case, it calls [fail] with this checkpoint. It cannot raise [Error]. - This means that Menhir's traditional error-handling procedure (which pops - the stack until a state that can act on the [error] token is found) does - not get a chance to run. Instead, the user can implement her own error - handling code, in the [fail] continuation. *) + This means that Menhir's error-handling procedure does not get a chance + to run. For this reason, there is no [strategy] parameter. Instead, the + user can implement her own error handling code, in the [fail] + continuation. *) val loop_handle: ('a -> 'answer) -> @@ -943,6 +966,7 @@ module type MONOLITHIC_ENGINE = sig exception Error val entry: + (* strategy: *) [ `Legacy | `Simplified ] -> (* see [IncrementalEngine] *) state -> (Lexing.lexbuf -> token) -> Lexing.lexbuf -> @@ -1066,12 +1090,20 @@ type 'a buffer which internally relies on [lexer] and updates [buffer] on the fly whenever a token is demanded. *) +(* The type of the buffer is [(position * position) buffer], which means that + it stores two pairs of positions, which are the start and end positions of + the last two tokens. *) + open Lexing val wrap: (lexbuf -> 'token) -> (position * position) buffer * (lexbuf -> 'token) +val wrap_supplier: + (unit -> 'token * position * position) -> + (position * position) buffer * (unit -> 'token * position * position) + (* [show f buffer] prints the contents of the buffer, producing a string that is typically of the form "after '%s' and before '%s'". The function [f] is used to print an element. The buffer MUST be nonempty. *) @@ -1084,6 +1116,76 @@ val show: ('a -> string) -> 'a buffer -> string val last: 'a buffer -> 'a (* -------------------------------------------------------------------------- *) + +(* [extract text (pos1, pos2)] extracts the sub-string of [text] delimited + by the positions [pos1] and [pos2]. *) + +val extract: string -> position * position -> string + +(* [sanitize text] eliminates any special characters from the text [text]. + A special character is a character whose ASCII code is less than 32. + Every special character is replaced with a single space character. *) + +val sanitize: string -> string + +(* [compress text] replaces every run of at least one whitespace character + with exactly one space character. *) + +val compress: string -> string + +(* [shorten k text] limits the length of [text] to [2k+3] characters. If the + text is too long, a fragment in the middle is replaced with an ellipsis. *) + +val shorten: int -> string -> string + +(* [expand f text] searches [text] for occurrences of [$k], where [k] + is a nonnegative integer literal, and replaces each such occurrence + with the string [f k]. *) + +val expand: (int -> string) -> string -> string +end +module LexerUtil : sig +(******************************************************************************) +(* *) +(* Menhir *) +(* *) +(* François Pottier, Inria Paris *) +(* Yann Régis-Gianas, PPS, Université Paris Diderot *) +(* *) +(* Copyright Inria. All rights reserved. This file is distributed under the *) +(* terms of the GNU Library General Public License version 2, with a *) +(* special exception on linking, as described in the file LICENSE. *) +(* *) +(******************************************************************************) + +open Lexing + +(* [init filename lexbuf] initializes the lexing buffer [lexbuf] so + that the positions that are subsequently read from it refer to the + file [filename]. It returns [lexbuf]. *) + +val init: string -> lexbuf -> lexbuf + +(* [read filename] reads the entire contents of the file [filename] and + returns a pair of this content (a string) and a lexing buffer that + has been initialized, based on this string. *) + +val read: string -> string * lexbuf + +(* [newline lexbuf] increments the line counter stored within [lexbuf]. It + should be invoked by the lexer itself every time a newline character is + consumed. This allows maintaining a current the line number in [lexbuf]. *) + +val newline: lexbuf -> unit + +(* [range (startpos, endpos)] prints a textual description of the range + delimited by the start and end positions [startpos] and [endpos]. + This description is one line long and ends in a newline character. + This description mentions the file name, the line number, and a range + of characters on this line. The line number is correct only if [newline] + has been correctly used, as described dabove. *) + +val range: position * position -> string end module Printers : sig (******************************************************************************) @@ -1701,5 +1803,5 @@ module MakeEngineTable and type nonterminal = int end module StaticVersion : sig -val require_20190924 : unit +val require_20201216: unit end diff --git a/boot/menhir/parser.ml b/boot/menhir/parser.ml index 6b6fc220..9cb0883b 100644 --- a/boot/menhir/parser.ml +++ b/boot/menhir/parser.ml @@ -2,7 +2,7 @@ (* This generated code requires the following version of MenhirLib: *) let () = - MenhirLib.StaticVersion.require_20190924 + MenhirLib.StaticVersion.require_20201216 module MenhirBasics = struct @@ -16,7 +16,7 @@ module MenhirBasics = struct | VAL | UNDERSCORE | UIDENT of ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) # 22 "parsing/parser.ml" ) @@ -28,7 +28,7 @@ module MenhirBasics = struct | THEN | STRUCT | STRING of ( -# 689 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * Location.t * string option) # 34 "parsing/parser.ml" ) @@ -41,20 +41,20 @@ module MenhirBasics = struct | RBRACKET | RBRACE | QUOTED_STRING_ITEM of ( -# 693 "parsing/parser.mly" - (string * Location.t * string * Location.t * string option) +# 747 "parsing/parser.mly" + (string * Location.t * string * Location.t * string option) # 47 "parsing/parser.ml" ) | QUOTED_STRING_EXPR of ( -# 691 "parsing/parser.mly" - (string * Location.t * string * Location.t * string option) +# 745 "parsing/parser.mly" + (string * Location.t * string * Location.t * string option) # 52 "parsing/parser.ml" ) | QUOTE | QUESTION | PRIVATE | PREFIXOP of ( -# 675 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) # 60 "parsing/parser.ml" ) @@ -64,7 +64,7 @@ module MenhirBasics = struct | PERCENT | OR | OPTLABEL of ( -# 668 "parsing/parser.mly" +# 722 "parsing/parser.mly" (string) # 70 "parsing/parser.ml" ) @@ -82,12 +82,12 @@ module MenhirBasics = struct | MATCH | LPAREN | LIDENT of ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) # 88 "parsing/parser.ml" ) | LETOP of ( -# 633 "parsing/parser.mly" +# 687 "parsing/parser.mly" (string) # 93 "parsing/parser.ml" ) @@ -107,39 +107,39 @@ module MenhirBasics = struct | LBRACE | LAZY | LABEL of ( -# 638 "parsing/parser.mly" +# 692 "parsing/parser.mly" (string) # 113 "parsing/parser.ml" ) | INT of ( -# 637 "parsing/parser.mly" +# 691 "parsing/parser.mly" (string * char option) # 118 "parsing/parser.ml" ) | INITIALIZER | INHERIT | INFIXOP4 of ( -# 631 "parsing/parser.mly" +# 685 "parsing/parser.mly" (string) # 125 "parsing/parser.ml" ) | INFIXOP3 of ( -# 630 "parsing/parser.mly" +# 684 "parsing/parser.mly" (string) # 130 "parsing/parser.ml" ) | INFIXOP2 of ( -# 629 "parsing/parser.mly" +# 683 "parsing/parser.mly" (string) # 135 "parsing/parser.ml" ) | INFIXOP1 of ( -# 628 "parsing/parser.mly" +# 682 "parsing/parser.mly" (string) # 140 "parsing/parser.ml" ) | INFIXOP0 of ( -# 627 "parsing/parser.mly" +# 681 "parsing/parser.mly" (string) # 145 "parsing/parser.ml" ) @@ -147,7 +147,7 @@ module MenhirBasics = struct | IN | IF | HASHOP of ( -# 686 "parsing/parser.mly" +# 740 "parsing/parser.mly" (string) # 153 "parsing/parser.ml" ) @@ -160,7 +160,7 @@ module MenhirBasics = struct | FUN | FOR | FLOAT of ( -# 616 "parsing/parser.mly" +# 670 "parsing/parser.mly" (string * char option) # 166 "parsing/parser.ml" ) @@ -174,7 +174,7 @@ module MenhirBasics = struct | ELSE | DOWNTO | DOTOP of ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) # 180 "parsing/parser.ml" ) @@ -182,14 +182,14 @@ module MenhirBasics = struct | DOT | DONE | DOCSTRING of ( -# 709 "parsing/parser.mly" +# 764 "parsing/parser.mly" (Docstrings.docstring) # 188 "parsing/parser.ml" ) | DO | CONSTRAINT | COMMENT of ( -# 708 "parsing/parser.mly" +# 763 "parsing/parser.mly" (string * Location.t) # 195 "parsing/parser.ml" ) @@ -200,7 +200,7 @@ module MenhirBasics = struct | COLON | CLASS | CHAR of ( -# 596 "parsing/parser.mly" +# 650 "parsing/parser.mly" (char) # 206 "parsing/parser.ml" ) @@ -213,7 +213,7 @@ module MenhirBasics = struct | ASSERT | AS | ANDOP of ( -# 634 "parsing/parser.mly" +# 688 "parsing/parser.mly" (string) # 219 "parsing/parser.ml" ) @@ -228,7 +228,7 @@ include MenhirBasics let _eRR = MenhirBasics.Error -# 18 "parsing/parser.mly" +# 25 "parsing/parser.mly" open Asttypes @@ -381,14 +381,14 @@ let mkexp_cons ~loc consloc args = mkexp ~loc (mkexp_cons_desc consloc args) let mkpat_cons_desc consloc args = - Ppat_construct(mkrhs (Lident "::") consloc, Some args) + Ppat_construct(mkrhs (Lident "::") consloc, Some ([], args)) let mkpat_cons ~loc consloc args = mkpat ~loc (mkpat_cons_desc consloc args) let ghexp_cons_desc consloc args = Pexp_construct(ghrhs (Lident "::") consloc, Some args) let ghpat_cons_desc consloc args = - Ppat_construct(ghrhs (Lident "::") consloc, Some args) + Ppat_construct(ghrhs (Lident "::") consloc, Some ([], args)) let rec mktailexp nilloc = let open Location in function [] -> @@ -437,110 +437,146 @@ let unclosed opening_name opening_loc closing_name closing_loc = let expecting loc nonterm = raise Syntaxerr.(Error(Expecting(make_loc loc, nonterm))) +(* Using the function [not_expecting] in a semantic action means that this + syntactic form is recognized by the parser but is in fact incorrect. This + idiom is used in a few places to produce ad hoc syntax error messages. *) + +(* This idiom should be used as little as possible, because it confuses the + analyses performed by Menhir. Because Menhir views the semantic action as + opaque, it believes that this syntactic form is correct. This can lead + [make generate-parse-errors] to produce sentences that cause an early + (unexpected) syntax error and do not achieve the desired effect. This could + also lead a completion system to propose completions which in fact are + incorrect. In order to avoid these problems, the productions that use + [not_expecting] should be marked with AVOID. *) + let not_expecting loc nonterm = raise Syntaxerr.(Error(Not_expecting(make_loc loc, nonterm))) -let dotop ~left ~right ~assign ~ext ~multi = - let assign = if assign then "<-" else "" in - let mid = if multi then ";.." else "" in - String.concat "" ["."; ext; left; mid; right; assign] -let paren = "(",")" -let brace = "{", "}" -let bracket = "[", "]" -let lident x = Lident x -let ldot x y = Ldot(x,y) -let dotop_fun ~loc dotop = - ghexp ~loc (Pexp_ident (ghloc ~loc dotop)) +(* Helper functions for desugaring array indexing operators *) +type paren_kind = Paren | Brace | Bracket -let array_function ~loc str name = - ghloc ~loc (Ldot(Lident str, - (if !Clflags.unsafe then "unsafe_" ^ name else name))) +(* We classify the dimension of indices: Bigarray distinguishes + indices of dimension 1,2,3, or more. Similarly, user-defined + indexing operator behave differently for indices of dimension 1 + or more. +*) +type index_dim = + | One + | Two + | Three + | Many +type ('dot,'index) array_family = { -let array_get_fun ~loc = - ghexp ~loc (Pexp_ident(array_function ~loc "Array" "get")) -let string_get_fun ~loc = - ghexp ~loc (Pexp_ident(array_function ~loc "String" "get")) + name: + Lexing.position * Lexing.position -> 'dot -> assign:bool -> paren_kind + -> index_dim -> Longident.t Location.loc + (* + This functions computes the name of the explicit indexing operator + associated with a sugared array indexing expression. -let array_set_fun ~loc = - ghexp ~loc (Pexp_ident(array_function ~loc "Array" "set")) -let string_set_fun ~loc = - ghexp ~loc (Pexp_ident(array_function ~loc "String" "set")) + For instance, for builtin arrays, if Clflags.unsafe is set, + * [ a.[index] ] => [String.unsafe_get] + * [ a.{x,y} <- 1 ] => [ Bigarray.Array2.unsafe_set] -let multi_indices ~loc = function - | [a] -> false, a - | l -> true, mkexp ~loc (Pexp_array l) + User-defined indexing operator follows a more local convention: + * [ a .%(index)] => [ (.%()) ] + * [ a.![1;2] <- 0 ] => [(.![;..]<-)] + * [ a.My.Map.?(0) => [My.Map.(.?())] + *); -let index_get ~loc get_fun array index = - let args = [Nolabel, array; Nolabel, index] in - mkexp ~loc (Pexp_apply(get_fun, args)) + index: + Lexing.position * Lexing.position -> paren_kind -> 'index + -> index_dim * (arg_label * expression) list + (* + [index (start,stop) paren index] computes the dimension of the + index argument and how it should be desugared when transformed + to a list of arguments for the indexing operator. + In particular, in both the Bigarray case and the user-defined case, + beyond a certain dimension, multiple indices are packed into a single + array argument: + * [ a.(x) ] => [ [One, [Nolabel, <>] ] + * [ a.{1,2} ] => [ [Two, [Nolabel, <<1>>; Nolabel, <<2>>] ] + * [ a.{1,2,3,4} ] => [ [Many, [Nolabel, <<[|1;2;3;4|]>>] ] ] + *); -let index_set ~loc set_fun array index value = - let args = [Nolabel, array; Nolabel, index; Nolabel, value] in - mkexp ~loc (Pexp_apply(set_fun, args)) +} -let array_get ~loc = index_get ~loc (array_get_fun ~loc) -let string_get ~loc = index_get ~loc (string_get_fun ~loc) -let dotop_get ~loc path (left,right) ext array index = - let multi, index = multi_indices ~loc index in - index_get ~loc - (dotop_fun ~loc (path @@ dotop ~left ~right ~ext ~multi ~assign:false)) - array index +let bigarray_untuplify = function + { pexp_desc = Pexp_tuple explist; pexp_loc = _ } -> explist + | exp -> [exp] -let array_set ~loc = index_set ~loc (array_set_fun ~loc) -let string_set ~loc = index_set ~loc (string_set_fun ~loc) -let dotop_set ~loc path (left,right) ext array index value= - let multi, index = multi_indices ~loc index in - index_set ~loc - (dotop_fun ~loc (path @@ dotop ~left ~right ~ext ~multi ~assign:true)) - array index value +let builtin_arraylike_name loc _ ~assign paren_kind n = + let opname = if assign then "set" else "get" in + let opname = if !Clflags.unsafe then "unsafe_" ^ opname else opname in + let prefix = match paren_kind with + | Paren -> Lident "Array" + | Bracket -> Lident "String" + | Brace -> + let submodule_name = match n with + | One -> "Array1" + | Two -> "Array2" + | Three -> "Array3" + | Many -> "Genarray" in + Ldot(Lident "Bigarray", submodule_name) in + ghloc ~loc (Ldot(prefix,opname)) +let builtin_arraylike_index loc paren_kind index = match paren_kind with + | Paren | Bracket -> One, [Nolabel, index] + | Brace -> + (* Multi-indices for bigarray are comma-separated ([a.{1,2,3,4}]) *) + match bigarray_untuplify index with + | [x] -> One, [Nolabel, x] + | [x;y] -> Two, [Nolabel, x; Nolabel, y] + | [x;y;z] -> Three, [Nolabel, x; Nolabel, y; Nolabel, z] + | coords -> Many, [Nolabel, ghexp ~loc (Pexp_array coords)] -let bigarray_function ~loc str name = - ghloc ~loc (Ldot(Ldot(Lident "Bigarray", str), name)) +let builtin_indexing_operators : (unit, expression) array_family = + { index = builtin_arraylike_index; name = builtin_arraylike_name } -let bigarray_untuplify = function - { pexp_desc = Pexp_tuple explist; pexp_loc = _ } -> explist - | exp -> [exp] +let paren_to_strings = function + | Paren -> "(", ")" + | Bracket -> "[", "]" + | Brace -> "{", "}" + +let user_indexing_operator_name loc (prefix,ext) ~assign paren_kind n = + let name = + let assign = if assign then "<-" else "" in + let mid = match n with + | Many | Three | Two -> ";.." + | One -> "" in + let left, right = paren_to_strings paren_kind in + String.concat "" ["."; ext; left; mid; right; assign] in + let lid = match prefix with + | None -> Lident name + | Some p -> Ldot(p,name) in + ghloc ~loc lid + +let user_index loc _ index = + (* Multi-indices for user-defined operators are semicolon-separated + ([a.%[1;2;3;4]]) *) + match index with + | [a] -> One, [Nolabel, a] + | l -> Many, [Nolabel, mkexp ~loc (Pexp_array l)] + +let user_indexing_operators: + (Longident.t option * string, expression list) array_family + = { index = user_index; name = user_indexing_operator_name } -let bigarray_get ~loc arr arg = - let mkexp, ghexp = mkexp ~loc, ghexp ~loc in - let bigarray_function = bigarray_function ~loc in - let get = if !Clflags.unsafe then "unsafe_get" else "get" in - match bigarray_untuplify arg with - [c1] -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" get)), - [Nolabel, arr; Nolabel, c1])) - | [c1;c2] -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" get)), - [Nolabel, arr; Nolabel, c1; Nolabel, c2])) - | [c1;c2;c3] -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" get)), - [Nolabel, arr; Nolabel, c1; Nolabel, c2; Nolabel, c3])) - | coords -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "get")), - [Nolabel, arr; Nolabel, ghexp(Pexp_array coords)])) +let mk_indexop_expr array_indexing_operator ~loc + (array,dot,paren,index,set_expr) = + let assign = match set_expr with None -> false | Some _ -> true in + let n, index = array_indexing_operator.index loc paren index in + let fn = array_indexing_operator.name loc dot ~assign paren n in + let set_arg = match set_expr with + | None -> [] + | Some expr -> [Nolabel, expr] in + let args = (Nolabel,array) :: index @ set_arg in + mkexp ~loc (Pexp_apply(ghexp ~loc (Pexp_ident fn), args)) -let bigarray_set ~loc arr arg newval = - let mkexp, ghexp = mkexp ~loc, ghexp ~loc in - let bigarray_function = bigarray_function ~loc in - let set = if !Clflags.unsafe then "unsafe_set" else "set" in - match bigarray_untuplify arg with - [c1] -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array1" set)), - [Nolabel, arr; Nolabel, c1; Nolabel, newval])) - | [c1;c2] -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array2" set)), - [Nolabel, arr; Nolabel, c1; - Nolabel, c2; Nolabel, newval])) - | [c1;c2;c3] -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Array3" set)), - [Nolabel, arr; Nolabel, c1; - Nolabel, c2; Nolabel, c3; Nolabel, newval])) - | coords -> - mkexp(Pexp_apply(ghexp(Pexp_ident(bigarray_function "Genarray" "set")), - [Nolabel, arr; - Nolabel, ghexp(Pexp_array coords); - Nolabel, newval])) +let indexop_unclosed_error loc_s s loc_e = + let left, right = paren_to_strings s in + unclosed left loc_s right loc_e let lapply ~loc p1 p2 = if !Clflags.applicative_functors @@ -672,6 +708,7 @@ let extra_rhs_core_type ct ~pos = type let_binding = { lb_pattern: pattern; lb_expression: expression; + lb_is_pun: bool; lb_attributes: attributes; lb_docs: docs Lazy.t; lb_text: text Lazy.t; @@ -680,13 +717,13 @@ type let_binding = type let_bindings = { lbs_bindings: let_binding list; lbs_rec: rec_flag; - lbs_extension: string Asttypes.loc option; - lbs_loc: Location.t } + lbs_extension: string Asttypes.loc option } -let mklb first ~loc (p, e) attrs = +let mklb first ~loc (p, e, is_pun) attrs = { lb_pattern = p; lb_expression = e; + lb_is_pun = is_pun; lb_attributes = attrs; lb_docs = symbol_docs_lazy loc; lb_text = (if first then empty_text_lazy @@ -694,17 +731,18 @@ let mklb first ~loc (p, e) attrs = lb_loc = make_loc loc; } -let mklbs ~loc ext rf lb = - { - lbs_bindings = [lb]; - lbs_rec = rf; - lbs_extension = ext ; - lbs_loc = make_loc loc; - } - let addlb lbs lb = + if lb.lb_is_pun && lbs.lbs_extension = None then syntax_error (); { lbs with lbs_bindings = lb :: lbs.lbs_bindings } +let mklbs ext rf lb = + let lbs = { + lbs_bindings = []; + lbs_rec = rf; + lbs_extension = ext; + } in + addlb lbs lb + let val_of_let_bindings ~loc lbs = let bindings = List.map @@ -793,7 +831,7 @@ let mk_directive ~loc name arg = } -# 797 "parsing/parser.ml" +# 835 "parsing/parser.ml" module Tables = struct @@ -1303,22 +1341,22 @@ module Tables = struct Obj.repr () and default_reduction = - (16, "\000\000\000\000\000\000\002\247\002\246\002\245\002\244\002\243\002\198\002\242\002\241\002\240\002\239\002\238\002\237\002\236\002\235\002\234\002\233\002\232\002\231\002\230\002\229\002\228\002\227\002\226\002\225\002\224\002\197\002\223\002\222\002\221\002\220\002\219\002\218\002\217\002\216\002\215\002\214\002\213\002\212\002\211\002\210\002\209\002\208\002\207\002\206\002\205\002\204\002\203\002\202\002\201\002\200\002\199\000\000\000\000\000*\000\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003<\001\168\001\147\001\165\001\164\001\163\001\169\001\173\000\000\003=\001\167\001\166\001\148\001\171\001\162\001\161\001\160\001\159\001\158\001\156\001\172\001\170\000\000\000\000\000\000\000\220\000\000\000\000\001\151\000\000\000\000\000\000\001\153\000\000\000\000\000\000\001\155\001\177\001\174\001\157\001\149\001\175\001\176\000\000\003;\003:\003>\000\000\000\000\000\024\001B\000\188\000\000\000\216\000\217\000\023\000\000\000\000\001\199\001\198\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0037\000\000\0032\000\000\000\000\0034\000\000\0036\000\000\0033\0035\000\000\003-\000\000\003,\003(\0022\000\000\003+\000\000\0023\000\000\000\000\000\000\000\000\000j\000\000\000\000\000h\000\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\184\001N\000\000\000\000\000\000\000\000\000\000\000\000\002\029\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000\000\000\000\000\000\001L\000\000\000\000\001O\001M\001U\000A\002\134\000\000\001\018\000\000\000\000\000\000\000\015\000\014\000\000\000\000\000\000\000\000\002\179\000\000\002e\002f\000\000\002c\002d\000\000\000\000\000\000\000\000\000\000\001e\001d\000\000\002\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\223\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\016\003\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000g\000\000\000\231\000\000\002h\002g\000\000\000\000\000\000\001\181\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\001T\000\000\001S\000\000\001C\001R\000\000\001A\000b\000\030\000\000\000\000\001|\000\025\000\000\000\000\000\000\000\000\003'\000(\000\000\000\000\000\031\000\026\000\000\000\000\000\000\000\201\000\000\000\000\000\000\000\203\002<\002.\000\000\000\"\000\000\002/\000\000\000\000\001\178\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\017\003\017\000\000\003\018\000\000\000y\000\000\000\000\000!\000\000\000\000\000\000\000#\000\000\000$\000\000\000&\000\000\000\000\000'\002$\002#\000\000\000\000\000\000\000\000\000\000\000\000\000c\000\000\002\184\000f\000i\000d\002\173\003?\002\174\001\239\002\176\000\000\000\000\002\181\002b\002\183\000\000\000\000\000\000\002\190\002\187\000\000\000\000\000\000\001\236\001\222\000\000\000\000\000\000\000\000\001\226\000\000\001\221\000\000\001\238\002\196\000\000\001\237\000q\001\229\000\000\000o\000\000\002\189\002\188\000\000\001\232\000\000\000\000\001\228\000\000\000\000\001\224\001\223\000\000\002\186\000\000\002j\002i\000\000\000\000\002F\002\185\002\182\000\000\000\000\000\000\000\000\001\183\001-\001.\002l\000\000\002m\002k\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001o\000\000\000\000\000\000\000\000\000\000\000\000\003T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002,\000\000\000\000\002-\000\000\000\000\001n\000\000\000\000\000\000\001K\001t\001J\001r\002 \002\031\000\000\001m\001l\000\000\000\205\000\000\000\000\001^\000\000\000\000\001b\000\000\001\203\001\202\000\000\000\000\001\201\001\200\001a\001_\000\000\001c\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\138\001P\002\143\002\141\000\000\000\000\000\000\002\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\172\000\000\002\171\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\250\000\000\000\000\000\000\000\000\000\000\000\000\000\239\001\249\000\240\000\000\000\000\000\000\001~\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\234\000\000\000\235\000\000\000\000\000\000\002\151\000\000\000\000\000\000\002r\002q\000\000\000\000\000\000\000\000\003@\002\153\002\140\002\139\000\000\000\000\000\169\000\000\000\000\000\000\000\000\000\000\000\183\000\000\000\000\000\000\000\168\000\000\000\000\000\000\002M\002L\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\243\000\000\002\250\000\000\003$\000\000\000\000\003#\000\000\000\000\000\000\000\000\000\000\000\195\000\194\000\244\000\000\002\251\002\252\000\000\000\000\000p\000\000\002\191\002\175\000\000\002\194\000\000\002\193\002\192\000\000\000\000\000\000\000\000\000\000\000\000\000\248\000\000\000\000\002&\000\000\000\000\000\000\000\247\000\000\000\000\000\246\000\245\000\000\000\000\000\000\000\000\000\250\000\000\000\000\000\249\000\000\001\235\000\000\000\000\001\246\000\000\000\000\001\248\000\000\000\000\001\244\001\243\001\241\001\242\000\000\000\000\000\000\000\000\000\000\001\024\000\018\000\252\000\000\000\000\000\000\002t\002s\000\000\000\000\002\130\002\129\000\000\000\000\000\000\000\000\002~\002}\000\000\000\000\002@\000\000\000\000\002|\002{\000\000\000\000\002\128\002\127\002\147\000\000\000\000\000\000\000\000\000\000\002x\000\000\000\000\000\000\000\000\000\000\002v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\"\002!\000\167\000\000\002w\000\000\000\000\002u\000\000\000\000\002y\000\000\000z\000{\000\000\000\000\000\000\000\000\000\138\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\000\000\000\198\000\199\000\131\000\000\000\130\000\000\000\000\0010\000\000\0011\001/\002(\000\000\000\000\002)\002'\000\000\000\000\000\000\000\000\000\000\001\003\000\000\000\000\001\004\000\000\000\000\000\170\000\000\001\006\001\005\000\000\000\000\002\155\002\148\000\000\002\164\000\000\002\165\002\163\000\000\002\169\000\000\002\170\002\168\000\000\000\000\002\150\002\149\000\000\000\000\000\000\002\016\000\000\001\197\000\000\000\000\000\000\002I\002\015\000\000\002\159\002\158\000\000\000\000\000\000\001Q\000\000\002\132\000\000\002\133\002\131\000\000\002\157\002\156\000\000\000\000\000\000\002C\002\146\000\000\002\145\002\144\000\000\002\167\002\166\000\128\000\000\000\000\000\000\000\000\000\127\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\000\000\001X\000\000\000\000\000\000\000k\000\000\000\000\000l\000\000\000\000\000\000\000\000\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000u\000\000\000\228\000\226\000\000\000\000\000\000\000\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~\000m\000\000\000\000\002\014\000\000\000\000\000\251\001\195\000\000\000\237\000\238\001\002\000\000\000\000\000\000\000\000\000\000\001\210\001\204\000\000\001\209\000\000\001\207\000\000\001\208\000\000\001\205\000\000\000\000\001\206\000\000\001\144\000\000\000\000\000\000\001\143\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001s\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\014\003\t\000\000\000\000\003\b\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\000\000\000\000\000\000\000\000\003\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\128\000\000\002\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\249\000\000\000\000\002N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\146\000\000\000\000\000\000\001\145\000\000\000\000\000\000\000\000\000\000\001g\000\000\001f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\002\\\000\000\000\000\000\000\002Z\000\000\000\000\000\000\002Y\000\000\001Z\000\000\000\000\000\000\000\000\002_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003H\000\000\000\000\000\000\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000E\000\000\000\000\000\000\000\000\001{\000\000\001z\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\002\012\000\000\002\011\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000N\000\000\000\000\000\000\000O\000M\000\000\000R\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000\000\000\000\000\000\000J\000\000\000Q\000P\000\000\000K\000L\000\000\001!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\012\000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000^\000\000\000`\000_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\n\002`\002R\000\000\002X\002S\002^\002]\002[\001\027\000\000\002P\000\000\000\000\000\000\000\000\000\000\002\029\000\000\000\000\001\020\002T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\139\001\135\000\000\000\000\000\000\000\210\000\000\000\000\002\019\002\029\000\000\000\000\001\022\002\017\002\018\000\000\000\000\000\000\000\000\000\000\001\142\001\138\001\134\000\000\000\000\000\211\000\000\000\000\001\141\001\137\001\133\001\131\002U\002Q\002a\001\026\001\252\002O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003C\000\000\000\000\003E\000\000\0006\000\000\000\000\003K\000\000\003J\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\000\000\000\000\003D\000\000\000\000\000\000\002\007\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001?\000\000\000\000\001=\001;\000\000\0007\000\000\000\000\003N\000\000\003M\000\000\000\000\000\000\0019\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\000\000\000\000\001<\001:\000\000\000\000\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\000\000\000\000\000\000\000\000\000\000\000\000\0003\000\000\000\000\000W\000\000\0001\000\255\000\000\000@\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\253\000\000\000V\000U\000\000\000\000\000[\000Z\000\000\000\000\001\185\000\000\0005\000\000\000\000\000\000\0004\000\000\000\000\000\000\0008\000\000\000Y\000\\\000\000\000:\000;\000\000\001#\000\000\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\003\012\003\003\000\000\000\000\003\007\002\248\003\002\003\011\003\n\001\031\000\000\000\000\003\000\000\000\003\004\003\001\003\r\001\251\000\000\000\000\002\254\000\000\000\191\002\253\000\000\000\000\000\222\000\000\000\000\001\030\001\029\000\000\001\\\001[\000\000\000\000\002\195\002\178\000\000\000B\000\000\000\000\000C\000\000\000\000\000\142\000\141\002\162\000\000\002\161\002\160\002\142\000\000\000\000\000\000\000\000\002\135\000\000\002\137\000\000\002\136\000\000\002o\002n\000\000\002p\000\000\000\000\000\134\000\000\000\000\002\004\000\215\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\000\003\006\002\024\002\025\002\020\002\022\002\021\002\023\000\000\000\000\000\000\000\190\000\000\000\000\002\029\000\000\000\214\000\000\000\000\000\000\000\000\003\005\000\000\000\187\000\000\000\000\000\000\000\000\0018\0012\000\000\000\000\0013\000\029\000\000\000\028\000\000\000\000\000\202\000\000\000\000\000\000\000 \000\027\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\001\140\001\136\000\000\001\132\003&\000\000\002\029\000\000\000\213\000\000\000\000\000\000\000\000\002W\002\028\002\026\002\027\000\000\000\000\000\000\002\029\000\000\000\212\000\000\000\000\000\000\000\000\002V\000\000\001i\001h\000\000\000\022\000\000\003F\000\000\000+\000\000\000\000\000\000\000\000\000\137\000\000\000\218\000\001\000\000\000\000\000\221\000\002\000\000\000\000\000\000\001E\001F\000\003\000\000\000\000\000\000\000\000\001H\001I\001G\000\019\001D\000\020\000\000\001\211\000\000\000\004\000\000\001\212\000\000\000\005\000\000\001\213\000\000\000\000\001\214\000\006\000\000\000\007\000\000\001\215\000\000\000\b\000\000\001\216\000\000\000\t\000\000\001\217\000\000\000\000\001\218\000\n\000\000\000\000\001\219\000\011\000\000\000\000\000\000\000\000\000\000\003\025\003\020\003\021\003\024\003\022\000\000\003\029\000\012\000\000\003\028\000\000\001%\000\000\000\000\003\026\000\000\003\027\000\000\000\000\000\000\000\000\001)\001*\000\000\000\000\001(\001'\000\r\000\000\000\000\000\000\0039\000\000\0038") + (16, "\000\000\000\000\000\000\002\253\002\252\002\251\002\250\002\249\002\204\002\248\002\247\002\246\002\245\002\244\002\243\002\242\002\241\002\240\002\239\002\238\002\237\002\236\002\235\002\234\002\233\002\232\002\231\002\230\002\203\002\229\002\228\002\227\002\226\002\225\002\224\002\223\002\222\002\221\002\220\002\219\002\218\002\217\002\216\002\215\002\214\002\213\002\212\002\211\002\210\002\209\002\208\002\207\002\206\002\205\000\000\000\000\000*\000\186\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003B\001\172\001\151\001\169\001\168\001\167\001\173\001\177\000\000\003C\001\171\001\170\001\152\001\175\001\166\001\165\001\164\001\163\001\162\001\160\001\176\001\174\000\000\000\000\000\000\000\220\000\000\000\000\001\155\000\000\000\000\000\000\001\157\000\000\000\000\000\000\001\159\001\181\001\178\001\161\001\153\001\179\001\180\000\000\003A\003@\003D\000\000\000\000\000\024\001E\000\188\000\000\000\216\000\217\000\023\000\000\000\000\001\203\001\202\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003=\000\000\0038\000\000\000\000\003:\000\000\003<\000\000\0039\003;\000\000\0033\000\000\0032\003.\0027\000\000\0031\000\000\0028\000\000\000\000\000\000\000\000\000j\000\000\000\000\000h\000\000\000\000\001C\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\184\001Q\000\000\000\000\000\000\000\000\000\000\000\000\002\"\000\000\000\000\000\000\000\000\000\000\000\000\000e\000\000\000\000\000\000\000\000\001O\000\000\000\000\001R\001P\001X\000A\002\140\000\000\001\021\000\000\000\000\000\000\000\015\000\014\000\000\000\000\000\000\000\000\002\185\000\000\002k\002l\000\000\002i\002j\000\000\000\000\000\000\000\000\000\000\001h\001g\000\000\002\183\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\223\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\022\003\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000g\000\000\000\231\000\000\002n\002m\000\000\000\000\000\000\001\185\000\000\000\000\000%\000\000\000\000\000\000\000\000\000\000\001W\000\000\001V\000\000\001F\001U\000\000\001D\000b\000\030\000\000\000\000\001\128\000\025\000\000\000\000\000\000\000\000\003-\000(\000\000\000\000\000\031\000\026\000\000\000\000\000\000\000\201\000\000\000\000\000\000\000\203\002A\0023\000\000\000\"\000\000\0024\000\000\000\000\001\182\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\017\003\023\000\000\003\024\000\000\000y\000\000\000\000\000!\000\000\000\000\000\000\000#\000\000\000$\000\000\000&\000\000\000\000\000'\002)\002(\000\000\000\000\000\000\000\000\000\000\000\000\000c\000\000\002\190\000f\000i\000d\002\179\003E\002\180\001\244\002\182\000\000\000\000\002\187\002h\002\189\000\000\000\000\000\000\002\196\002\193\000\000\000\000\000\000\001\240\001\226\000\000\000\000\000\000\000\000\001\230\000\000\001\225\000\000\001\243\002\202\000\000\000\000\000\000\000\000\001\130\000\000\000\000\001\242\002\188\000q\000\000\000\000\000p\000\000\002\197\002\181\000\000\001\236\000\000\000\000\002\200\000\000\002\199\002\198\000\000\001\232\000\000\000\000\001\228\001\227\001\241\001\233\000\000\000o\000\000\002\195\002\194\000\000\002\192\000\000\002p\002o\000\000\000\000\002K\002\191\000\000\000\000\000\000\000\000\001\187\0010\0011\002r\000\000\002s\002q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\204\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001r\000\000\000\000\000\000\000\000\000\000\000\000\003\\\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0030\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\000\000\000\001N\001x\001M\001u\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0021\000\000\000\000\0022\002%\002$\000\000\001p\001o\000\000\000\205\000\000\000\000\001a\000\000\000\000\001e\000\000\001\207\001\206\000\000\000\000\001\205\001\204\001d\001b\000\000\001f\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\144\001S\002\149\002\147\000\000\000\000\000\000\002\160\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\178\000\000\002\177\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\255\000\000\000\000\000\000\000\000\000\000\000\000\000\239\001\254\000\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\234\000\000\000\235\000\000\000\000\000\000\002\157\000\000\000\000\000\000\002\128\002w\000\000\000\000\000\000\000\000\003F\002\159\002\146\002\145\000\000\000\000\000\169\000\000\000\000\000\000\000\000\000\000\000\183\000\000\000\000\000\000\000\168\000\000\000\000\000\000\002R\002Q\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\243\000\000\003\000\000\000\003*\000\000\000\000\003)\000\000\000\000\000\000\000\000\000\000\000\195\000\194\000\244\000\000\003\001\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\250\000\000\000\000\002+\000\000\000\000\000\000\000\249\000\000\000\000\000\248\000\247\000\000\000\000\000\000\000\000\000\252\000\000\000\000\000\251\000\000\001\239\000\000\000\000\001\251\000\000\000\000\001\253\000\000\000\000\001\249\001\248\001\246\001\247\000\000\000\000\000\000\000\245\000\000\000\000\001\027\000\018\000\254\000\000\000\000\000\000\002\130\002y\000\000\000\000\002\129\002x\000\000\000\000\000\000\000\000\002\132\002{\000\000\000\000\002E\000\000\000\000\002\136\002\127\000\000\000\000\002\134\002}\002\153\000\000\000\000\000\000\000\000\000\000\002\131\000\000\000\000\000\000\000\000\000\000\002\135\000\000\000\000\000\000\000\000\000\000\002\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002'\002&\000\167\000\000\002z\000\000\000\000\002~\000\000\000\000\002|\000\000\000z\000{\000\000\000\000\000\000\000\000\000\138\000\196\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\000\000\000\198\000\199\000\131\000\000\000\130\000\000\000\000\0013\000\000\0014\0012\002-\000\000\000\000\002.\002,\000\000\000\000\000\000\000\000\000\000\001\006\000\000\000\000\001\007\000\000\000\000\000\170\000\000\001\t\001\b\000\000\000\000\002\161\002\154\000\000\002\170\000\000\002\171\002\169\000\000\002\175\000\000\002\176\002\174\000\000\000\000\002\156\002\155\000\000\000\000\000\000\002\021\000\000\001\201\000\000\000\000\000\000\002N\002\020\000\000\002\165\002\164\000\000\000\000\000\000\001T\000\000\002\138\000\000\002\139\002\137\000\000\002\163\002\162\000\000\000\000\000\000\002H\002\152\000\000\002\151\002\150\000\000\002\173\002\172\000\128\000\000\000\000\000\000\000\000\000\127\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\000\000\001[\000\000\000\000\000\000\000k\000\000\000\000\000l\000\000\000\000\000\000\000\000\001z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\225\000\000\000\000\000u\000\000\000\228\000\226\000\000\000\000\000\000\000\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000~\000m\000\000\000\000\002\019\000\000\000\000\000\253\001\199\000\000\000\237\000\238\001\004\000\000\000\000\000\000\000\000\000\000\001\214\001\208\000\000\001\213\000\000\001\211\000\000\001\212\000\000\001\209\000\000\000\000\001\210\000\000\001\148\000\000\000\000\000\000\001\147\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\017\003\015\000\000\000\000\003\014\000\000\000\000\000\000\000\000\000\000\002\004\000\000\000\000\000\000\000\000\000\000\000\000\003\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\132\000\000\002\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\255\000\000\000\000\002S\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\150\000\000\000\000\000\000\001\149\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001w\000\000\000\000\000\000\000\000\001j\000\000\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\019\002a\000\000\000\000\000\000\002_\000\000\000\000\000\000\002^\000\000\001]\000\000\000\000\000\000\000\000\002e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003N\000\000\000\000\000\000\000\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000E\000\000\000\000\000\000\000\000\001\127\000\000\001~\000\000\000\000\000\000\000\000\000H\000\000\000\000\000\000\002\017\000\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000N\000\000\000\000\000\000\000O\000M\000\000\000R\000\000\000\000\000\000\000\000\000\000\000G\000\000\000\000\000\000\000\000\000\000\000\000\000J\000\000\000Q\000P\000\000\000K\000L\000\000\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\015\000a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000^\000\000\000`\000_\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\r\002f\002W\000\000\002]\002X\002d\002c\002b\002`\001\030\000\000\002U\000\000\000\000\000\000\000\000\000\000\002\"\000\000\000\000\001\023\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\143\001\139\000\000\000\000\000\000\000\210\000\000\000\000\002\024\002\"\000\000\000\000\001\025\002\022\002\023\000\000\000\000\000\000\000\000\000\000\001\146\001\142\001\138\000\000\000\000\000\211\000\000\000\000\001\145\001\141\001\137\001\135\002Z\002V\002g\001\029\002\001\002T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003I\000\000\000\000\003K\000\000\0006\000\000\000\000\003Q\000\000\003P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003H\000\000\000\000\003J\000\000\000\000\000\000\002\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001B\000\000\000\000\001@\001>\000\000\0007\000\000\000\000\003T\000\000\003S\000\000\000\000\000\000\001<\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001A\000\000\000\000\001?\001=\000\000\000\000\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000X\000\000\000\000\000\000\000\000\000\000\000\000\0003\000\000\000\000\000W\000\000\0001\001\001\000\000\000@\000-\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\255\000\000\000V\000U\000\000\000\000\000[\000Z\000\000\000\000\001\189\000\000\0005\000\000\000\000\000\000\0004\000\000\000\000\000\000\0008\000\000\000Y\000\\\000\000\000:\000;\000\000\001&\000\000\000\000\000\000\000\000\000\000\000\000\000>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\011\003\018\003\t\000\000\000\000\003\r\002\254\003\b\003\017\003\016\001\"\000\000\000\000\003\006\000\000\003\n\003\007\003\019\002\000\000\000\000\000\003\004\000\000\000\191\003\003\000\000\000\000\000\222\000\000\000\000\001!\001 \000\000\001_\001^\000\000\000\000\002\201\002\184\000\000\000B\000\000\000\000\000C\000\000\000\000\000\142\000\141\002\168\000\000\002\167\002\166\002\148\000\000\000\000\000\000\000\000\002\141\000\000\002\143\000\000\002\142\000\000\002u\002t\000\000\002v\000\000\000\000\000\134\000\000\000\000\002\t\000\215\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\000\003\012\002\029\002\030\002\025\002\027\002\026\002\028\000\000\000\000\000\000\000\190\000\000\000\000\002\"\000\000\000\214\000\000\000\000\000\000\000\000\003\011\000\000\000\187\000\000\000\000\000\000\000\000\001;\0015\000\000\000\000\0016\000\029\000\000\000\028\000\000\000\000\000\202\000\000\000\000\000\000\000 \000\027\000\000\000\000\000\000\000\021\000\000\000\000\000\000\000\000\001\144\001\140\000\000\001\136\003,\000\000\002\"\000\000\000\213\000\000\000\000\000\000\000\000\002\\\002!\002\031\002 \000\000\000\000\000\000\002\"\000\000\000\212\000\000\000\000\000\000\000\000\002[\000\000\001l\001k\000\000\000\022\000\000\003L\000\000\000+\000\000\000\000\000\000\000\000\000\137\000\000\000\218\000\001\000\000\000\000\000\221\000\002\000\000\000\000\000\000\001H\001I\000\003\000\000\000\000\000\000\000\000\001K\001L\001J\000\019\001G\000\020\000\000\001\215\000\000\000\004\000\000\001\216\000\000\000\005\000\000\001\217\000\000\000\000\001\218\000\006\000\000\000\007\000\000\001\219\000\000\000\b\000\000\001\220\000\000\000\t\000\000\001\221\000\000\000\000\001\222\000\n\000\000\000\000\001\223\000\011\000\000\000\000\000\000\000\000\000\000\003\031\003\026\003\027\003\030\003\028\000\000\003#\000\012\000\000\003\"\000\000\001(\000\000\000\000\003 \000\000\003!\000\000\000\000\000\000\000\000\001,\001-\000\000\000\000\001+\001*\000\r\000\000\000\000\000\000\003?\000\000\003>") and error = - (124, "'\225 \197\138\173\2433\208\020\015\228\000\003\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224}\246D\b/\227P\000L\028\030\227\139\002\131@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\2437\252\149\031\226\017\007\158\007\223d@\130\2545\000\004\193\193\2388\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\016(\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\002\012\\ \000\016\000\000\000\000\000\001\000@@@ \193\004\000\000\016\000\000\000\000\000\016\004\004\000\002\012\016@\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\132\128 \128\b \002\020\000\016\000b\000\002\000\bH\002\b\000\130\000!\000\001\000\006 \000 \000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\bH\002(\000\194\t!\192\001\016\006a\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\001\000\012\\(\000\016\b\002\000\001\000\003\000\bp\016 \197\194\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001f\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bP\t\026\000\001$!\192\192\018\001!\018\000\016}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\0000\000\002H\000L\000\000\b\000\000\000\000\000\128\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\000\128\193#\144\000\001\128\000\001\140\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\247\255\252\157?\230!\003\158@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\136G\226\173\245#\211\230/\144@\025\174\184\018\016\132@\b\012\0189\000\000\024\000\000\024\192#a\000E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\004\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\136G\224,\229\"\211\227!\176@\025,\184\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\131\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\167\225 \197\138\173\2437\208\020\015\226\000\003\142\n~\018\012X\170\2233=\001@\254 \0008\224\167\225\"\197\138\173\2433\208\020\015\230\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000@@\000\129\004\000\000\016\000\000\000\b\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\005\002\000@\000\000\129\000\000\000\016\000\000\000\000\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004\\(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\020@\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\004\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\022\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\011\184\000\131!!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000@\000\002\000\000\000\001\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\002\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000 \000\000\000\017 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\020\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000 \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\003!\000@\192\004\193&\144\001\001\128\000\001\004\0002\016\004\b\000L\018i\000\016\024\000\000\016@\003!\000@\128\004\193\"\144\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\193&\176\001\001\148 mU\000\000\016\000\b\000@\000\001\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\145\181\t\001L\018o\000\016\027A\006\213P\001\000\000\000\000\000\128\"\128\000\000\000\000\000\000\b2\016\132\b\000L\018-\000\016\026\000\000\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\000\000\020\000LQ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\193&\208\001\001\180\000MU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\017\180\b\001L\018m\000\016\027@\004\213P\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\000\000\020\000LQ\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016$\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\018\000\000\000\000\004\000\000\000\000\000HQ\b2\016$\b\000L\018-\000\016\026\000\000\020@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\016\000\000\004\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\001\001\144\000M\021\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016D\012\130L\018m\000\016\026\000\000\016@\001\002\000@@\000\129\004\000\000\016\000\000\000\b\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000@\b\000\000\000\002\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\0000\000\007\129\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\001@0\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\001\"\001LH\002\168\000\131\001!\192\001\016\007`\018 \004\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\018 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\016\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\016\"\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\025\000v\000&\000@P \132\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\b\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\025\000v\016&\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\004\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224#a\002E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000@\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\001!\000D\000\128\193#\144\000\001\128\000\001\140\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000#a\000E\194\141\241'\208\004\015\130\000\001\142\0026\016\004X(\223\018}\000@\248 \000\024\224#a\000E\130\141\241#\208\004\015\130\000\001\142\000\018\016\004D\b\012\018y\000\000\024\000\000\024\192\001!\000D\000\128\193'\144\000\001\128\000\001\140\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\001!\000D\000\128\193#\144\000\001\128\000\001\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237s\251\255\182\031}\183\255\223\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\n6\024\132~*\223R=>b\249\004\001\154\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n6\016\132X(\223\018=\000@\248\000\000\024\224\163a\bE\130\141\241#\208\004\015\128\000\001\142\b\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\004\000\b\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n6\016\132X(\223\018=\000@\248\000\000\024\224\163a\bE\130\141\241#\208\004\015\128\000\001\142\b2\016\132\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\001\000\000\000\000\001\000\000@\000\000\000\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\144\005\r\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018+\000\016\024\000\000\016@\002\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\128\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b:\024\132~\002\206R->2\027\004\001\146\203\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\004\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\193\"\176\001\001\128\000\005\004\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\018\016\004D\b\012\018y\000\000\024\000\000\024\192\001!\000D\000\128\193'\144\000\001\128\000\001\140\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\196\148\187\131\232>\022\028\015\251`w\219~p\240\018\016\004@\b\012\0189\000\000\024\000\000\024\192\197\189\187\215\248\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\197\189\187\215\248\190\215?\191\251a\247\219\127\252\240\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\197\189\187\215\248\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\197\189\187\215\248\190\215?\191\251a\247\219\127\252\252IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237s\251\255\182\031}\183\255\207\196\148\187\131\232>\022\028\015\251`w\219~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\127[\188~\171\255s\253\255\214\255x\183\255\239}\246D\b/\227P\000L\028\030\227\139\002\131B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\003!\000@\128\004\193&\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\003)\000P\144\004\193&\176\001\001\144\000m\021\b:\024\132~\002\206R->2\027\004\001\146\203\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000%\004\0002\016\004\b\000L\018)\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\000\000\000\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\004\000\000\000\016\000 \000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\128\000\025\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000%\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\128\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\b\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\bH\002(\000\130\001!\128\001\144\006`\000 \004\132\128\"\128\b\"\018\024\012\025\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\129\003\224\012\004\004\003\224 \016\000X 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\t\176>\000\192@@>\002\001\000\005\134\003\163a\011E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\197\189\187\215\248\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\248\000\t\016>\000\192@@>\002\001\000\005\130\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\b\016>\000\192@@>\002\001\000\005\130\003\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\252[\219\189\127\139\237s\251\255\182\031}\183\255\223\197\189\187\215\248\190\215?\191\249a\247\139\127\252\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b:\024\132~\002\206R->2\027\004\001\146\203\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\193\"\176\001\001\128\000\005\004\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\016@\000\000\001\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\001L\018+\000\016\024\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\001L\018+\000\016\024\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\016\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2402\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\b#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\018\016\132@\b\012\0189\000\000\024\000\000\024\192\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\028\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\002E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192@\000\000\000\000\000\000\000\000\003\000\000P\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b\016\000\016\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\t\016>\000\192@@>\006\001\000\005\130\003\128\000\016\000\000\000\000\000\000\000@\000\000\000\000\b\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016 \004\000\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\144\006`\000 \004\001\000@@\000 \193\000\000\000\016\000\000\000\000\004\000\000\000\000\001\000\000@\000\000\001\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\144\006`\000 \004\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\128\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000@\000\128\000\000\000@\000\003\000\000`\000\000\197\194\128\001\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\017\000\000\000\000\004\000\000 \000\000\000\001\000\000\001\016\000\000\000\000@\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\004\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000@\000\002\000\000\000\000\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\bX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bX\n(\000\130\005!\192\001\144\006`\016!\004\003\000\000`\000\000\197\194\128\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\bX\002(\000\130\005!\192\001\144\006`\016!\004\133\128\162\128\b0R\028\000\025\000f\001\002\016@\000\000\000\000\000\000\000@\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\004@\128\004\193&\208\001\001\128\000\001\004\0002\016D\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\024\000\000\016@\132\128\"\128\b \018\024\000\025\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\017@\196\148\187\131\232>\022\028\015\249`w\139~p\248\000\b\128>\000\192@@>\002\001\000\007\194\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\t!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016 \004\000\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000@\004\000\000\000@\000\000\000\000\000\000\000\001\000\000\000@\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\007`\000 \000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\000\000\000\000\000\000\000\0000\000@\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\003\000\000\000\000\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\003!\000@\128\004\193\"\208\001\001\160\000\001\004\001\000\000 \000\000\000\000@\000\000\000\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\001\002\000@@\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\bH\002(\000\130\t!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\132\129\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\194\001!\192\001\016\007`\000`\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \018\028\000\017\000f\016\002\016\000\016\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\bH\002(\000\130\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000x\002/\001\130\012} \001\016\006\000\000 \000\132\128\"\128\b \002\016\000\016\000f\000\002\000\000\016\000\000\004\000\000\000@\000\000\000\000\000\000\128\001\000\000\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0008\000@\004\000\000\000@\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\000\000\000\000\000\000\000\0000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\020\000\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\003\000\000\000\000\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\132\128\"\128\b \002\024\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@@ \193\004\000\000\016\000\000\000\000\000\016\004\004\000\002\012\016@\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \002\028\000\016\000f\000\006\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000@\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\b@\000\b\000\000(!@@\000\000 \016\000\000\132\000\000\128\000\002\130\016\004\000\000\002\001\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\004\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\000\b\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\001 \016\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\018\001\000\000\000\016\000\004\000 \005\016`\000\000\000\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000@\000\000\000\000 \000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\004\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002\168\000\130!!\192A\016\007`\016 \004\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\000\b@\000\b\000\000 !\128@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\bX\n\168\000\131\004!\192\001\016\007`\000`\004\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\002\000\000\000\000\004\000\000\000\000\000@\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\133\128\170\128\b0B\028\000\017\000v\000\002\000HX\n\168\000\131\004!\192\001\016\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130\000!\192\001\000\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\016\000\016\000f\000\002\000@ \000\002H\000L\000@\b\000\000\000\000\000\128\002\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\016\000\016\000f\000\002\000@ \000\002H\000L\000@\b\000\000\000\000\000\128\002\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\0002\000\007\129\000\012\\(\000\016\b\002\000\001\000\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bZ\002(\000\130\t!\160\001\016\014`\016 \004\132\128\"\128\012 \018\028\000\017\000f\001\006\016HH\002(\000\130\001!\192\001\016\006`\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016!\004\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\016 \004\132\128\"\128\b \002\016\000\016\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000v\001\002\000@\018\000\000\128\000\b\000(\000\000\b\002\000\001\000\001 \000\000\000\000\128\002\128\000\000\128 \000\016\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \018\028\000\017\000f\001\006\016HH\002(\000\130\001!\192\001\016\006`\016!\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\000\000\000\000\000\000\b\128\000\000@\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\0002\144\005\t\000L\018+\000\016\025\000\000P@\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\b@\000\b\000\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\016\012\000\000\002\001\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\b\000\000\000\000@@\004\000\000\000\000\000\000\b\000\000\000\000\000\004\004\000@\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000$\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000$\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\b\000\000\000\000\128\000\004\000@\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\0002\144\005\t\000L\018+\000\016\025\000\000P@\003\128\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\0002\144\005\t\000L\018+\000\016\025\000\000P@\003\128\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \r\016`\000\000@\000\000\000\128\001\000\000@\002\000\209\006\000\000\004\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\0002\016D\012\128L\018m\000\016\024\000\000\016@}\246D\b/\227P\000L\028\030\227\139\002\131@2\016D\b\000L\018m\000\016\024\000\000\016@\003!\004@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193\"\176\001\001\128\000\001\004\0002\144\005\t\001L\018+\000\016\024\000\000\016@\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\169*\212\024\162\211?\188\017\001\230\001\007\141HZ\146\173A\138-3\251\193\016\030`\016x\212\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\003!\004@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\b\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\000 \016\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\b@\000\b\000\000 !\192\192\000\000 \016\000\016\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000@0\000\007\001 \r\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000@2\144\005\t\000L\018+\000\016\025\000\000P@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\0002\144\005\t\000L\018+\000\016\025\000\000P@\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\000\006`\000 \000\003!\004@\192\004\193&\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\016\006`\000 \004\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\000\006`\000 \000\132\128\"\128\b \018\016\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\144\006`\000 \004\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\016\000f\000\002\000\bH\002(\000\130\001!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007`\002 \004\192\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\193\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\b\000\000\000\128\004\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\000@\128\004\193\"\208\001\001\160\000\001\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\240\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \018\024\000\017\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000 \000\000\000\000\000\000\001\000\000\000\000\000\000\000\002\000\000\000\000\000\003\000\000`\000\000\197\198\000\001 \000 \000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000@\000\000\001\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\129\000\012\\(\000\016\b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \002\024\000\016\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\130\b \002\024\000\016\000v\001\018\000@2\000\007\129\000\012\\(\000\016\b\002\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\132\128\"\128\b \002\024\000\016\000f\000\002\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\000!\000\001\000\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\012\000 \000\000\b\000\000\000\000\128\000\136\007\224,$\000\003\226 \016@\024(\176\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\b\000\b\000~\002\194@\000>\"\001\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000A\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\004\000H\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\002~\018\012X\170\2233=\001P\254@\0008\224\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000Z\018\b\000\130\r!\001\001\016\014@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\000\001\016\006A\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\016\000\016\000`\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\b\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002~\018\012X\170\2233=\001P\254@\0008\224'\225 \197\138\173\2433\208\021\015\228\000\003\142\000H\002\b\000\130\001!\000\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\128\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\024\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") + (124, "'\225 \197\138\173\2433\208\020\015\228\000\003\142\0026\016\004\\(\223\018}\000@\248\000\000\024\224}\246D\b/\227P\000L\028\030\227\139\002\131@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235f\245\155\175\2437\252\149\031\226\017\007\158\007\223d@\130\2545\000\004\193\193\2388\176(4\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\000\000\000\004\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\016(\176\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\002\012\\ \000\016\000\000\000\000\000\001\000@@@ \193\004\000\000\016\000\000\000\000\000\016\004\004\000\002\012\016@\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\003 \004\132\128 \128\b \002\020\000\016\000b\000\002\000\bH\002\b\000\130\000!\000\001\000\006 \000 \000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000 \000\002\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\002\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000$\128\004\000\000\000\128\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\bH\002(\000\194\t!\192\001\016\006a\016a\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\000\007\001\000\012\\(\000\016\b\002\000\001\000\003\000\bp\016 \197\194\000\001\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\128\187\128\b2R\028\012\017 v\001f\017`0\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\018\000\002\000\000\000\001\000\016\000\000\000@\000\000\001 \000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bP\t\026\000\001$!\192\192\018\001!\018\000\016}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000$\193\004\192\004\000\128\000\000\000\000\b\0000\000\002H\016L\000@\b\000\000\000\000\000\128\003\000\000$\129\004\192\000\000\128\000\000\000\000\b\0000\000\002H\000L\000\000\b\000\000\000\000\000\128\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004}\246D\b/\227P\000L\028\030\227\139\002\131B~\018-X\170\2233=\001@\254\000\000x\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\000\128\193#\144\000\001\128\000\001\140\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\175\235w\253\155\239\247\255\252\157?\230!\003\158@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\163a\136G\226\173\245#\211\230/\144@\025\174\184\018\016\132@\b\012\0189\000\000\024\000\000\024\192#a\000E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\004\000(!@\192\000\000 \016\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131!\136G\224,\229\"\211\227!\176@\025,\184\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\131\000\000\000@\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\167\225 \197\138\173\2437\208\020\015\226\000\003\142\n~\018\012X\170\2233=\001@\254 \0008\224\167\225\"\197\138\173\2433\208\020\015\230\000\003\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000@@\000\129\004\000\000\016\000\000\000\b\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\005\002\000@\000\000\129\000\000\000\016\000\000\000\000\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004\\(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\128\004\193\"\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\026\000\000\020@\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\003\000\002p\016\000\197\194\000\001\000\000\000\000\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\004\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\128\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\022\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\011\184\000\131!!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\012X\011\184\000\131%!\192\193\018\007`\022!\022\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000@\000\000@\000\002\000\000\000\001\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\002\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000 \000\000\000\017 \000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000@\000\002\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\003\184\000\131!!\192\193\018\007`\022!\020\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\0000\000\007\001\000\012\\ \000\016\000\000\000\000@\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000 \000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000 \000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\001\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000\000\000\0002\016\004\b\000L\018-\000\016\026\000\000\016@\003!\000@\192\004\193&\144\001\001\128\000\001\004\0002\016\004\b\000L\018i\000\016\024\000\000\016@\003!\000@\128\004\193\"\144\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147)\027P\144\020\193&\176\001\001\148 mU\000\000\016\000\b\000@\000\001\000\000\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\145\181\t\001L\018o\000\016\027A\006\213P\001\000\000\000\000\000\128\"\128\000\000\000\000\000\000\b2\016\132\b\000L\018-\000\016\026\000\000\144@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\144\000\027\000\000\016\000\004\000\000\000\020\000LQ\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\147!\027@\128\020\193&\208\001\001\180\000MU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t2\017\180\b\001L\018m\000\016\027@\004\213P\131\161\136G\224,\229\"\211\227!\176@\025,\176\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000@\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018)\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\001\000\000\016\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\000\001\176\000\001\000\000@\000\000\001@\004\197\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\002@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001 \000\000\000\000@\000\000\000\000\004\133\016\131!\002@\128\004\193\"\208\001\001\160\000\001D\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\016\000\000\000\000@\000\000\000\000\004\129\016\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\016\000\000\004\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\t\001\144\000M\021\128\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016D\012\130L\018m\000\016\026\000\000\016@\001\002\000@@\000\129\004\000\000\016\000\000\000\b\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\003\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\b\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\000@\b\000\000\000\002\000\000\000\000\000\000\000\000\000\000\003\000\000$\128\004\192\000\000\128\000\000\000\000\b\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\016\000\0000\000\007\129\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\000\"\001@0\000\007\001\000\012\\ \000\016\000\000\000\000\000\196\128*\128\b0\018\028\000\017\000v\001\"\001LH\002\168\000\131\001!\192\001\016\007`\018 \004\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\018 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\001\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\001\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\003 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\000\000\000\000\000\000\000\000\000\000\016\016\016\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\016\"\000@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\t!\192\001\016\007a\002 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012H\002\168\000\131\001!\192\001\016\007`\002 \004\000\128\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\b\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\025\000v\000&\000@P \132\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\b\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\025\000v\016&\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\004\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224#a\002E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\128\000\016\000\000\000\000\000\000\000@\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\001!\000D\000\128\193#\144\000\001\128\000\001\140\012\000\001\016\000\000\000\000\000\0000\001\005\002@\000#a\000E\194\141\241'\208\004\015\130\000\001\142\0026\016\004X(\223\018}\000@\248 \000\024\224#a\000E\130\141\241#\208\004\015\130\000\001\142\000\018\016\004D\b\012\018y\000\000\024\000\000\024\192\001!\000D\000\128\193'\144\000\001\128\000\001\140\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\001!\000D\000\128\193#\144\000\001\128\000\001\140\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237s\251\255\182\031}\183\255\223\001\000\000\000\000\000\192#\128\000\000\000\000\000\000\n6\024\132~*\223R=>b\249\004\001\154\235\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n6\016\132X(\223\018=\000@\248\000\000\024\224\163a\bE\130\141\241#\208\004\015\128\000\001\142\b\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\000\000\000\000\004\000\b\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n6\016\132X(\223\018=\000@\248\000\000\024\224\163a\bE\130\141\241#\208\004\015\128\000\001\142\b2\016\132\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\004\000\000\000\016\000L\017\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224#a\000E\194\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018}\000@\248\000\000\024\224#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\016\004\012\000L\018m\000\016\026\000\000\017@\003!\000@\128\004\193&\208\001\001\160\000\001\020\0002\016\004\b\000L\018-\000\016\026\000\000\017@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\001\000\000\000\000\001\000\000@\000\000\000\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\0002\144\005\r\000L\018k\000\016\024\000\000\016@\003)\000P\144\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018+\000\016\024\000\000\016@\002\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\128\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\001\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b:\024\132~\002\206R->2\027\004\001\146\203\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\193\"\176\001\001\128\000\005\004\0026\016\004X(\223\018=\000@\248\000\000\024\224\003!\000@\192\004\193&\208\001\001\160\000\001\004\0002\016\004\b\000L\018m\000\016\026\000\000\016@\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\018\016\004D\b\012\018y\000\000\024\000\000\024\192\001!\000D\000\128\193'\144\000\001\128\000\001\140\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\196\148\187\131\232>\022\028\015\251`w\219~p\240\018\016\004@\b\012\0189\000\000\024\000\000\024\192\197\189\187\215\248\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\197\189\187\215\248\190\215?\191\251a\247\219\127\252\240\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\197\189\187\215\248\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\012\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\197\189\187\215\248\190\215?\191\251a\247\219\127\252\252IK\184>\131\225a\192\255\182\007}\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237s\251\255\182\031}\183\255\207\196\148\187\131\232>\022\028\015\251`w\219~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\127[\188~\171\255s\253\255\214\255x\183\255\239}\246D\b/\227P\000L\028\030\227\139\002\131B6\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\003!\000@\128\004\193&\208\001\001\128\000\001\004\0002\016\004\b\000L\018-\000\016\024\000\000\016@\135\169\"\208\152$\211>\176\025\001\246\000o\021H:\024\132~\002\206R->2\027\004\001\146\203\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000%\004\0002\016\004\b\000L\018)\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b0\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\001\144\000\000\000\000@\000\000\001\000\000\000\000\131\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\025\000\000\000\000\004\000\000\000\016\000 \000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\128\000\025\000\000\000\000\004\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000%\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b8\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\016\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\193\016\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\131!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000H\017\b2\016\004\b\000L\018-\000\016\026\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\128\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\144\006`\000 \004\132\128\"\128\b\"\018\024\012\025\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\000\000\000\000\000\000\000\000\000\128\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\t\176>\000\192@@>\002\001\000\005\134\003\163a\011E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\016\004@\b\012\0189\000\000\024\000\000\024\192\197\189\187\215\248\190\215?\191\251a\247\219\127\253\240\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\001\000\000\000\000\000\192\002\128\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\b\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\001\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000P\000\000\000\000\000\000\000\000\b\000(\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\2426\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\012[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\197\189\187\215\248\190\223?\191\251a\247\219\127\252\2426\016\004X(\223\018=\000@\248\000\000\024\224\196\148\187\131\232>\022\028\015\249`w\139~p\252[\219\189\127\139\237\243\251\255\182\031}\183\255\207#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\197\189\187\215\248\190\215?\191\251a\247\219\127\253\252[\219\189\127\139\237s\251\255\150\031x\183\255\207\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\131\161\136G\224,\229\"\211\227!\176@\025,\176\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\0002\144\005\t\001L\018+\000\016\024\000\000P@\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\016\000\000\000\001\004\000\000\000\016\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\193\"\176\001\001\128\000\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\020\193\"\176\001\001\128\000\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\001\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015#a\000E\130\141\241#\208\004\015\128\000\001\142\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\004\129\016#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\1306\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016\004\b\000L\018-\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129!\bD\000\128\193#\144\000\001\128\000\001\140\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\206\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0026\016$X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001!\000D\000\128\193#\144\000\001\128\000\001\140\004\000\000\000\000\000\000\000\000\0000\000\005\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\017\000\000\000\000\000\000\000\000\016\000\000\000\b\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\129\000\001\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\003\000\000P\000\000\000\016\000\000\000\000\012\0028\000\000\000\000\000\000\000\192\000\017\000\000\000\000\000\000\003\000\016P$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\251`w\219~p\240\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\145\003\224\012\004\004\003\224`\016\000X 8\000\001\000\000\000\000\000\000\000\004\000\000\000\000\000\128\000\000\000\000\000@\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\128\004\000\b\000\000\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\004\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\025\000f\000\002\000@\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000@\000\000\000\000\016\000\004\000\000\000\016\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\025\000f\000\002\000@\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000@\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\004\000\b\000\000\000\004\000\0000\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\001\016\000\000\000\000@\000\002\000\000\000\000\016\000\000\017\000\000\000\000\004\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@@\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\000\000\000\000\004\000\000 \000\000\000\001\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\162\128\b0R\028\000\025\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\128\162\128\b R\028\000\025\000f\001\002\016@0\000\006\000\000\012\\(\000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\133\128\"\128\b R\028\000\025\000f\001\002\016HX\n(\000\131\005!\192\001\144\006`\016!\004\000\000\000\000\000\000\000\004\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002\016D\b\000L\018m\000\016\024\000\000\016@\003!\004@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\128\000\001\004\bH\002(\000\130\001!\128\001\144\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\148\187\131\232>\022\028\015\249`w\139~p\244\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\020\012IK\184>\131\225a\192\255\150\007x\183\231\015\128\000\136\003\224\012\004\004\003\224 \016\000| 0\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000v\000\002\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000@\000\000\000\000@\000\000\000\000\000\000\000\003\000\004\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@0\000\000\000\000\000\000@\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\001\000\000@\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\0002\016\004\b\000L\018-\000\016\026\000\000\016@\016\000\002\000\000\000\000\004\000\000\000\000\000H\017\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\223d@\130\2545\000\004\193\193\2388\176(4'\225\"\213\138\173\2433\208\020\015\224\000\007\142\000\016 \004\004\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016\000\000\001\000\000\000\000\000\132\128\"\128\b \146\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\192\004\000\000\000\000\000\000\000\000\000\000\000\000\000\012\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\018(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \018\028\000\017\000v\000\006\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\b\000\bH\002(\000\130\001!\192\001\016\006a\000!\000\001\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\132\128\"\128\b \018\028\000\017\000f\000\002\000\bH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \000\132\128\"\128\b \018\024\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\128\"\240\024 \199\210\000\017\000`\000\002\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\001\000\000\000@\000\000\004\000\000\000\000\000\000\b\000\016\000\000\004\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \130\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \130\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\128\004\000@\000\000\004\000\000\000\000\000\000\000\000\016\000\000\004\000\004\000@\000\000\000\000\000\000\000\001\000\000\000\000\000@\004\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000v\000\018\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\004\000\000\000\000\004\000\000\000\000\000\000\000\0000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\020\000\b\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\b!\128\001\000\006a\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\003\000\000\000\000\000\000\004\000\000\000\000\000\000\000\0000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\196\128\"\128\b0\002\028\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\016\000\004\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\132\128\"\128\b \002\024\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000@@@ \193\004\000\000\016\000\000\000\000\000\016\004\004\000\002\012\016@\000\001\000\000\000\000\000\001\000@@\000 \193\000\000\000\016\000\000\000\000\012H\002(\000\131\000!\192\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\004\000\b\000`\000\000\b\000\000\000\000\001 \000\000\000\000\128\006\000\000\000\128\000\000\000\000\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\132\128\"\128\012 \002\028\000\016\000f\000\006\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000@\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000 \000\002H\000@\000\000\b\000\000\000\000\000\128\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\b@\000\b\000\000(!@@\000\000 \016\000\000\132\000\000\128\000\002\130\016\004\000\000\002\001\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\016\004\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\000\b\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\001 \016\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\018\001\000\000\000\016\000\004\000 \005\016`\000\000\000\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\b\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000@\000\000\000\000 \000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\004\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\001\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002\168\000\130!!\192A\016\007`\016 \004\132\000\000\128\000\002\002\028\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\198\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\016\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\000\b@\000\b\000\000 !\128@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\004\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000@\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000Q\002\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\bX\n\168\000\131\004!\192\001\016\007`\000`\004\003\000\000`\000\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\001@\000\000\002\000\000\000\000\004\000\000\000\000\000@\016\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\0000\000\006\000\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\133\128\170\128\b0B\028\000\017\000v\000\002\000HX\n\168\000\131\004!\192\001\016\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130\000!\192\001\000\007`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001 \r\\ \000\016\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\000\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\128\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \004\002\000\000$\128\004\192\004\000\128\000\000\000\000\b\000 \000\002H\000L\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\007`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\016 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\000!\000\001\000\006`\000 \004\002\000\000$\128\004\192\004\000\128\000\000\000\000\b\000 \000\002H\000L\000\000\b\000\000\000\000\000\128\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\003 \000x\016\000\197\194\128\001\000\128 \000\016\0000\000'\001\000\012\\ \000\016\000\000\000\001@\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\133\160\"\128\b \146\026\000\017\000\230\001\002\000HH\002(\000\194\001!\192\001\016\006`\016a\004\132\128\"\128\b \018\028\000\017\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\016@\018\000\000\000\000\b\000 \000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000HH\002(\000\130\000!\000\001\000\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\007`\016 \004\001 \000\b\000\000\128\002\128\000\000\128 \000\016\000\018\000\000\000\000\b\000(\000\000\b\002\000\001\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\194\001!\192\001\016\006`\016a\004\132\128\"\128\b \018\028\000\017\000f\001\002\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\004\000\000\000\000\000\000\000\000\136\000\000\004\000\004\000`\000\000\000\000\000\000\000\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\000\000\128\000\002\130\020\012\000\000\002\001\000\000\b@\000\b\000\000(!\000\192\000\000 \016\000\000\132\000\000\128\000\002\002\016\012\000\000\002\001\000\000\000\128\000\000\000\004\004\000@\000\000\000\000\000\000\128\000\000\000\000\000@@\004\000\000\000\000\000\000\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002@\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000@@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\192\192\000\000 \016\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\002@\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\128\000\004\000@\000\000\000\000\000\000\128\000\000\000\b\000\000@\004\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\0008\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\b\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\128\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\0008\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\001\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\0026\016\004X(\223\018=\000@\248\000\000\024\224\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241'\208\004\015\128\000\001\142\0026\016\004X(\223\018=\000@\248\000\000\024\224\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000@\002\000\209\006\000\000\004\000\000\000\b\000\016\000\004\000 \r\016`\000\000@\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\003!\004@\200\004\193&\208\001\001\128\000\001\004\007\223d@\130\2545\000\004\193\193\2388\176(4\003!\004@\128\004\193&\208\001\001\128\000\001\004\0002\016D\b\000L\018-\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000@\000\000\000\000\000\000\128\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\004\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193&\176\001\001\128\000\001\004\0002\144\005\t\000L\018+\000\016\024\000\000\016@\003)\000P\144\020\193\"\176\001\001\128\000\001\004\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000@\016\000\004\000 \r\016 \000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bZ\146\173A\138-3\251\193\016\030`\016x\212\133\169*\212\024\162\211?\188\017\001\230\001\007\141@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002\168\000\130!!\192\193\016\006`\016`\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\016\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\128*\128\b\"\018\028\012\017\000f\001\006\001@2\016D\b\000L\018-\000\016\024\000\000\016@\003!\000@\128\004\193\"\208\001\001\128\000\001\004\000\000\000\000\000\000\000\000\128\000\128\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\001\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\004\000 \r\016 \000\000@\000\000\000\000\132\000\000\128\000\002\002\028\012\000\000\002\001\000\001\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\`\000\016\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\b@\000\b\000\000 !\128\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\128\000\002\002\024\012\000\000\002\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\003\000\000p\018\000\213\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\001\000\000@\002\000\209\002\000\000\004\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000 \004\003)\000P\144\004\193\"\176\001\001\144\000\005\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\000\002\000HH\002(\000\130\001!\000\001\016\006`\000 \004\b\000\000\000\000\000@\006\000\000\000\000\000\000\000\000\128\000\000\000\000\004\000 \000\000\000\000\000\000\000\000\000\000\000\000\000@\002\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\003)\000P\144\004\193\"\176\001\001\144\000\005\004\bH\002(\000\130\001!\128\001\016\006`\000 \004\132\128\"\128\b \018\016\000\017\000f\000\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\016\000f\000\002\000\0002\016D\012\000L\018m\000\016\024\000\000\016@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\017\000f\000\002\000HH\002(\000\130\001!\128\001\016\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\000\001\016\006`\000 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\016\000f\000\002\000\bH\002(\000\130\001!\000\001\000\006`\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\016\000\025\000f\000\002\000@\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\000\006`\000 \000\132\128\"\128\b \018\016\000\016\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\196\128*\128\b0\146\028\000\017\000v\000\"\000L\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000L\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\128\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b@\000\b\000\000 !\000\192\000\000 \016\000\000\128\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\129\002\000@@\000\129\004\000\000\016\000\000\000\000\000\016 \004\000\000\b\016@\000\001\000\000\000\000\000\001\002\000@\000\000\129\000\000\000\016\000\000\000\000\000\000\000\128\000\000\b\000@\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\016\004\004\000\002\012\016\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\128\000\001\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\128\000\000\000\000\000\000\000\000\000\002@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b2\016\004\b\000L\018-\000\016\026\000\000\017@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012IK\184>\131\225a\192\255\150\007x\183\231\015\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\001 \000\b\000\000\128\002\000\000\000\128\000\000\016\000\018\000\000\000\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\194\001!\192\001\016\007`\000a\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\128\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\194\001!\192\001\016\007`\000a\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\bH\002(\000\130\001!\192\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\132\128\"\130\b \018\024\000\017\000v\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\024\000\017\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\bH\002(\000\130\001!\128\001\016\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\002\000\000\000\000\000\000\000\016\000\000\000\000\000\000\000 \000\000\000\000\0000\000\006\000\000\012\\`\000\018\000\002\000\000\000\003\000\000`\000\000\197\194\000\001 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\001\000\000\000\004\000\000\000\018\000\000\000\000\000\003\000\000`\000\000\197\194\000\001 \000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000@\000\000\016\000\000\000\000\004\000\000\000\016\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\128\000\000\000\000@\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0000\000\007\001\000\012\\ \000\016\000\000\000\000\000\000\000\b\000\000\000\000\004\000\000\000\000\000@\000\000\000\000\000\000\004\004\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bH\002(\000\130\001!\192\001\016\006`\016 \004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003 \000x\016\000\197\194\128\001\000\128 \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\bH\002(\000\130\000!\128\001\000\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\bH\002( \130\000!\128\001\000\007`\017 \004\003 \000x\016\000\197\194\128\001\000\128 \000\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \002\024\000\016\000f\001\002\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\018\000\000\128\000\b\000 \000\000\b\000\000\001\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\016\bH\002(\000\130\000!\128\001\000\006`\000!\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\b\000\000\016\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\128\"\128\b \018\028\000\017\000f\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \002\016\000\016\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\192\002\000\000\000\128\000\000\000\b\000\b\128~\002\194@\000>\"\001\004\001\130\139\000\000\b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\000\016\000\000\000\016\000\000\000\000\012\000\000\000\000\000\000\000\000\000\128\000\128\007\224,$\000\003\226 \016@\024(\176\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001 \000\000\000\000\128\002\000\000\000\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000p\016\000\197\194\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000#a\000E\130\141\241#\208\004\015\128\000\001\142\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\128\000\000\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003!\000@\128\004\193\"\208\001\001\160\000\001\004\000\000\000\000\000\000\000\000@\000\000\000@\004\129\016\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\000\000\000\000\000\192\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\016\000\000\000\016\000\000\000\000\012\000\000\000\000\000\000\000\000\000'\225 \197\138\173\2433\208\021\015\228\000\003\142\000\016\000\000\000\000\004\000\000\000\000\000\000\000\000\000\005\161 \128\b \210\016\016\017\000\228\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\016\000\017\000d\016\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\000\001\000\006\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\000\000\000\000\000\128\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\225 \197\138\173\2433\208\021\015\228\000\003\142\002~\018\012X\170\2233=\001P\254@\0008\224\004\128 \128\b \018\016\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\128 \128\b \018\024\000\017\000d\000\002\000\000H\002\b\000\130\001!\000\001\016\006@\000 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000H\002\b\000\130\001!\128\001\016\006@\000 \000\004\128 \128\b \018\016\000\017\000d\000\002\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000@\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000") and start = 13 and action = - ((16, "C\170P\226Ff\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021HFf\000\000\000\000\020XFfC\170\020\182\000-\000[\\(\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\238\006\168\000\218\000\000\003\188\t|\000\000\001\208\003\232\nt\000\000\000\244\004\198\011l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\220\000\000\000\000\000\000\0046T\016\000\000\000\000\000\000\005.\000\000\000\000\000\000\005\022\005\b\000\000\000\000T\016H\254\020X\021\178^\128\020X\\\142P\226\020XR,\000\000\007\168\000\000Dp\007\214\000\000C\146\000\000\027\158\000\000\000\000\004\246\000\000\005.\000\000\000\000\000\000\002J\000\000C\146\000\000\006&v\246]\160d\194\000\000\132l\134\028\000\000LP_\014\000\000X\\\026\206K\200\005.p\026FfC\170\000\000\000\000P\226\020XS\148Dp\007\012v\246\000\000\128\178FfC\170P\226\020X\000\000\000\000\016x\023\022\001N\b\004\000\000\002\138\b\022\000\000\000\000\000\000\000\000\000\000\020X\000\000A\206i\164C\170\000\000\000\000P\206\020XZ\024W\200\000\000\004\002\000\000\000\000\005\242\000\000\000\000H\166\004\002\024\138\003\130\0020\000\000\000\000\003\172\000\000\021\178\006\212\006\160\020X\028\254\020XC\170C\170\000\000M\\M\\\020X\028\254A\248\020X\000\000\000\000\000\000P\226\020X\000\000\000\248\000\000W\200y\188zJ\000\000\b\004\000\000\n\196\000\000\000\000A\214T\016\134h\000\000h\142\134h\000\000h\142h\142\000b\006:\0008\000\000\020\190\000\000\007b\000\000\000\000\b\198\000\000\000\000\000\000h\142\005.\000\000\000\000V\222T\016T\132_\014\000\000\000\000N*\000b\000\000\000\000_\014\007\162T\016\000\000O _\014P\022\000\000\000\000\000\000\011\190\000\000h\142\000\000\001\000\1310\000\000T\016\005\216T\016\000\000\022\\\b\150\005.\000\000\000\000\023\224\000\000\006\208\000\000Y\128\011\230\000\000\b\162h\142\012\182\000\000\012\222\000\000\007\200\000\000\000\000\004\184\000\000\000\000\000\000\021 4W\200P\206\020XW\200\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000M:\027v\000\000\000\000\000\000\001\244&\174t<\000\000\000\000P\206\020XW\200\000\000\000\000{hW\200\136.zJ\000\000\136v\000\000W\200\000\000\000\000X\180\000\000\000\000\000\000\n.\000\000\022\168\000\000\000\000z\214\000\000\136\208{\030\000\000\137\018\t\002\000\000\000\000z\214\000\000\004\024\000\000\000\000DHt\200\000\000\000\000\000\000Bn\023|\019\252\023\174\000\000\000\000\000\000\000\000\004\250\000\000\000\000Z\204\b\254\011F\000\017T\016\002\204\011\148\000\000\000\000\t\156\011F\006\172\000\000i\186P\234M\\\020X\028\254\000-\000\018\0020\000\000\n\240\021\178\021\178\000-\000\018\000\018\021\178\000\000jL\0050Dp\b\004\000\236\137`\000\000T\016ebT\016_ f\002T\016\000\144T\016f\156\000\000\000\000\020d\0008_\192\b\022\0008`\024\000\000j\230\0050\000\000\021\178k\128\000\000\b*\t\014`\184\000\000\000\000\000\000\000\000\000\000\000\000\001B\000\000\000\000\003\144\000\000\007r\028\254\000\000\\\192A\248\000\000\031\138\000\000\000\000\021\178\002\152\000\000\000\000\000\000\000\000[\132\000\000\001\200\000\000UP\001\130\005\"\000\000\0226V\170P\226\020XG,P\226\020X\016x\016x\000\000\000\000\000\000\000\000\001\240\024&B\188\000\000Q\150RJM\\\020X\028\254\b`\021\178\000\000\004*\000\000R\254S\178{\182I~T\016\002\128\000\000P\226\020X\000\000u\016\020Xy\188W\200E\178\000\000P\226\020Xw\\\004~\000\000W\200A\012T\016\003x\006\172\011\196\000\000\000\000\000\000H\166\003\138\003\138\000\000\012\154p\156\000\000P\206\020XW\200\025R\000\000P\226\020X\016x\0226\016x\002\232\023\240\000\000\000\000\016x\012\148\000\000\r\000\000\000\016x\003\224\rX\000\000'\166\000\000\b\196\000\000\000\000\026\022\000\000\017p\023.\000\000\000\000\000\000\000\000\b\020\000\000\000\000\027\014\000\000\028\006\000\000\028\254\000\000\018h\024&\000\000\000\000\000\000Ff\000\000\000\000\000\000\000\000\029\246\000\000\030\238\000\000\031\230\000\000 \222\000\000!\214\000\000\"\206\000\000#\198\000\000$\190\000\000%\182\000\000&\174\000\000'\166\000\000(\158\000\000)\150\000\000*\142\000\000+\134\000\000,~\000\000-v\000\000.n\000\000/f\000\0000^\020XW\200ZJI\146\003\138\014,l\012W\200\000\000\000\000\000\000h\142\000\000\028\018\134\028\000\000\026\"T\016\029\220\r\198\000\000\000\000\000\000\000\000l\012\000\000\000\000\005\242\014\208\000\000B\170\000\000\000\000\135\176\000\000\bB\000\000\000\000K\200\003\138\014\140T\016\b`\000\000\000\000\007\006\005.\000\000T\016\n\146\000\000\000\000\014\244\000\000\000\000\000\000I\190T\016\0118\000\000\000\000\030*\000\000\000\000{\254\000\000\031\"|\138\000\000 \026|\210\000\000!\018\t\250\000\000\000\000\000\000\000\000\"\nW\200#\002p\234p\234\000\000\000\000\000\0001V\000\000\t\188\000\000\000\000\000\000q\140\000\000\000\000\002\138\023\248\000\000\b\226\000\000\000\000]bKl\000\000\000\000\n\180\000\000\000\000\000\000\rh\000\000\000\000\000\000\016x\004\216\024\232\000\000\t\218\000\000\005\208\000\0002N\000\000\012\142\000\000\006\200\000\0003F\000\000\015\138\007\192\000\0004>lt\000\000(\158\000\000\n\"\b\184\000\00056\000\000\r\178\t\176\000\0006.\000\000q\150\n\168\000\0007&\005\180\025\016\000\000\nX\011\160\000\0008\030\000\000\r\200\012\152\000\0009\022\000\000\r\172\r\144\000\000:\014\014\136\000\000;\006\015\128\019`\000\000\000\000\000\000\n\210\000\000\000\000\014`\000\000\000\000\015\156\000\000\011\002\000\000\000\000\000\000\015\028\000\000\015*\000\000\000\000J~\003\138\015\218p\156_\014\000b\000\000\000\000p\156\000\000\000\000\000\000p\156\000\000\015\208\000\000\000\000\000\000\000\000\000\000\000\000;\254W\200\000\000\000\000\016\014\000\000<\246\000\000=\238\000\000#\250\000\000\000\000\n\130\000\000\000\000W\200\000\000\000\000}j\011P\000\000\000\000G,\000\000\014\148\000\000\000\000V\020\000\000\014~\000\000\000\000\001\130\011\254\000\000\000\000\0226\022\028\b\004\000\000B>\000\000!,\023\176\021\220\000\000\000\000\014\002\000\000\000\000\001\238\025\030V\180\000\000\025\030\000\000\tX\000\000\000\000\014\142\000\000\000\000g>\t\004\004H\000\000\000\000\012H\000\000\000\000\014\192\000\000\000\000\000\000\020X\028\254\005\168\000\000\000\000\023&\003\130\0020\003\136\028\254w\228\021\178\001B\028\254xb\015\146\000\000\000\000\003\136\000\000H\232\019\248\021\204\000\000\007X\016\"\000\000\016$\000V_\014\006\196\000\000\016\n\015\170K\200\n|T\016\030\128\020F\r\018\004\248\000\000\031x\016\\\000\000\006\196\000\000\000\000\016\130_\014aX\000\000g\144_\014\016Z_\014m\012a\248\001N\016*\000\000\000\000\000\000\020X\128\252\000\000W\200p\234\000\000\000\000\016\156\000\000\000\000\000\000>\230\016\196y\188?\222h<\000\000\000\000HJ\000\000\005\128\000\000L\136\000\000\020X\000\000\021\178\006\026\000\000\128\178\000\000\020X\028\254\128\178\000\000\025D\023\022\001N\005.\130\144\021\178}\248p\234\000\000\005r\t\168\0020\003\136p\234\132\224\003\130\0020\003\136p\234\132\224\000\000\000\000\003\136p\234\000\000FfC\170W\200\027B\000\000\000\000FfC\170M\\\020X\028\254\128\178\000\000\020\182\000-\000[\015\240T\016\0120\016\190\131P\000\000p\234\000\000H\232\019\248\021\204x\186\023\228\0118~,\nZ\016\b\020Xp\234\000\000\020Xp\234\000\000h\142ff\019\134\002\222\001N\0008N\234\000\000\001N\0008N\234\000\000\025D\005r\n\160\0212\bZ\000\000N\234\000\000\0020\016\016\021\178p\234\134\222\003\130\0020\016 \021\178p\234\134\222\000\000\000\000\tX\000\000O\224\000\000\021\178\131\132N\234\000\000\b\242\000\000H\254\020X\021\178p\234\000\000H\232\019\248\021\204rFB\138\026\222\019\170\002\142\000\000\011vC\146\000\017\000\000\016\176\016b\024\196\020XT\184T\016\0120\000\000W\150\001N\005\204\r\216\000\000\n\024\000\000\016\188\016FT\016O(\000\000\0032\004\212\r\218\000\000\n\236\000\000\016\192\016JK\200\r\028T\016K\182O(\000\000UP\020X\024\196\016\232\011\028\001N\000\000\014\012\024\196T\016\012\208\000b\000\000T\016\n$\n\218\000\000\000\000mf\000\000\000\000\014b\024\196m\228O(\000\000\020XT\016\012\226T\016V\\O(\000\000\014\144\000\000\000\000O(\000\000\000\000W\150\000\000p\234\132\238\019\170\002\142\011v\016\218\016\140\024\196p\234\132\238\000\000\000\000\019\170\002\142\011v\016\230\016\138M\252LZ_\014\017\016M\252h\142\020\184\017\030M\252_\014\017 M\252n\132o\004\000\000\129\140\000\000\000\000p\234\134\236\019\170\002\142\011v\017\022\016\162M\252p\234\134\236\000\000\000\000\000\000ff\000\000\000\000\000\000\000\000\000\000\000\000N\234\000\000\133\128\020XDp\017 v\246\000\000\128\178\133\128\000\000\000\000\1358\020XDp\017*\016\188]\160\135\176\006\196\017l\000\000\000\000o\130rF\020X\000\000~\200\021\204\000\000\000\000\128\178\1358\000\000\000\000\000\000y6D\228I\154\006\196\017v\000\000\000\000\000\000rF\020X\000\000\006\196\017z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\014\168B\138\019\170\002\142\011v\017Xr\182\023\204\020XZ\024j\190\020(\001N\006\196\017Z\011l\000\000\000\000\017\b\000\000\000\000a\152\000\000\007\188\r\230\000\000\r\140\000\000\017`\016\244T\016d\240\017r\011\150\000\000\000\000\017\"\000\000\000\000\020F\0032\014\210\000\000\017~s8\137\172\003\138\017\028T\016\014 \000\000\000\000\017<\000\000\000\000\000\000a\152\000\000\0070\014\246\000\000\r\212\000\000\017\168\0176K\200\000\000\017\180s\186\137\248\003\138\017RT\016\015\024\000\000\000\000\017d\000\000\000\000\000\000\020X\000\000a\152\000\000\020z\020X\023\204\023\204u\168Ff\020X\128\252W\200\021\162\000\000\012V\001N\000\000\014\220\023\204T\016\014\186\b\004\000\000\020XW\200r\182\023\204\rh\023\204\000\000D\142Et\000\000bR\000\000\000\000b\238\000\000\000\000c\138\000\000\014\238\023\204d&\128\252W\200\021\162\000\000\000\"\000\000\000\000M\252\r\026\000\000\000\000d.\017\186\000\000a\152\000\000\023\204d.a\152\000\000\020XT\016a\152\000\000\015\136\000\000\000\000a\152\000\000\000\000j\190\000\000\129\192M\252\017r\023\204\130\\r\182\000\000p\234\133\142\019\170\002\142\011v\017\210r\182p\234\133\142\000\000\000\000\000\000\135\248P\206\000\000\000\000\000\000\000\000\000\000\000\000\132\022p\234\000\000\133\128\000\000\000\000\000\000\000\000p\234\135\248\000\000\018\014\000\000\000\000\132\022\018\020\000\000p\234\135\248\000\000\000\000\015\222\000\000\000\000i4\0032\000\000\000\000DH\000\000T\016\015\n\000\000j\190\015\240\000\000\000\000\000\000\015\156\000\000\000\000\000\000M\\\020X\028\254\006\178\000\000Z8\000\000\007p\000\000\000*\000\000\000\000\0184\000\000\018\\y\188\000\000@\214\018@\000\000\000\000\0182\026R\028B\021\204v0\023\228\020X\000\000\128\178\000\000\000\000\000\000\000\000\000\000\000\000\000\000v8\023\228\020X\000\000\015\190v\246\000\000\128\178\000\000\0184\026R\028B\128\178\000\000\018H\000\000\000\238\014\140\020X`\226\000\000\000\000\028\190y\242\000\000\000\000\017\214\000\000\018.T\016\000\000\015\170\012\166\000b\000\000\000\000T\016\004R\006B\000\000T\016\012\018\006\196\018\\\000\000\000\000\127\"\000\000\000\000]\160\000\000\128\178\000\000\018V\026R\029:N\234\000\000\000\000\000\000\000\000\015\214\127\188]\160\000\000\128\178\000\000\018`\026R\029:N\234\000\000\016\026\000\000\000\000\b\n\000\000p\234\000\000\018t\000\000\000\000\017\230\000\000\017\236\000\000\017\252\000\000\000\000\\\142\018\000\000\000\000\000%\182\\(\018\158\000\000\000\000\000\000\014z\011D]\232\018\164\000\000\000\000\000\000\000\000\000\000\000\000\018\022\000\000\023\228\000\000\018\030\000\000T\016\000\000\t\b\000\000\000\000\018 \000\000\000\000\0008\000\000\003\210\000\000\000\000\000\000\001\214\000\000\016\030\000\000\0180\000\000W\200\022\168\000\000\000\000\012<\018H\000\000\000\000\018B\r$G,\005.\128:\000\000\000\000\000\000\000\000\000\000YL\000\000\000\000\018\234\000\000\138<\000\000\016p\018\236\000\000\018\238\000\000G\224G\224[\190[\190\000\000\000\000p\234[\190\000\000\000\000\000\000p\234[\190\018Z\000\000\018f\000\000"), (16, "\t)\t)\000\006\001\002\001\190\t)\002\186\002\190\t)\002\234\002\130\t)\003\145\t)\018\158\002\246\t)\023\158\t)\t)\t)\025F\t)\t)\t)\001\210\004A\004A\004F\002\250\t)\003>\003B\t\242\t)\001\206\t)\023\162\003F\000\238\002\254\025J\t)\t)\003\214\003\218\t)\003\222\0032\003\234\003\242\006\214\007\018\t)\t)\002\178\001\206\006\242\003:\t)\t)\t)\b\026\b\030\b*\b>\001*\005v\t)\t)\t)\t)\t)\t)\t)\t)\t)\b\178\000\238\t)\015\154\t)\t)\003\145\b\190\b\214\t*\005\130\005\134\t)\t)\t)\r\190\t)\t)\t)\t)\002j\002\154\r\238\t)\006\178\t)\t)\0035\t)\t)\t)\t)\t)\t)\005\138\b2\t)\t)\t)\bJ\004r\t>\0035\t)\t)\t)\t)\012\245\012\245\023\166\n\206\004\154\012\245\n\218\012\245\012\245\000\238\012\245\012\245\012\245\012\245\004A\012\245\012\245\001f\012\245\012\245\012\245\003i\012\245\012\245\012\245\012\245\004A\012\245\015\250\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\007\190\007\030\007R\012\245\004\226\012\245\012\245\012\245\012\245\012\245\004A\012\245\012\245\004A\012\245\003\238\012\245\012\245\012\245\000\238\007\194\012\245\012\245\012\245\012\245\012\245\012\245\012\245\000\238\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\004A\012\245\012\245\007\138\012\245\012\245\001j\004A\007.\004A\012\245\012\245\012\245\012\245\012\245\004A\012\245\012\245\012\245\012\245\012\245\000\238\012\245\012\245\0076\012\245\012\245\000\238\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\012\245\b\"\004A\012\245\012\245\012\245\012\245\001\181\001\181\001\181\001f\015Z\001\181\003i\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\015\006\001\181\007\222\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\003\134\003\138\001\181\000\238\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\006\246\001\181\001\181\001\181\b\022\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\002f\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\027\187\001\181\001\181\018\142\007\250\007\030\007n\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\014\202\bb\001\181\005\186\001\181\001\181\007\254\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\182\001\181\001\181\001\181\001\181\001\181\n]\n]\002\225\007\138\r\025\n]\003\149\n]\n]\000\238\n]\n]\n]\n]\001\186\n]\n]\r\025\n]\n]\n]\000\238\n]\n]\n]\n]\002j\n]\000\n\n]\n]\n]\n]\n]\n]\n]\n]\024\222\007\030\b\174\n]\004A\n]\n]\n]\n]\n]\000\238\n]\n]\012\"\n]\003\018\n]\n]\n]\002\225\024\226\n]\n]\n]\n]\n]\n]\n]\004A\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\003\149\n]\n]\007\138\n]\n]\004A\004A\007\030\004A\n]\n]\n]\n]\n]\004\001\n]\n]\n]\n]\tV\000\238\t\134\n]\005\241\n]\n]\007\202\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\n]\003\146\n]\n]\n]\n]\n]\003\173\003\173\001r\007\138\006\242\003\173\t\022\003\173\003\173\000\238\003\173\003\173\003\173\003\173\000\238\003\173\003\173\006\137\003\173\003\173\003\173\000\238\003\173\003\173\003\173\003\173\001\130\003\173\006Z\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\006\137\007\030\004\001\003\173\004B\003\173\003\173\003\173\003\173\003\173\015J\003\173\003\173\006^\003\173\t\005\003\173\003\173\003\173\005\241\b\146\003\173\003\173\003\173\003\173\003\173\003\173\003\173\015R\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\b\213\tN\t~\007\138\003\173\003\173\003\150\003^\b\230\027\171\003\173\003\173\003\173\003\173\003\173\004R\003\173\003\173\003\173\003\173\tV\000\238\t\134\003\173\b\"\003\173\003\173\003b\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\000\238\003\173\003\173\003\173\003\173\003\173\003\161\003\161\018\250\b\234\t\006\003\161\005R\003\161\003\161\t\005\003\161\003\161\003\161\003\161\001\146\003\161\003\161\006\154\003\161\003\161\003\161\002N\003\161\003\161\003\161\003\161\019\002\003\161\001\198\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\006\237\b\213\004A\003\161\002R\003\161\003\161\003\161\003\161\003\161\b\029\003\161\003\161\001\218\003\161\007\"\003\161\003\161\003\161\006\237\004A\003\161\003\161\003\161\003\161\003\161\003\161\003\161\004A\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\238\tN\t~\001\234\003\161\003\161\004A\004A\007\030\007^\003\161\003\161\003\161\003\161\003\161\001\222\003\161\003\161\003\161\003\161\tV\004A\t\134\003\161\004r\003\161\003\161\016v\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\006\237\003\161\003\161\003\161\003\161\003\161\t\217\t\217\018\206\007\138\b&\t\217\006\158\t\217\t\217\001\238\t\217\t\217\t\217\t\217\000\238\t\217\t\217\006\149\t\217\t\217\t\217\000\238\t\217\t\217\t\217\t\217\004A\t\217\007\222\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\006\149\007\030\018\214\t\217\000\238\t\217\t\217\t\217\t\217\t\217\005\217\t\217\t\217\001\206\t\217\012\130\t\217\t\217\t\217\0152\016\146\t\217\t\217\t\217\t\217\t\217\t\217\t\217\000\238\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\026N\t\217\t\217\007\138\t\217\t\217\r\002\003j\003\018\004A\t\217\t\217\t\217\t\217\t\217\002v\t\217\t\217\t\217\t\217\t\217\000\238\t\217\t\217\004B\t\217\t\217\003n\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\000\238\004A\t\217\t\217\t\217\t\217\t\209\t\209\004\242\001f\003i\t\209\007\005\t\209\t\209\025.\t\209\t\209\t\209\t\209\003\158\t\209\t\209\003\162\t\209\t\209\t\209\003\137\t\209\t\209\t\209\t\209\b\241\t\209\004^\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\007\222\026R\015\162\t\209\001\206\t\209\t\209\t\209\t\209\t\209\005\209\t\209\t\209\000\238\t\209\012\154\t\209\t\209\t\209\022\130\011Z\t\209\t\209\t\209\t\209\t\209\t\209\t\209\000\238\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\006\210\t\209\t\209\022\138\t\209\t\209\002\214\004V\007\030\b\241\t\209\t\209\t\209\t\209\t\209\002\142\t\209\t\209\t\209\t\209\t\209\0252\t\209\t\209\b\021\t\209\t\209\025>\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\t\209\012\185\b\241\t\209\t\209\t\209\t\209\t\225\t\225\021\246\007\138\007\210\t\225\011b\t\225\t\225\006\242\t\225\t\225\t\225\t\225\012\185\t\225\t\225\012\189\t\225\t\225\t\225\000\238\t\225\t\225\t\225\t\225\005F\t\225\004\174\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\012\189\007\030\021\254\t\225\002\190\t\225\t\225\t\225\t\225\t\225\005\209\t\225\t\225\003\022\t\225\012\174\t\225\t\225\t\225\015\138\026\226\t\225\t\225\t\225\t\225\t\225\t\225\t\225\0112\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\017\242\t\225\t\225\007\138\t\225\t\225\003\n\001\206\0116\005J\t\225\t\225\t\225\t\225\t\225\003\026\t\225\t\225\t\225\t\225\t\225\000\238\t\225\t\225\004B\t\225\t\225\002&\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\190\004\214\t\225\t\225\t\225\t\225\t\193\t\193\000\238\0022\007\222\t\193\t\146\t\193\t\193\005\002\t\193\t\193\t\193\t\193\004V\t\193\t\193\000\238\t\193\t\193\t\193\012.\t\193\t\193\t\193\t\193\t\150\t\193\007\154\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\006F\t\001\n\162\t\193\0122\t\193\t\193\t\193\t\193\t\193\011N\t\193\t\193\007\158\t\193\012\206\t\193\t\193\t\193\004b\014\254\t\193\t\193\t\193\t\193\t\193\t\193\t\193\b\134\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\006\242\t\193\t\193\014\226\t\193\t\193\006\170\006\194\001\002\001\190\t\193\t\193\t\193\t\193\t\193\001\222\t\193\t\193\t\193\t\193\t\193\006U\t\193\t\193\000\238\t\193\t\193\005.\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\t\193\006U\t\001\t\193\t\193\t\193\t\193\t\201\t\201\003\134\003\138\006\242\t\201\012\006\t\201\t\201\027\139\t\201\t\201\t\201\t\201\018B\t\201\t\201\016\218\t\201\t\201\t\201\012z\t\201\t\201\t\201\t\201\001v\t\201\012\n\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\011\202\006\202\016F\t\201\012~\t\201\t\201\t\201\t\201\t\201\0186\t\201\t\201\014\230\t\201\012\226\t\201\t\201\t\201\018\218\t\146\t\201\t\201\t\201\t\201\t\201\t\201\t\201\018B\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\012\202\t\201\t\201\b\193\t\201\t\201\006\026\012.\001\002\001\190\t\201\t\201\t\201\t\201\t\201\003\022\t\201\t\201\t\201\t\201\t\201\006]\t\201\t\201\005\221\t\201\t\201\r\014\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\t\201\006]\000\238\t\201\t\201\t\201\t\201\n\001\n\001\003\134\017\234\011Z\n\001\012J\n\001\n\001\017\146\n\001\n\001\n\001\n\001\004\014\n\001\n\001\017\254\n\001\n\001\n\001\012z\n\001\n\001\n\001\n\001\001\134\n\001\012N\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\004\018\019\006\b\193\n\001\rf\n\001\n\001\n\001\n\001\n\001\b\189\n\001\n\001\000\238\n\001\012\246\n\001\n\001\n\001\r\134\0142\n\001\n\001\n\001\n\001\n\001\n\001\n\001\004A\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\015\182\n\001\n\001\011j\n\001\n\001\b!\014N\007\158\000\238\n\001\n\001\n\001\n\001\n\001\002\142\n\001\n\001\n\001\n\001\n\001\006e\n\001\n\001\014:\n\001\n\001\014R\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\n\001\006e\000\238\n\001\n\001\n\001\n\001\t\241\t\241\027F\001\222\006\174\t\241\b\189\t\241\t\241\000\238\t\241\t\241\t\241\t\241\006\190\t\241\t\241\r\138\t\241\t\241\t\241\006\254\t\241\t\241\t\241\t\241\001\150\t\241\002\253\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\004\210\t\002\011\142\t\241\018\150\t\241\t\241\t\241\t\241\t\241\014\134\t\241\t\241\019>\t\241\r\018\t\241\t\241\t\241\011\018\005&\t\241\t\241\t\241\t\241\t\241\t\241\t\241\021\214\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\b\217\t\241\t\241\n\206\t\241\t\241\n\218\015\014\002\190\022\030\t\241\t\241\t\241\t\241\t\241\018\190\t\241\t\241\t\241\t\241\t\241\004A\t\241\t\241\n\206\t\241\t\241\n\218\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\000\238\012\146\t\241\t\241\t\241\t\241\t\233\t\233\001\002\001\190\014\138\t\233\004\214\t\233\t\233\000\238\t\233\t\233\t\233\t\233\001\206\t\233\t\233\012\150\t\233\t\233\t\233\t\"\t\233\t\233\t\233\t\233\b\237\t\233\000\238\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\0056\b\217\017^\t\233\015\018\t\233\t\233\t\233\t\233\t\233\tj\t\233\t\233\019V\t\233\r&\t\233\t\233\t\233\002\154\005>\t\233\t\233\t\233\t\233\t\233\t\233\t\233\023\174\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\003\022\t\233\t\233\015\198\t\233\t\233\023\022\003}\023\178\0266\t\233\t\233\t\233\t\233\t\233\011Z\t\233\t\233\t\233\t\233\t\233\000\238\t\233\t\233\tr\t\233\t\233\012Z\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\001\002\001\190\t\233\t\233\t\233\t\233\t\249\t\249\022\002\012^\019\158\t\249\004\214\t\249\t\249\019^\t\249\t\249\t\249\t\249\012Z\t\249\t\249\012\006\t\249\t\249\t\249\t\130\t\249\t\249\t\249\t\249\004\214\t\249\012J\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\r6\022\142\012\222\t\249\019\026\t\249\t\249\t\249\t\249\t\249\005\213\t\249\t\249\r\"\t\249\r:\t\249\t\249\t\249\023J\014\190\t\249\t\249\t\249\t\249\t\249\t\249\t\249\018\254\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\018\210\t\249\t\249\014\194\t\249\t\249\b\025\021\250\005\225\b%\t\249\t\249\t\249\t\249\t\249\r!\t\249\t\249\t\249\t\249\t\249\n\186\t\249\t\249\n\162\t\249\t\249\012\146\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\n\242\014v\t\249\t\249\t\249\t\249\nI\nI\rr\014\238\019\178\nI\014b\nI\nI\000\238\nI\nI\nI\nI\019J\nI\nI\014z\nI\nI\nI\025\250\nI\nI\nI\nI\014\242\nI\015\026\nI\nI\nI\nI\nI\nI\nI\nI\007n\007\241\022^\nI\004B\nI\nI\nI\nI\nI\023.\nI\nI\015\030\nI\rF\nI\nI\nI\011\022\019\130\nI\nI\nI\nI\nI\nI\nI\022>\nI\nI\nI\nI\nI\nI\nI\nI\nI\nI\nI\000\238\nI\nI\007n\nI\nI\022\134\004\213\024\246\b\021\nI\nI\nI\nI\nI\027B\nI\nI\nI\nI\nI\019\182\nI\nI\011F\nI\nI\r-\nI\nI\nI\nI\nI\nI\nI\nI\nI\nI\nI\nI\nI\023\"\014f\nI\nI\nI\nI\003\157\003\157\000\238\023\130\023\238\003\157\019^\003\157\003\157\000\238\003\157\003\157\003\157\003\157\025\018\003\157\003\157\007n\003\157\003\157\003\157\011v\003\157\003\157\003\157\003\157\007n\003\157\012\170\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\r~\001\206\022\190\003\157\0262\003\157\003\157\003\157\003\157\003\157\024\206\003\157\003\157\001\206\003\157\r\150\003\157\003\157\003\157\025\002\r\158\003\157\003\157\003\157\003\157\003\157\003\157\003\157\r\178\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\026\214\tN\t~\025\198\003\157\003\157\r\226\014\014\015f\002\006\003\157\003\157\003\157\003\157\003\157\026\170\003\157\003\157\003\157\003\157\tV\023\242\t\134\003\157\015\142\003\157\003\157\003\254\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\015\170\003\157\003\157\003\157\003\157\003\157\001\237\001\237\026B\025\022\001\222\001\237\015\174\002\190\001\237\015\214\002\130\001\237\tf\001\237\004Y\002\246\001\237\024\210\001\237\001\237\001\237\015\234\001\237\001\237\001\237\001\210\025\006\tn\016\002\002\250\001\237\001\237\001\237\001\237\001\237\tv\001\237\016\022\016B\016V\002\254\017V\001\237\001\237\001\237\001\237\001\237\026\218\0032\001\190\017b\001\237\006\022\001\237\001\237\002\178\002\226\018\006\003:\001\237\001\237\001\237\b\026\b\030\b*\018\030\012f\005v\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\018\166\tN\t~\018\170\001\237\001\237\018\226\018\230\019\014\019\018\005\130\005\134\001\237\001\237\001\237\019:\001\237\001\237\001\237\001\237\012n\019\230\012\190\001\237\019\234\001\237\001\237\020\014\001\237\001\237\001\237\001\237\001\237\001\237\005\138\b2\001\237\001\237\001\237\bJ\004r\020\018\020\"\001\237\001\237\001\237\001\237\n1\n1\0202\020>\020r\n1\020v\002\190\n1\020\194\002\130\n1\n1\n1\020\234\002\246\n1\020\238\n1\n1\n1\020\254\n1\n1\n1\001\210\021N\n1\021n\002\250\n1\n1\n1\n1\n1\n1\n1\021\174\021\210\021\226\002\254\022\n\n1\n1\n1\n1\n1\022\014\0032\001\190\022\026\n1\022*\n1\n1\002\178\022F\022V\003:\n1\n1\n1\b\026\b\030\b*\022j\n1\005v\n1\n1\n1\n1\n1\n1\n1\n1\n1\022\150\n1\n1\022\154\n1\n1\022\166\022\182\022\202\023\190\005\130\005\134\n1\n1\n1\024\022\n1\n1\n1\n1\n1\024>\n1\n1\024\166\n1\n1\024\182\n1\n1\n1\n1\n1\n1\005\138\b2\n1\n1\n1\bJ\004r\025R\025Z\n1\n1\n1\n1\n-\n-\025j\025v\025\218\n-\025\238\002\190\n-\026\030\002\130\n-\n-\n-\026&\002\246\n-\026b\n-\n-\n-\026\138\n-\n-\n-\001\210\026\194\n-\026\242\002\250\n-\n-\n-\n-\n-\n-\n-\026\254\027\006\027\015\002\254\027\031\n-\n-\n-\n-\n-\0272\0032\001\190\027N\n-\027k\n-\n-\002\178\027{\027\151\003:\n-\n-\n-\b\026\b\030\b*\027\203\n-\005v\n-\n-\n-\n-\n-\n-\n-\n-\n-\027\231\n-\n-\027\242\n-\n-\028'\028;\028C\028\127\005\130\005\134\n-\n-\n-\028\135\n-\n-\n-\n-\n-\000\000\n-\n-\000\000\n-\n-\000\000\n-\n-\n-\n-\n-\n-\005\138\b2\n-\n-\n-\bJ\004r\000\000\000\000\n-\n-\n-\n-\0029\0029\000\000\000\000\000\000\0029\000\000\002\190\0029\000\000\002\130\0029\tf\0029\000\000\002\246\0029\000\000\0029\0029\0029\000\000\0029\0029\0029\001\210\002\225\tn\000\000\002\250\0029\0029\0029\0029\0029\tv\0029\000\000\000\000\000\000\002\254\004A\0029\0029\0029\0029\0029\000\000\0032\001\190\000\000\0029\000\n\0029\0029\002\178\000\000\000\000\003:\0029\0029\0029\b\026\b\030\b*\000\000\012f\005v\0029\0029\0029\0029\0029\0029\0029\0029\0029\000\000\004\173\0029\002\225\0029\0029\004A\006\130\002\190\004A\005\130\005\134\0029\0029\0029\000\000\0029\0029\0029\0029\000\000\000\238\004A\0029\004\173\0029\0029\004A\0029\0029\0029\0029\0029\0029\005\138\b2\0029\0029\0029\bJ\004r\000\000\004A\0029\0029\0029\0029\004A\007\030\004A\003\n\004A\004A\004A\004A\004A\004A\004A\017\186\004A\000\238\004A\004A\000\000\004A\004A\004A\016\134\004A\004A\004A\004A\004A\004A\004A\004A\004A\000\000\004A\004A\000\000\000\000\004A\004A\000\238\004A\004A\004A\004A\004A\007\138\004A\004A\004A\004A\004A\004A\004A\004A\000\238\004A\004A\004A\004A\004A\004A\004A\004A\000\238\004A\004A\004A\004A\004A\004A\004A\004A\b\189\004N\004A\000\000\000\000\004A\004A\004A\000\238\004A\000\n\000\000\004A\004A\004A\004A\004A\004A\004A\004A\004A\000\000\021\198\004A\004A\002\225\002\225\007f\004A\004B\006\233\000\000\004A\004A\000\000\007n\016\138\0226\002\225\000\238\004A\004A\004A\007r\000\000\004A\004A\004A\004A\006\233\000\161\004A\000\161\006\233\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\000\161\022\234\000\161\000\161\000\000\000\161\000\161\000\000\000\000\000\161\000\161\000\000\000\161\000\161\000\161\000\161\000\000\000\161\004R\000\161\000\161\b\189\000\000\000\161\000\161\005\141\000\161\000\161\000\161\000\238\000\161\b\241\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\b\138\000\161\000\161\000\000\000\000\000\161\000\161\002\006\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\002\n\006\233\000\161\015\130\t\029\000\161\002\130\000\161\001\210\000\161\005\141\002\190\000\000\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\000\000\000\000\000\161\003\154\017\238\t\029\005\141\000\222\000\000\007\002\001\222\000\161\000\000\002\226\000\000\014\150\002\178\000\161\000\161\000\161\000\161\000\000\015\134\000\161\000\161\000\161\000\161\002)\002)\004Y\000\000\003\n\002)\000\000\002\190\002)\015\146\002\130\002)\001b\002)\000\000\002\246\002)\007\006\002)\002)\002)\000\000\002)\002)\002)\001\210\001z\000\000\001\138\002\250\002)\002)\002)\002)\002)\005\134\002)\000\000\000\000\000\000\002\254\b\169\002)\002)\002)\002)\002)\004Y\0032\b.\000\000\002)\000\000\002)\002)\002\178\000\000\006\"\003:\002)\002)\002)\b\026\b\030\b*\tN\t~\005v\002)\002)\002)\002)\002)\002)\002)\002)\002)\006&\tN\t~\b\169\002)\002)\000\000\tV\000\000\t\134\005\130\005\134\002)\002)\002)\000\000\002)\002)\002)\002)\tV\000\000\t\134\002)\b\169\002)\002)\000\000\002)\002)\002)\002)\002)\002)\005\138\b2\002)\002)\002)\bJ\004r\000\238\002\225\002)\002)\002)\002)\002E\002E\002\225\002\225\000\000\002E\000\000\000\000\002E\000\000\b\169\002E\000\000\002E\004\254\000\000\002E\b\169\002E\002E\002E\000\n\002E\002E\002E\000\000\027\215\000\000\000\000\000\n\002E\002E\002E\002E\002E\000\000\002E\002\225\006*\004\169\000\000\005\234\002E\002E\002E\002E\002E\000\000\0066\002\225\000\000\002E\006B\002E\002E\000\000\000\000\002\225\006~\002E\002E\002E\004\169\000\000\006\213\t\025\000\000\000\000\002E\002E\002E\002E\002E\002E\002E\002E\002E\000\000\tN\t~\000\000\002E\002E\006\134\014\174\000\000\002\190\006\213\t\025\002E\002E\002E\000\000\002E\002E\002E\002E\tV\002\190\t\134\002E\002\130\002E\002E\001\210\002E\002E\002E\002E\002E\002E\b\165\000\000\002E\002E\002E\000\000\021\182\000\000\000\000\002E\002E\002E\002E\002A\002A\000\000\022\242\003\n\002A\022\246\003\022\002A\000\000\002\178\002A\000\000\002A\000\000\017\134\002A\023&\002A\002A\002A\tZ\002A\002A\002A\012&\b\165\000\000\000\000\015\146\002A\002A\002A\002A\002A\rj\002A\rv\000\000\012B\0236\012R\002A\002A\002A\002A\002A\b\165\bf\001\190\001*\002A\000\000\002A\002A\005\134\002\225\002\225\014V\002A\002A\002A\014j\014~\014\142\000\000\000\000\000\000\002A\002A\002A\002A\002A\002A\002A\002A\002A\000\000\tN\t~\b\165\002A\002A\000\n\004\254\000\000\001\206\b\165\000\000\002A\002A\002A\000\000\002A\002A\002A\002A\tV\000\000\t\134\002A\000\000\002A\002A\001\210\002A\002A\002A\002A\002A\002A\002\225\000\000\002A\002A\002A\000\000\018\174\000\000\000\000\002A\002A\002A\002A\002-\002-\000\000\000\000\002\154\002-\0196\003\022\002-\000\000\002\178\002-\000\000\002-\000\000\000\000\002-\019N\002-\002-\002-\012r\002-\002-\002-\002\225\002\225\016\178\000\000\000\000\002-\002-\002-\002-\002-\012\138\002-\012\162\000\000\000\000\002\225\r\006\002-\002-\002-\002-\002-\000\000\bf\014\206\000\000\002-\000\n\002-\002-\r\026\000\000\r.\014V\002-\002-\002-\014j\014~\014\142\000\000\000\000\000\000\002-\002-\002-\002-\002-\002-\002-\002-\002-\000\000\tN\t~\002\225\002-\002-\000\000\000\000\000\000\000\000\000\238\000\000\002-\002-\002-\000\000\002-\002-\002-\002-\tV\000\000\t\134\002-\000\000\002-\002-\000\000\002-\002-\002-\002-\002-\002-\000\000\000\000\002-\002-\002-\000\000\t:\000\000\000\000\002-\002-\002-\002-\002=\002=\000\000\000\000\000\000\002=\012}\006*\002=\000\000\005\234\002=\000\000\002=\000\000\000\000\002=\0066\002=\002=\002=\006B\002=\002=\002=\012}\012}\000\000\000\000\012}\002=\002=\002=\002=\002=\000\000\002=\b\021\000\000\000\000\b\021\000\000\002=\002=\002=\002=\002=\000\000\000\000\000\000\000\000\002=\000\000\002=\002=\000\000\000\000\000\000\022>\002=\002=\002=\000\000\000\000\000\000\000\000\000\000\000\238\002=\002=\002=\002=\002=\002=\002=\002=\002=\000\000\b\021\002=\000\000\002=\002=\000\000\000\000\000\000\000\000\000\000\000\000\002=\002=\002=\b\021\002=\002=\002=\002=\012}\000\000\004\253\002=\000\000\002=\002=\002\225\t\158\002=\002=\002=\002=\002=\004\253\n\230\002=\002=\002=\000\000\000\000\b\021\000\000\002=\002=\002=\002=\t%\t%\000\000\000\000\000\000\t%\000\000\000\000\t%\000\n\000\000\t%\000\000\t%\000\000\000\000\t\202\004\253\t%\t\238\t%\b\021\t%\t%\t%\002\225\000\000\000\000\000\000\017\"\n\002\n\026\n\"\n\n\n*\000\000\t%\002\225\002\225\000\000\000\000\000\000\t%\t%\n2\n:\t%\004\253\007\245\000\000\004\253\t%\000\000\nB\t%\000\000\000\000\000\000\000\000\t%\t%\000\238\000\000\000\000\000\000\000\000\000\000\002\246\t%\t%\t\210\n\018\nJ\nR\nb\t%\t%\002\166\012\193\t%\000\000\t%\nj\000\000\003Z\000\000\000\000\000\238\000\000\t%\t%\nr\000\000\t%\t%\t%\t%\003f\012\193\000\000\t%\000\000\t%\t%\002B\n\146\t%\n\154\nZ\t%\t%\000\000\000\000\t%\nz\t%\000\000\002F\000\000\005v\t%\t%\n\130\n\138\002q\002q\000\000\000\000\000\000\002q\012\133\006*\002q\000\000\005\234\002q\000\000\002q\000\000\005\130\002q\0066\002q\002q\002q\006B\002q\002q\002q\012\133\012\133\000\000\000\000\012\133\002q\002q\002q\002q\002q\000\000\002q\015\130\000\000\005\138\002\130\000\000\002q\002q\002q\002q\002q\000\000\000\000\000\000\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\002q\002q\002q\000\000\000\000\000\000\000\000\000\000\000\238\002q\002q\t\210\002q\002q\002q\002q\002q\002q\000\000\015\134\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\000\000\000\000\002q\002q\002q\015\146\002q\002q\002q\002q\012\133\000\000\001\206\002q\000\000\002q\002q\000\000\002q\002q\002q\002q\002q\002q\026\014\000\000\002q\002q\002q\000\000\000\000\005\134\000\000\002q\002q\002q\002q\002Y\002Y\000\000\000\000\000\000\002Y\000\000\002\190\002Y\000\000\000\000\002Y\000\000\002Y\003\170\000\000\002Y\002\154\002Y\002Y\002Y\025~\002Y\002Y\002Y\001\210\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\002Y\015\130\000\000\000\000\002\130\000\000\002Y\002Y\002Y\002Y\002Y\004\154\003\202\000\000\004\217\002Y\000\000\002Y\002Y\002\178\000\000\000\000\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\t\210\002Y\002Y\002Y\002Y\002Y\002Y\000\000\015\134\002Y\000\000\002Y\002Y\006\234\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\015\146\002Y\002Y\002Y\002Y\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\002Y\002Y\002Y\002Y\002Y\002Y\012\129\000\000\002Y\002Y\002Y\000\000\000\000\005\134\000\000\002Y\002Y\002Y\002Y\002e\002e\000\000\000\000\000\000\002e\012\129\012\129\002e\000\000\012\129\002e\000\000\002e\000\000\000\000\t\202\000\000\002e\002e\002e\021\026\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\n\n\002e\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\002e\002e\000\000\000\238\000\000\000\000\002e\000\000\002e\002e\000\000\000\000\000\000\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\t\210\n\018\002e\002e\002e\002e\002e\000\000\012\129\002e\000\000\002e\002e\000\000\000\000\000\000\000\000\000\238\b\t\002e\002e\002e\b\t\002e\002e\002e\002e\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\002e\002e\002e\002e\002e\002e\000\000\000\000\002e\002e\002e\000\000\011\154\000\000\000\000\002e\002e\002e\002e\002u\002u\000\000\000\000\000\000\002u\b\t\011\162\002u\000\000\011\174\002u\000\000\002u\000\000\000\000\002u\011\186\002u\002u\002u\011\198\002u\002u\002u\000\000\000\000\b\t\000\000\000\000\002u\002u\002u\002u\002u\000\000\002u\000\000\000\000\000\000\000\000\000\000\002u\002u\002u\002u\002u\000\000\000\000\000\000\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\002u\002u\002u\000\000\000\000\004\254\000\000\000\000\000\000\002u\002u\t\210\002u\002u\002u\002u\002u\002u\000\000\007\234\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\000\238\b\005\002u\002u\002u\b\005\002u\002u\002u\002u\000\000\007\238\000\000\002u\000\000\002u\002u\000\000\002u\002u\002u\002u\002u\002u\000\000\000\000\002u\002u\002u\000\000\007\165\000\000\000\000\002u\002u\002u\002u\002U\002U\007\222\000\000\000\000\002U\b\005\007\165\002U\000\000\005\234\002U\000\000\002U\000\000\000\238\002U\007\165\002U\002U\002U\007\165\002U\002U\002U\000\000\000\000\b\005\000\000\000\000\002U\002U\002U\002U\002U\000\000\002U\000\000\000\000\006\253\000\000\000\000\002U\002U\002U\002U\002U\000\000\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\006\253\002U\002U\002U\006\253\007\242\004\254\000\000\000\000\000\000\002U\002U\t\210\002U\002U\002U\002U\002U\002U\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\000\000\007\189\000\000\002U\002U\002U\000\000\002U\002U\002U\002U\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\002U\002U\002U\002U\002U\002U\000\000\000\000\002U\002U\002U\000\000\007\189\000\000\000\000\002U\002U\002U\002U\002a\002a\000\000\000\000\000\000\002a\005f\007\189\002a\000\000\005\234\002a\000\000\002a\000\000\000\000\t\202\007\189\002a\002a\002a\007\189\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\n\n\002a\000\000\002a\000\000\000\000\006\237\000\000\000\000\002a\002a\002a\002a\002a\000\000\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\006\237\002a\002a\002a\006\237\000\000\000\000\000\000\000\000\000\000\002a\002a\t\210\n\018\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\000\238\000\000\002a\002a\002a\000\000\002a\002a\002a\002a\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\002a\002a\002a\002a\002a\002a\000\000\000\000\002a\002a\002a\000\000\007\217\000\000\000\000\002a\002a\002a\002a\002]\002]\000\000\000\000\000\000\002]\b&\006*\002]\000\000\005\234\002]\000\000\002]\000\000\000\000\t\202\007\217\002]\002]\002]\007\217\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\n\n\002]\000\000\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\002]\002]\000\000\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\000\000\000\000\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\t\210\n\018\002]\002]\002]\002]\002]\000\000\000\000\002]\000\000\002]\002]\000\000\000\000\000\000\000\000\007\209\000\000\002]\002]\002]\000\000\002]\002]\002]\002]\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\002]\002]\002]\002]\002]\002]\000\000\000\000\002]\002]\002]\000\000\007\209\000\000\000\000\002]\002]\002]\002]\002\133\002\133\000\000\000\000\000\000\002\133\000\000\011\222\002\133\000\000\007\209\002\133\000\000\002\133\000\000\000\000\t\202\007\209\002\133\002\133\002\133\007\209\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\n2\n:\002\133\000\000\000\000\000\000\000\000\002\133\000\000\nB\002\133\000\000\000\000\000\000\000\000\002\133\002\133\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\133\002\133\t\210\n\018\nJ\nR\nb\002\133\002\133\000\000\000\000\002\133\000\000\002\133\nj\000\000\000\000\000\000\000\000\000\238\000\000\002\133\002\133\nr\000\000\002\133\002\133\002\133\002\133\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\002\133\002\133\002\133\nZ\002\133\002\133\000\000\000\000\002\133\nz\002\133\000\000\007\161\000\000\000\000\002\133\002\133\n\130\n\138\002m\002m\000\000\000\000\000\000\002m\000\000\007\161\002m\000\000\005\234\002m\000\000\002m\000\000\000\000\t\202\007\161\002m\002m\002m\007\161\002m\002m\002m\000\000\000\000\000\000\000\000\000\000\002m\002m\002m\n\n\002m\000\000\002m\000\000\000\000\000\000\000\000\000\000\002m\002m\002m\002m\002m\000\000\000\000\000\000\000\000\002m\000\000\002m\002m\000\000\000\000\000\000\000\000\002m\002m\002m\000\000\000\000\000\000\000\000\000\000\000\000\002m\002m\t\210\n\018\002m\002m\002m\002m\002m\000\000\000\000\002m\000\000\002m\002m\000\000\000\000\000\000\000\000\000\238\000\000\002m\002m\002m\000\000\002m\002m\002m\002m\000\000\000\000\000\000\002m\000\000\002m\002m\000\000\002m\002m\002m\002m\002m\002m\000\000\000\000\002m\002m\002m\000\000\014&\000\000\000\000\002m\002m\002m\002m\002i\002i\000\000\000\000\000\000\002i\000\000\011\162\002i\000\000\011\174\002i\000\000\002i\000\000\000\000\t\202\011\186\002i\002i\002i\011\198\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\n\n\002i\000\000\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\t\210\n\018\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\002i\002i\002i\002i\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\002i\002i\002i\002i\002i\002i\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002}\002}\000\000\000\000\000\000\002}\000\000\002\006\002}\000\000\002\130\002}\000\000\002}\000\000\000\000\t\202\000\000\002}\002}\002}\000\000\002}\002}\002}\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002}\000\000\002}\000\000\000\000\000\000\000\000\000\000\002}\002}\n2\n:\002}\000\000\027*\001\222\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\000\000\002}\002}\000\238\015\146\000\000\000\000\000\000\000\000\000\000\002}\002}\t\210\n\018\nJ\nR\002}\002}\002}\000\000\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\000\000\000\000\005\134\002}\002}\002}\000\000\002}\002}\002}\002}\000\000\000\000\000\000\002}\000\000\002}\002}\000\000\002}\002}\002}\nZ\002}\002}\000\000\000\000\002}\002}\002}\000\000\000\000\000\000\000\000\002}\002}\002}\002}\002Q\002Q\000\000\000\000\000\000\002Q\000\000\003\022\002Q\000\000\000\000\002Q\000\000\002Q\000\000\000\000\t\202\000\000\002Q\002Q\002Q\000\000\002Q\002Q\002Q\000\000\000\000\000\000\000\000\000\000\002Q\002Q\002Q\n\n\002Q\000\000\002Q\000\000\000\000\000\000\000\000\000\000\002Q\002Q\002Q\002Q\002Q\000\000\005\190\000\000\000\000\002Q\000\000\002Q\002Q\000\000\000\000\000\000\003\246\002Q\002Q\002Q\006N\000\000\004\002\000\000\000\000\000\000\002Q\002Q\t\210\n\018\002Q\002Q\002Q\002Q\002Q\000\000\000\000\002Q\000\000\002Q\002Q\000\000\000\000\000\000\000\000\000\000\000\000\002Q\002Q\002Q\000\000\002Q\002Q\002Q\002Q\000\000\000\000\000\000\002Q\000\000\002Q\002Q\000\000\002Q\002Q\002Q\002Q\002Q\002Q\000\000\000\000\002Q\002Q\002Q\000\000\000\000\000\000\000\000\002Q\002Q\002Q\002Q\002M\002M\000\000\000\000\000\000\002M\000\000\002\190\002M\000\000\000\000\002M\000\000\002M\000\000\000\000\t\202\000\000\002M\002M\002M\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002M\000\000\002M\000\000\000\000\000\000\000\000\000\000\002M\002M\n2\n:\002M\000\000\t\138\003\n\000\000\002M\000\000\002M\002M\000\000\000\000\000\000\000\000\002M\002M\000\238\011\254\000\000\012\014\000\000\000\000\000\000\002M\002M\t\210\n\018\nJ\nR\002M\002M\002M\000\000\000\000\002M\000\000\002M\002M\000\000\000\000\000\000\000\000\000\000\000\000\002M\002M\002M\000\000\002M\002M\002M\002M\000\000\000\000\000\000\002M\000\000\002M\002M\000\000\002M\002M\002M\nZ\002M\002M\000\000\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\002M\002M\002M\002M\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\190\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\t\202\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\n2\n:\002\169\000\000\012\194\003\n\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\012\214\000\000\012\234\000\000\000\000\000\000\002\169\002\169\t\210\n\018\nJ\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\002\169\002\169\002\169\nZ\002\169\002\169\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002I\002I\000\000\000\000\000\000\002I\000\000\000\000\002I\000\000\000\000\002I\000\000\002I\000\000\000\000\t\202\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002I\000\000\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\n2\n:\002I\000\000\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\002I\002I\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\t\210\n\018\nJ\nR\002I\002I\002I\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\002I\002I\002I\002I\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\002I\002I\002I\nZ\002I\002I\000\000\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002\129\002\129\000\000\000\000\000\000\002\129\000\000\000\000\002\129\000\000\000\000\002\129\000\000\002\129\000\000\000\000\t\202\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002\129\000\000\002\129\000\000\000\000\000\000\000\000\000\000\002\129\002\129\n2\n:\002\129\000\000\000\000\000\000\000\000\002\129\000\000\002\129\002\129\000\000\000\000\000\000\000\000\002\129\002\129\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\129\t\210\n\018\nJ\nR\002\129\002\129\002\129\000\000\000\000\002\129\000\000\002\129\002\129\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\002\129\000\000\000\000\000\000\002\129\000\000\002\129\002\129\000\000\002\129\002\129\002\129\nZ\002\129\002\129\000\000\000\000\002\129\002\129\002\129\000\000\000\000\000\000\000\000\002\129\002\129\002\129\002\129\002y\002y\000\000\000\000\000\000\002y\000\000\000\000\002y\000\000\000\000\002y\000\000\002y\000\000\000\000\t\202\000\000\002y\002y\002y\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002y\000\000\002y\000\000\000\000\000\000\000\000\000\000\002y\002y\n2\n:\002y\000\000\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\002y\002y\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002y\002y\t\210\n\018\nJ\nR\002y\002y\002y\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\000\000\000\000\002y\002y\002y\000\000\002y\002y\002y\002y\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\002y\002y\002y\nZ\002y\002y\000\000\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\002y\002y\002y\002y\002\137\002\137\000\000\000\000\000\000\002\137\000\000\000\000\002\137\000\000\000\000\002\137\000\000\002\137\000\000\000\000\t\202\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\n2\n:\002\137\000\000\000\000\000\000\000\000\002\137\000\000\nB\002\137\000\000\000\000\000\000\000\000\002\137\002\137\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\t\210\n\018\nJ\nR\nb\002\137\002\137\000\000\000\000\002\137\000\000\002\137\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\nr\000\000\002\137\002\137\002\137\002\137\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\nZ\002\137\002\137\000\000\000\000\002\137\nz\002\137\000\000\000\000\000\000\000\000\002\137\002\137\n\130\n\138\002\141\002\141\000\000\000\000\000\000\002\141\000\000\000\000\002\141\000\000\000\000\002\141\000\000\002\141\000\000\000\000\t\202\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002\141\000\000\002\141\000\000\000\000\000\000\000\000\000\000\002\141\002\141\n2\n:\002\141\000\000\000\000\000\000\000\000\002\141\000\000\nB\002\141\000\000\000\000\000\000\000\000\002\141\002\141\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\141\002\141\t\210\n\018\nJ\nR\nb\002\141\002\141\000\000\000\000\002\141\000\000\002\141\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\141\002\141\nr\000\000\002\141\002\141\002\141\002\141\000\000\000\000\000\000\002\141\000\000\002\141\002\141\000\000\002\141\002\141\002\141\nZ\002\141\002\141\000\000\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\002\141\002\141\n\130\n\138\002\145\002\145\000\000\000\000\000\000\002\145\000\000\000\000\002\145\000\000\000\000\002\145\000\000\002\145\000\000\000\000\t\202\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\002\145\000\000\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\n2\n:\002\145\000\000\000\000\000\000\000\000\002\145\000\000\nB\002\145\000\000\000\000\000\000\000\000\002\145\002\145\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\t\210\n\018\nJ\nR\nb\002\145\002\145\000\000\000\000\002\145\000\000\002\145\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\nr\000\000\002\145\002\145\002\145\002\145\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\002\145\002\145\002\145\nZ\002\145\002\145\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\n\130\n\138\b\225\b\225\000\000\000\000\000\000\b\225\000\000\000\000\b\225\000\000\000\000\b\225\000\000\b\225\000\000\000\000\t\202\000\000\b\225\b\225\b\225\000\000\b\225\b\225\b\225\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\b\225\000\000\000\000\000\000\000\000\000\000\b\225\b\225\n2\n:\b\225\000\000\000\000\000\000\000\000\b\225\000\000\nB\b\225\000\000\000\000\000\000\000\000\b\225\b\225\000\238\000\000\000\000\000\000\000\000\000\000\000\000\b\225\b\225\t\210\n\018\nJ\nR\nb\b\225\b\225\000\000\000\000\b\225\000\000\b\225\nj\000\000\000\000\000\000\000\000\000\000\000\000\b\225\b\225\nr\000\000\b\225\b\225\b\225\b\225\000\000\000\000\000\000\b\225\000\000\b\225\b\225\000\000\b\225\b\225\b\225\nZ\b\225\b\225\000\000\000\000\b\225\nz\b\225\000\000\000\000\000\000\000\000\b\225\b\225\n\130\n\138\002\149\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\t\202\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\n2\n:\002\149\000\000\000\000\000\000\000\000\002\149\000\000\nB\002\149\000\000\000\000\000\000\000\000\002\149\002\149\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\t\210\n\018\nJ\nR\nb\002\149\002\149\000\000\000\000\002\149\000\000\002\149\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\nr\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\n\146\002\149\n\154\nZ\002\149\002\149\000\000\000\000\002\149\nz\002\149\000\000\000\000\000\000\000\000\002\149\002\149\n\130\n\138\b\221\b\221\000\000\000\000\000\000\b\221\000\000\000\000\b\221\000\000\000\000\b\221\000\000\b\221\000\000\000\000\t\202\000\000\b\221\b\221\b\221\000\000\b\221\b\221\b\221\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\b\221\000\000\000\000\000\000\000\000\000\000\b\221\b\221\n2\n:\b\221\000\000\000\000\000\000\000\000\b\221\000\000\nB\b\221\000\000\000\000\000\000\000\000\b\221\b\221\000\238\000\000\000\000\000\000\000\000\000\000\000\000\b\221\b\221\t\210\n\018\nJ\nR\nb\b\221\b\221\000\000\000\000\b\221\000\000\b\221\nj\000\000\000\000\000\000\000\000\000\000\000\000\b\221\b\221\nr\000\000\b\221\b\221\b\221\b\221\000\000\000\000\000\000\b\221\000\000\b\221\b\221\000\000\b\221\b\221\b\221\nZ\b\221\b\221\000\000\000\000\b\221\nz\b\221\000\000\000\000\000\000\000\000\b\221\b\221\n\130\n\138\002\197\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\t\202\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\n2\n:\002\197\000\000\000\000\000\000\000\000\002\197\000\000\nB\002\197\000\000\000\000\000\000\000\000\002\197\002\197\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\t\210\n\018\nJ\nR\nb\002\197\002\197\000\000\000\000\002\197\000\000\002\197\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\nr\000\000\002\197\002\197\002\197\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\n\146\002\197\n\154\nZ\002\197\002\197\000\000\000\000\002\197\nz\002\197\000\000\000\000\000\000\000\000\002\197\002\197\n\130\n\138\002\193\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\t\202\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\n2\n:\002\193\000\000\000\000\000\000\000\000\002\193\000\000\nB\002\193\000\000\000\000\000\000\000\000\002\193\002\193\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\t\210\n\018\nJ\nR\nb\002\193\002\193\000\000\000\000\002\193\000\000\002\193\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\nr\000\000\002\193\002\193\002\193\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\n\146\002\193\n\154\nZ\002\193\002\193\000\000\000\000\002\193\nz\002\193\000\000\000\000\000\000\000\000\002\193\002\193\n\130\n\138\002\201\002\201\000\000\000\000\000\000\002\201\000\000\000\000\002\201\000\000\000\000\002\201\000\000\002\201\000\000\000\000\t\202\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\n2\n:\002\201\000\000\000\000\000\000\000\000\002\201\000\000\nB\002\201\000\000\000\000\000\000\000\000\002\201\002\201\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\t\210\n\018\nJ\nR\nb\002\201\002\201\000\000\000\000\002\201\000\000\002\201\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\nr\000\000\002\201\002\201\002\201\002\201\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\n\146\002\201\n\154\nZ\002\201\002\201\000\000\000\000\002\201\nz\002\201\000\000\000\000\000\000\000\000\002\201\002\201\n\130\n\138\002\181\002\181\000\000\000\000\000\000\002\181\000\000\000\000\002\181\000\000\000\000\002\181\000\000\002\181\000\000\000\000\t\202\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n2\n:\002\181\000\000\000\000\000\000\000\000\002\181\000\000\nB\002\181\000\000\000\000\000\000\000\000\002\181\002\181\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\t\210\n\018\nJ\nR\nb\002\181\002\181\000\000\000\000\002\181\000\000\002\181\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\nr\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\n\146\002\181\n\154\nZ\002\181\002\181\000\000\000\000\002\181\nz\002\181\000\000\000\000\000\000\000\000\002\181\002\181\n\130\n\138\002\185\002\185\000\000\000\000\000\000\002\185\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\000\000\000\000\t\202\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n2\n:\002\185\000\000\000\000\000\000\000\000\002\185\000\000\nB\002\185\000\000\000\000\000\000\000\000\002\185\002\185\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\t\210\n\018\nJ\nR\nb\002\185\002\185\000\000\000\000\002\185\000\000\002\185\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\nr\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\n\146\002\185\n\154\nZ\002\185\002\185\000\000\000\000\002\185\nz\002\185\000\000\000\000\000\000\000\000\002\185\002\185\n\130\n\138\002\189\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\t\202\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n2\n:\002\189\000\000\000\000\000\000\000\000\002\189\000\000\nB\002\189\000\000\000\000\000\000\000\000\002\189\002\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\t\210\n\018\nJ\nR\nb\002\189\002\189\000\000\000\000\002\189\000\000\002\189\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\nr\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\n\146\002\189\n\154\nZ\002\189\002\189\000\000\000\000\002\189\nz\002\189\000\000\000\000\000\000\000\000\002\189\002\189\n\130\n\138\002\209\002\209\000\000\000\000\000\000\002\209\000\000\000\000\002\209\000\000\000\000\002\209\000\000\002\209\000\000\000\000\t\202\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\n2\n:\002\209\000\000\000\000\000\000\000\000\002\209\000\000\nB\002\209\000\000\000\000\000\000\000\000\002\209\002\209\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\t\210\n\018\nJ\nR\nb\002\209\002\209\000\000\000\000\002\209\000\000\002\209\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\nr\000\000\002\209\002\209\002\209\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\n\146\002\209\n\154\nZ\002\209\002\209\000\000\000\000\002\209\nz\002\209\000\000\000\000\000\000\000\000\002\209\002\209\n\130\n\138\002\205\002\205\000\000\000\000\000\000\002\205\000\000\000\000\002\205\000\000\000\000\002\205\000\000\002\205\000\000\000\000\t\202\000\000\002\205\002\205\002\205\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\n2\n:\002\205\000\000\000\000\000\000\000\000\002\205\000\000\nB\002\205\000\000\000\000\000\000\000\000\002\205\002\205\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\t\210\n\018\nJ\nR\nb\002\205\002\205\000\000\000\000\002\205\000\000\002\205\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\nr\000\000\002\205\002\205\002\205\002\205\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\n\146\002\205\n\154\nZ\002\205\002\205\000\000\000\000\002\205\nz\002\205\000\000\000\000\000\000\000\000\002\205\002\205\n\130\n\138\002\213\002\213\000\000\000\000\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\t\202\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n2\n:\002\213\000\000\000\000\000\000\000\000\002\213\000\000\nB\002\213\000\000\000\000\000\000\000\000\002\213\002\213\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\t\210\n\018\nJ\nR\nb\002\213\002\213\000\000\000\000\002\213\000\000\002\213\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\nr\000\000\002\213\002\213\002\213\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\n\146\002\213\n\154\nZ\002\213\002\213\000\000\000\000\002\213\nz\002\213\000\000\000\000\000\000\000\000\002\213\002\213\n\130\n\138\002\177\002\177\000\000\000\000\000\000\002\177\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\t\202\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n2\n:\002\177\000\000\000\000\000\000\000\000\002\177\000\000\nB\002\177\000\000\000\000\000\000\000\000\002\177\002\177\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\t\210\n\018\nJ\nR\nb\002\177\002\177\000\000\000\000\002\177\000\000\002\177\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\nr\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\n\146\002\177\n\154\nZ\002\177\002\177\000\000\000\000\002\177\nz\002\177\000\000\000\000\000\000\000\000\002\177\002\177\n\130\n\138\002\001\002\001\000\000\000\000\000\000\002\001\000\000\000\000\002\001\000\000\000\000\002\001\000\000\002\001\000\000\000\000\002\001\000\000\002\001\002\001\002\001\000\000\002\001\002\001\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\000\000\000\000\000\000\002\001\000\000\002\001\002\001\000\000\000\000\000\000\000\000\002\001\002\001\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\002\001\000\000\002\001\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\000\000\000\000\002\001\000\000\002\001\002\001\000\000\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\002\001\002\001\r\254\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\029\002\029\000\000\000\000\000\000\002\029\000\000\000\000\002\029\000\000\000\000\002\029\000\000\002\029\000\000\000\000\t\202\000\000\002\029\002\029\002\029\000\000\002\029\002\029\002\029\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\029\000\000\000\000\000\000\000\000\000\000\002\029\002\029\n2\n:\002\029\000\000\000\000\000\000\000\000\002\029\000\000\nB\002\029\000\000\000\000\000\000\000\000\002\029\002\029\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\029\002\029\t\210\n\018\nJ\nR\nb\002\029\002\029\000\000\000\000\002\029\000\000\002\029\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\029\002\029\nr\000\000\002\029\002\029\014\022\002\029\000\000\000\000\000\000\002\029\000\000\002\029\002\029\000\000\n\146\002\029\n\154\nZ\002\029\002\029\000\000\000\000\002\029\nz\002\029\000\000\000\000\000\000\000\000\002\029\002\029\n\130\n\138\002\025\002\025\000\000\000\000\000\000\002\025\000\000\000\000\002\025\000\000\000\000\002\025\000\000\002\025\000\000\000\000\t\202\000\000\002\025\002\025\002\025\000\000\002\025\002\025\002\025\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\025\000\000\000\000\000\000\000\000\000\000\002\025\002\025\n2\n:\002\025\000\000\000\000\000\000\000\000\002\025\000\000\nB\002\025\000\000\000\000\000\000\000\000\002\025\002\025\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\025\002\025\t\210\n\018\nJ\nR\nb\002\025\002\025\000\000\000\000\002\025\000\000\002\025\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\025\002\025\nr\000\000\002\025\002\025\002\025\002\025\000\000\000\000\000\000\002\025\000\000\002\025\002\025\000\000\n\146\002\025\n\154\nZ\002\025\002\025\000\000\000\000\002\025\nz\002\025\000\000\000\000\000\000\000\000\002\025\002\025\n\130\n\138\002\173\002\173\000\000\000\000\000\000\002\173\000\000\000\000\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\t\202\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\n\002\n\026\n\"\n\n\n*\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\n2\n:\002\173\000\000\000\000\000\000\000\000\002\173\000\000\nB\002\173\000\000\000\000\000\000\000\000\002\173\002\173\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\t\210\n\018\nJ\nR\nb\002\173\002\173\000\000\000\000\002\173\000\000\002\173\nj\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\nr\000\000\002\173\002\173\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\n\146\002\173\n\154\nZ\002\173\002\173\000\000\000\000\002\173\nz\002\173\000\000\000\000\000\000\000\000\002\173\002\173\n\130\n\138\002\r\002\r\000\000\000\000\000\000\002\r\000\000\000\000\002\r\000\000\000\000\002\r\000\000\002\r\000\000\000\000\002\r\000\000\002\r\002\r\002\r\000\000\002\r\002\r\002\r\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\r\000\000\002\r\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\r\000\000\000\000\000\000\000\000\002\r\000\000\002\r\002\r\000\000\000\000\000\000\000\000\002\r\002\r\002\r\000\000\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\r\002\r\002\r\002\r\002\r\000\000\000\000\002\r\000\000\002\r\002\r\000\000\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\000\000\002\r\002\r\002\r\002\r\000\000\000\000\000\000\002\r\000\000\002\r\002\r\000\000\002\r\002\r\002\r\002\r\002\r\002\r\000\000\000\000\002\r\002\r\r\254\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\017\002\017\000\000\000\000\000\000\002\017\000\000\000\000\002\017\000\000\000\000\002\017\000\000\002\017\000\000\000\000\002\017\000\000\002\017\002\017\002\017\000\000\002\017\002\017\002\017\000\000\000\000\000\000\000\000\000\000\002\017\002\017\002\017\002\017\002\017\000\000\002\017\000\000\000\000\000\000\000\000\000\000\002\017\002\017\002\017\002\017\002\017\003\253\000\000\000\000\000\000\002\017\000\000\002\017\002\017\000\000\000\000\000\000\000\000\002\017\002\017\002\017\000\000\000\000\000\000\000\000\000\000\000\000\002\017\002\017\002\017\002\017\002\017\002\017\002\017\002\017\002\017\000\000\000\000\002\017\000\000\002\017\002\017\000\000\000\000\000\000\000\000\000\000\000\238\002\017\002\017\002\017\000\000\002\017\002\017\002\017\002\017\000\000\000\000\000\000\002\017\000\000\002\017\002\017\000\000\002\017\002\017\002\017\002\017\002\017\002\017\000\000\000\000\002\017\002\017\r\254\000\000\000\000\003\253\000\000\002\017\002\017\002\017\002\017\001\006\000\000\000\006\000\000\006\229\000\000\002\186\002\190\006*\002\234\002\130\005\234\b\242\000\000\000\000\002\246\001\n\000\000\0066\000\000\002\142\000\000\006B\006\229\000\000\001\210\003\206\006\229\002\190\0036\001\018\bn\br\001\030\001\"\003\170\000\000\000\000\003F\000\000\002\254\007\226\025\030\000\000\b\150\b\154\001\210\003\222\0032\003\234\b\158\006\214\000\000\001:\000\000\002\178\007\r\000\000\003:\000\000\000\000\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\003\202\001>\001B\001F\001J\001N\007\r\002\178\b\178\001R\007\r\007\001\000\000\001V\000\000\b\190\b\214\t*\005\130\005\134\000\000\000\000\001Z\000\000\000\000\000\000\006\229\000\000\001^\002\225\007\001\000\000\000\000\018\130\007\001\006\234\000\000\000\000\001\154\011\018\000\000\011\030\005\138\b2\004\026\001\158\000\000\014F\004r\t>\001\006\001\166\000\006\001\170\001\174\000\000\002\186\002\190\000\n\002\234\002\130\011\"\000\000\000\000\000\000\002\246\001\n\000\000\000\000\000\000\bj\000\000\000\238\000\000\002\225\001\210\000\000\000\000\007\r\0036\001\018\bn\br\001\030\001\"\000\000\002\225\002\225\003F\000\000\002\254\000\000\bv\n\206\b\150\b\154\n\218\003\222\0032\003\234\b\158\006\214\000\238\001:\000\000\002\178\000\000\000\000\003:\000\000\000\000\000\000\b\026\b\030\b*\b>\006*\005v\000\000\005\234\001>\001B\001F\001J\001N\000\000\0066\b\178\001R\000\000\006B\000\000\001V\000\000\b\190\b\214\t*\005\130\005\134\000\000\000\000\001Z\000\000\000\000\000\000\000\000\006*\001^\000\000\005\234\011&\000\000\000\000\000\000\000\000\000\000\0066\001\154\006\022\000\000\006B\005\138\b2\012\181\001\158\000\000\014F\004r\t>\004m\001\166\000\006\001\170\001\174\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\012\181\002\246\000\000\002\030\003\178\000\000\002\"\000\000\004m\000\000\003\182\001\210\000\000\017\026\000\000\002\250\000\000\003>\003B\002.\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\016\174\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\017\018\002\178\000\000\000\000\003:\017*\002:\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0172\000\000\b\178\000\000\t\r\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\017F\017r\000\000\000\000\004m\004m\000\000\000\000\000\000\006f\024\234\000\000\t\r\000\000\000\000\002>\012\181\012\161\000\000\000\000\017\174\021\154\005\138\b2\025\n\000\173\000\000\bJ\004r\t>\000\173\000\000\002\190\000\173\000\000\002\130\012\181\tf\000\000\002\030\002\246\000\000\002\"\000\173\000\000\000\173\000\000\000\173\000\000\000\173\001\210\000\238\tn\000\000\002\250\002.\000\000\000\000\0026\012\161\tv\000\173\000\000\000\000\000\000\002\254\000\000\000\173\000\000\000\000\000\000\000\173\000\000\0032\001\190\015\130\000\173\000\000\002\130\000\173\002\178\000\000\002:\003:\000\173\000\173\000\173\b\026\b\030\b*\000\000\012f\005v\000\173\000\173\006*\021B\000\000\005\234\024\238\000\173\000\000\000\000\t\r\000\173\0066\000\000\000\000\000\000\006B\000\000\000\000\005\130\005\134\000\173\000\173\015\134\000\000\000\173\000\173\000\000\000\000\000\000\000\000\000\000\000\000\002>\000\000\000\173\000\000\015\146\000\000\021f\000\000\000\173\000\173\005\138\b2\000\000\000\000\000\197\bJ\004r\000\000\000\173\000\197\000\173\002\190\000\197\000\000\002\130\000\000\tf\000\000\000\000\002\246\005\134\000\000\000\197\000\000\000\197\000\000\000\197\000\000\000\197\001\210\021r\tn\000\000\002\250\000\000\000\000\000\000\000\000\b\210\tv\000\197\000\000\000\000\000\000\002\254\000\000\000\197\021\006\000\000\000\000\000\197\000\000\0032\001\190\000\000\000\197\000\000\000\000\000\197\002\178\000\000\000\000\003:\000\197\000\197\000\197\b\026\b\030\b*\000\000\012f\005v\000\197\000\197\000\000\000\000\000\000\000\000\r\234\000\197\000\000\000\000\000\000\000\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\197\000\197\000\000\000\238\000\197\000\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\197\000\000\000\000\000\000\000\000\000\000\000\197\000\197\005\138\b2\000\000\000\000\000\000\bJ\004r\000\000\000\197\000\000\000\197\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\006*\000\000\000>\005\234\000\000\000\000\000B\000\000\000\000\000\000\0066\000\000\000\000\000F\006B\000\000\000\000\000\000\000\000\000J\000\000\000N\000R\000V\000Z\000^\000b\000f\000\000\000\000\000\000\000j\000n\000\000\000r\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000z\000\000\000\000\000~\000\130\000\000\000\000\000\000\000\000\000\000\000\134\000\138\000\142\000\000\000\000\000\000\000\000\000\000\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\000\000\000\000\000\174\000\178\000\182\000\000\000\000\000\000\000\186\000\006\000\190\000\194\000\246\002\186\002\190\002\194\002\234\002\130\000\198\000\000\000\202\000\000\002\246\000\000\000\000\004\141\000\206\000\210\000\000\000\214\000\000\003\182\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\016\174\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\017\018\002\178\000\000\000\000\003:\017*\000\000\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0172\000\000\b\178\000\000\027\250\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\017F\017r\000\000\000\006\028\027\014\218\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\000\000\002\246\000\000\000\000\028J\000\000\021\154\005\138\b2\014Z\003\182\001\210\bJ\004r\t>\002\250\000\000\003>\003B\000\000\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\016\174\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\016n\017\018\002\178\000\000\000\000\003:\017*\002\006\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\002\n\000\000\000\000\000\000\000\000\0172\000\000\b\178\001\210\027\250\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\017F\017r\000\000\000\000\004\149\000\000\003\154\000\000\000\000\000\000\001\006\000\000\007\002\001\222\000\000\000\000\003V\002\190\t\018\002\178\002\130\021\154\005\138\b2\000\000\002\246\001\n\bJ\004r\t>\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\007\006\000\000\000\000\002\225\000\000\003z\002\225\001.\011\014\000\000\000\000\003r\001\190\0016\002\225\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\002\225\003\250\000\000\004\002\005j\000\n\005v\000\000\002\225\001>\001B\001F\001J\001N\000\000\000\000\000\n\001R\005z\000\000\002\225\001V\000\000\000\000\000\000\002\225\005\130\005\134\000\000\005\202\001Z\002\225\002\225\002\225\002\225\000\000\001^\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\000\000\001\154\011\018\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\001\006\000\000\001\166\002\225\001\170\001\174\003V\002\190\n\178\002\225\002\130\015\130\000\000\000\000\002\130\002\246\001\n\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\011\014\000\000\000\000\003r\001\190\0016\007\173\015\134\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\015\146\005v\021F\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\000\000\007\173\001V\n\181\000\000\000\000\000\000\005\130\005\134\000\000\005\202\001Z\005\134\000\000\000\000\007\173\000\000\001^\007\173\b\166\000\000\000\000\021R\000\000\000\000\007\173\000\000\001\154\011\018\007\173\000\000\005\138\000\000\n\181\001\158\000\000\001\162\004r\001\006\021\006\001\166\000\000\001\170\001\174\003V\002\190\r\170\n\181\002\130\000\000\n\181\011\134\000\000\002\246\001\n\000\000\000\000\n\181\002\142\000\000\000\000\n\181\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\011\014\000\000\000\000\003r\001\190\0016\000\000\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\001Z\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\011\018\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\000\000\b\249\001\166\000\006\001\170\001\174\000\000\002\186\002\190\000\000\002\234\002\130\000\000\000\000\000\000\000\000\002\246\000\000\000\000\000\000\000\000\b\249\000\000\b\249\b\249\000\000\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\000\000\b\001\003F\000\000\002\254\000\000\b\001\000\000\003\214\003\218\n\222\003\222\0032\003\234\003\242\006\214\001\202\001\206\011>\002\178\000\000\000\000\003:\000\000\000\000\b\001\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\001\210\002\170\001\230\000\000\000\000\000\000\b\178\000\000\000\000\000\000\001\242\000\000\b\001\b\190\b\214\t*\005\130\005\134\000\000\000\000\b\001\000\000\000\000\001\246\002\146\b\001\b\001\000\238\002\158\000\000\002\178\004\030\004*\000\000\b\001\b\001\000\000\0046\000\000\000\000\005\138\b2\b\249\004\253\004\253\bJ\004r\t>\004\253\000\000\004\253\004\253\000\000\004\253\004:\004\253\004\253\b\001\000\000\004\253\b\001\004\253\004\253\004\253\004\253\004\253\004\253\004\253\004\253\b\001\004\253\016~\004\253\000\000\000\000\000\000\000\000\000\000\002\006\004\253\000\000\000\000\000\000\000\000\004\253\004\253\004\253\000\000\002\n\004\253\004\253\004\253\004\253\000\000\004\253\000\000\001\210\004\253\000\000\000\000\000\000\000\000\004\253\004\253\004\253\000\000\000\000\004\253\004\253\004\253\000\000\004\253\004\253\003\154\000\000\000\000\000\000\000\000\004\253\007\002\001\222\000\000\004\253\004\253\000\000\004\253\002\178\004\253\000\000\000\000\000\000\000\000\004\253\004\253\004\253\000\000\004\253\004\253\004\253\004\253\000\000\004\253\004\253\000\000\000\000\000\000\004\253\000\000\004\253\004\253\000\000\000\000\002\150\004\253\007\006\000\000\000\000\020\026\004\253\000\000\n\205\000\000\004\253\n\205\004\253\004\253\n\205\n\205\000\000\004\253\n\205\000\000\n\205\000\000\000\000\n\205\000\000\001*\000\000\n\205\n\205\000\000\n\205\n\205\002\225\n\205\000\000\n\205\000\000\000\000\000\000\002\225\n\205\000\000\000\000\n\205\000\000\000\000\000\000\000\000\000\000\000\000\002\225\n\205\000\000\n\205\000\000\000\000\n\205\n\205\000\n\000\000\000\000\000\000\000\000\n\205\000\000\000\000\n\205\000\000\000\000\n\205\n\205\000\000\n\205\002\225\n\205\n\205\000\000\000\000\000\000\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\n\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\205\n\205\000\000\000\000\n\205\000\000\n\205\000\000\000\000\000\000\000\000\005\166\000\000\002\225\000\000\000\000\001\202\001\206\n\205\n\205\000\000\n\205\n\205\000\000\n\205\000\000\n\205\000\000\n\205\000\000\n\205\000\000\n\205\b\229\b\229\001\210\001\214\001\230\b\229\000\000\001\206\b\229\000\000\000\000\000\000\001\242\003\190\000\000\018\174\b\229\000\000\b\229\b\229\b\229\000\000\b\229\b\229\b\229\001\246\020\022\000\000\0196\000\000\002\158\000\000\002\178\004\030\004*\000\000\b\229\000\000\000\000\020&\000\000\000\000\b\229\b\229\000\000\000\000\b\229\000\000\000\000\002\154\000\000\b\229\000\000\000\000\b\229\000\000\004:\000\000\000\000\b\229\b\229\b\229\000\000\000\000\000\000\000\000\000\000\000\000\b\229\b\229\000\000\000\000\000\000\000\000\000\000\b\229\000\000\000\000\000\000\004\154\000\000\000\000\b\229\000\000\000\000\000\000\000\000\000\000\000\000\b\229\b\229\b\229\000\000\b\229\b\229\000\000\004Y\000\000\000\000\000\000\000\000\004Y\000\000\b\229\004Y\b\229\b\229\000\000\000\000\000\000\b\229\000\000\000\000\000\000\004Y\b\229\000\000\000\000\004Y\b\229\004Y\b\229\b\229\012u\012u\000\000\000\000\004Y\012u\000\000\001\206\012u\004Y\000\000\000\000\000\000\000\000\000\000\004Y\004\186\000\000\012u\012u\012u\004B\012u\012u\012u\000\000\000\000\004Y\004Y\000\000\000\000\000\000\004Y\002\226\000\000\000\000\012u\000\000\000\000\000\000\000\000\000\000\012u\012u\000\000\000\000\012u\000\000\004Y\002\154\004Y\012u\000\000\000\000\012u\000\000\000\000\000\000\004Y\012u\012u\012u\004Y\004Y\002\226\000\238\004Y\004Y\012u\012u\000\000\000\000\004R\004Y\000\000\012u\000\000\000\000\000\000\004\154\000\000\000\000\012u\004Y\000\000\000\000\000\000\000\000\021\026\012u\012u\012u\000\000\012u\012u\000\000\004Y\000\000\004Y\000\000\000\000\004Y\000\000\012u\004Y\012u\012u\004Y\000\000\000\000\012u\000\000\000\000\000\000\004Y\012u\000\000\000\000\004Y\012u\004Y\012u\012u\b\233\b\233\000\000\000\000\000\000\b\233\000\000\001\206\b\233\004Y\000\000\000\000\000\000\000\000\000\000\004Y\b\233\000\000\b\233\b\233\b\233\000\000\b\233\b\233\b\233\000\000\000\000\004Y\000\000\000\000\000\000\000\000\004Y\002\226\000\000\000\000\b\233\000\000\000\000\000\000\000\000\000\000\b\233\b\233\000\000\000\000\b\233\000\000\004Y\002\154\000\000\b\233\000\000\000\000\b\233\000\000\000\000\000\000\000\000\b\233\b\233\b\233\004Y\004Y\000\000\000\000\004Y\004Y\b\233\b\233\000\000\000\000\007n\000\000\000\000\b\233\000\000\000\000\000\000\004\154\000\000\000\000\b\233\004Y\000\000\000\000\000\000\000\000\000\000\b\233\b\233\b\233\002\225\b\233\b\233\000\000\000\000\002\225\002\225\002\225\000\000\000\000\002\225\b\233\002\225\b\233\b\233\002\225\002\225\002\225\b\233\002\225\002\225\002\225\002\225\b\233\002\225\002\225\000\000\b\233\002\225\b\233\b\233\000\000\002\225\000\n\000\000\002\225\002\225\002\225\000\000\002\225\000\000\002\225\002\225\000\n\000\000\002\225\002\225\000\n\002\225\002\225\002\225\000\000\000\000\000\000\002\225\002\225\000\000\002\225\002\225\002\225\002\225\002\225\002\225\000\000\002\225\002\225\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\002\225\002\225\002\225\002\225\000\000\002\225\000\000\000\000\002\225\000\000\000\000\000\000\000\000\002\225\002\225\002\225\002\225\000\000\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\006\141\000\000\0009\002\225\002\225\000\000\0009\0009\000\000\0009\0009\002\225\000\000\000\000\000\000\0009\000\000\002\225\000\000\000\000\006\141\002\225\002\225\000\000\000\000\0009\002\225\002\225\002\225\0009\006\222\0009\0009\000\000\000\000\000\000\000\000\000\000\0009\000\000\0009\000\000\000\000\000\000\0009\0009\000\000\0009\0009\0009\0009\0009\000\000\000\000\000\000\0009\000\000\000\000\0009\000\000\000\000\000\000\0009\0009\0009\0009\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0009\000\000\000\000\000\000\012\181\012\161\000\000\0009\0009\0009\0009\0009\000\000\006\137\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\012\181\000\000\000\000\002\030\0005\000\000\002\"\000\000\000\000\006\137\0009\0009\000\000\002*\0005\0009\0009\0009\0005\002.\0005\0005\0026\012\161\000\000\000\000\000\000\0005\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\0005\0005\0005\000\000\000\000\000\000\0005\000\000\002:\0005\000\000\000\000\000\000\0005\0005\0005\0005\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\000\000\006\153\000\000\012=\000\000\000\000\000\000\012=\012=\000\000\012=\012=\002>\000\000\000\000\000\000\012=\000\000\000\000\000\000\000\000\006\153\0005\0005\000\000\000\000\012=\0005\0005\0005\012=\000\000\012=\012=\000\000\000\000\000\000\000\000\000\000\012=\000\000\012=\000\000\000\000\000\000\012=\012=\000\000\012=\012=\012=\012=\012=\000\000\000\000\000\000\012=\000\000\000\000\012=\000\000\000\000\000\000\012=\012=\012=\012=\000\000\012=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012=\000\000\000\000\000\000\012\181\012\161\000\000\012=\012=\012=\012=\012=\000\000\006\149\000\000\0129\000\000\000\000\000\000\0129\0129\000\000\0129\0129\012\181\000\000\000\000\002\030\0129\000\000\002\"\000\000\000\000\006\149\012=\012=\000\000\002\206\0129\012=\012=\012=\0129\002.\0129\0129\0026\012\161\000\000\000\000\000\000\0129\000\000\0129\000\000\000\000\000\000\0129\0129\000\000\0129\0129\0129\0129\0129\000\000\001\202\001\206\0129\000\000\002:\0129\000\000\000\000\000\000\0129\0129\0129\0129\000\000\0129\000\000\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\0129\000\000\000\000\000\000\000\000\001\242\000\000\0129\0129\0129\0129\0129\001\250\000\000\000\000\000\000\000\000\000\000\001\246\002\146\000\000\000\000\000\000\002\158\002>\002\178\004\030\004*\012y\012y\000\000\000\000\0046\012y\0129\0129\012y\000\000\000\000\0129\0129\0129\000\000\000\000\004\138\000\000\012y\012y\012y\004:\012y\012y\012y\000\000\001\021\000\000\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\012y\000\000\000\000\000\000\000\000\000\000\012y\012y\000\000\000\000\012y\000\000\000\000\000\000\001\021\012y\000\000\000\000\012y\000\000\000\000\000\000\000\000\012y\012y\012y\000\000\000\000\000\000\000\000\000\000\000\000\012y\012y\000\000\000\000\001\021\000\000\018\182\012y\000\000\000\000\000\000\012y\001\021\000\000\012y\000\000\000\000\001\021\000\000\000\000\000\000\012y\012y\012y\000\000\012y\012y\001\021\000\000\000\000\000\000\000\000\000\000\000\000\007\253\012y\000\006\012y\012y\007\253\002\186\002\190\012y\002\234\002\130\000\000\000\000\012y\000\000\002\246\000\000\012y\001\021\012y\012y\000\000\003\254\000\000\007\253\001\210\000\000\001\021\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\000\000\000\000\003F\000\000\002\254\000\000\000\000\000\000\003\214\003\218\007\253\003\222\0032\003\234\003\242\006\214\000\000\000\000\007\253\002\178\000\000\000\000\003:\007\253\007\253\000\238\b\026\b\030\b*\b>\000\000\005v\007\253\007\253\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\178\000\000\000\000\000\000\000\000\000\000\000\000\b\190\b\214\t*\005\130\005\134\000\000\000\000\007\253\000\000\000\000\007\253\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\007\253\002\186\002\190\000\000\002\234\002\130\000\000\000\000\005\138\b2\002\246\000\000\000\000\bJ\004r\t>\000\000\014n\000\000\000\000\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\001\197\000\000\003F\000\000\002\254\001\197\000\000\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\006\214\000\000\000\000\000\000\002\178\000\000\000\000\003:\000\000\001\197\000\000\b\026\b\030\b*\b>\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005-\012\245\b\178\000\000\000\000\0051\012\245\001\197\000\000\b\190\b\214\t*\005\130\005\134\000\000\001\197\000\000\000\000\000\000\005-\001\197\001\197\000\238\005-\0051\000\000\003\029\003\029\0051\001\197\001\197\003\029\000\000\000\000\003\029\000\000\005\138\b2\000\000\000\000\000\000\bJ\004r\t>\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\001\197\000\000\000\000\000\000\000\000\000\000\000\000\003\029\000\000\001\197\000\000\000\000\000\000\003\029\004\130\000\000\000\000\003\029\000\000\000\000\000\000\000\000\003\029\012\245\012\245\003\029\000\000\000\000\012\245\012\245\003\029\003\029\003\029\000\000\000\000\000\000\005-\000\000\000\000\003\029\003\029\0051\012\245\000\000\012\245\000\000\003\029\012\245\000\000\012\245\003\029\005-\000\000\003\029\005-\000\000\0051\000\000\000\000\0051\003\029\003\029\003\029\004}\003\029\003\029\000\000\000\000\018\198\000\000\000\000\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\003\029\000\000\000\000\000\000\000\000\003\029\003\182\n\217\000\000\003\029\n\217\003\029\003\029\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\000\000\002\246\000\000\000\000\000\000\n\217\n\217\018\242\n\217\n\217\000\000\001\210\000\000\006\198\000\000\017\018\000\000\000\000\003Z\000\000\017*\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\217\019.\003f\000\000\000\000\003r\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\n\217\003\250\000\000\004\002\005j\n\190\005v\000\000\004}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\146\005z\001\202\001\206\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\n\217\000\000\n\217\000\000\000\000\000\000\000\000\000\000\001\210\001\214\000\000\000\000\000\000\000\000\n\217\000\000\000\000\n\217\n\217\000\000\005\138\000\000\n\217\000\000\n\217\000\000\004r\n\213\n\217\000\000\n\213\001\246\002\162\003V\002\190\000\000\002\158\002\130\002\178\004\030\004*\000\000\002\246\000\000\000\000\0046\n\213\n\213\000\000\n\213\n\213\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\004:\000\000\000\000\026\022\000\000\000\000\000\000\000\000\n\213\000\000\003f\000\000\000\000\003r\001\190\000\000\000\000\000\000\000\000\026\002\002\178\000\000\000\000\003\246\000\000\000\000\n\213\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\012Y\000\000\000\000\012Y\000\000\000\000\005\130\005\134\000\000\005\202\n\213\000\000\n\213\012Y\000\000\000\000\000\000\000\000\000\000\012Y\000\000\001\221\001\221\000\000\n\213\000\000\001\221\n\213\n\213\001\221\005\138\012Y\n\213\000\000\n\213\000\000\004r\012Y\n\213\001\221\001\221\001\221\000\000\001\221\001\221\001\221\012Y\000\000\000\000\012Y\000\000\000\000\000\000\000\000\012Y\000\000\000\000\001\221\000\000\000\000\000\000\000\000\000\000\001\221\001\221\000\000\000\000\001\221\000\000\000\000\012Y\000\000\001\221\000\000\012Y\001\221\000\000\000\000\000\000\000\000\001\221\001\221\001\221\000\000\012Y\012Y\000\000\000\000\012Y\001\221\001\221\000\000\000\000\000\000\027\242\000\000\001\221\001\r\000\000\000\000\001\221\000\000\001\r\001\221\000\000\012Y\000\000\000\000\000\000\000\000\001\221\001\221\001\221\0256\001\221\001\221\000\000\000\000\000\000\000\000\002\006\001\r\000\000\000\000\001\221\000\000\001\221\001\221\003V\002\190\002\n\001\221\002\130\000\000\006\166\000\000\001\221\002\246\001\210\000\000\004\254\000\000\001\221\001\r\000\000\003R\000\000\001\210\000\000\006\198\000\000\001\r\000\000\000\000\003Z\003\154\001\r\b\226\000\000\000\000\000\000\007\002\001\222\000\000\000\000\001\r\001\r\003f\002\178\000\000\n\174\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\n\177\003\250\000\000\004\002\000\000\n\190\005v\000\000\001\r\000\000\003V\002\190\000\000\007\006\002\130\000\000\006\166\001\r\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\n\198\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\n\177\n\206\000\000\n\177\011:\003f\005\138\000\000\n\174\001\190\n\177\000\000\004r\000\000\n\177\002\178\000\000\000\000\003\246\000\000\000\000\n\177\003\250\000\000\004\002\000\000\n\190\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\000\000\n\198\005}\005}\000\000\000\000\000\000\005}\000\000\000\000\005}\000\000\000\000\000\000\000\000\n\177\000\000\000\000\n\177\n\177\005}\005\138\005}\000\000\005}\n\177\005}\004r\000\000\n\177\000\000\000\000\000\000\000\000\000\000\000\000\000\246\000\000\005}\002\194\000\000\000\000\000\000\000\000\005}\005}\000\000\000\000\000\000\028J\005}\000\000\000\000\005}\000\000\003\182\005}\000\000\000\000\000\000\000\000\005}\005}\005}\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\016\174\000\000\000\000\000\000\005}\005}\000\000\000\000\005}\024Z\000\000\001\006\017\018\000\000\000\000\000\000\000\000\017*\005}\005}\005}\000\000\005}\005}\000\000\000\000\000\000\001\n\007n\000\000\000\000\002\142\000\000\0172\000\000\005}\000\000\027\250\005}\005}\001\014\001\018\001\022\001\026\001\030\001\"\000\000\017F\017r\000\000\005}\004\149\000\000\001&\000\000\001.\0012\000\000\000\000\000\000\000\000\0016\004a\000\000\001:\000\000\000\000\000\246\021\154\000\000\002\018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017\178\001>\001B\001F\001J\001N\003\182\005q\005q\001R\000\000\000\000\005q\001V\000\000\005q\000\000\000\000\017\182\000\000\000\000\000\000\001Z\000\000\017\222\005q\000\000\005q\001^\005q\000\000\005q\000\000\000\000\000\000\000\000\017\018\000\000\001\154\027.\000\000\017*\000\000\005q\000\000\001\158\000\000\001\162\000\000\005q\005q\001\166\000\000\001\170\001\174\007\222\000\000\018Z\005q\000\000\000\000\005q\000\000\000\000\000\000\000\000\005q\005q\000\238\000\000\000\000\017F\018n\000\000\000\000\004a\004a\000\000\000\000\000\000\000\000\000\000\005q\005q\000\000\000\000\005q\000\000\b\245\000\000\000\000\000\000\018~\000\000\000\000\000\000\005q\005q\005q\000\000\005q\005q\000\000\000\000\t\202\000\000\000\000\012:\b\245\000\000\b\245\b\245\000\000\005q\000\000\000\000\005q\005q\n\002\n\026\n\"\n\n\n*\000\000\000\000\001\202\002~\000\000\005q\002\130\000\000\000\000\n2\n:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nB\000\000\000\000\001\210\001\214\001\230\002\134\000\000\000\238\000\000\000\000\000\000\000\000\001\242\001\006\000\000\000\000\t\210\n\018\nJ\nR\nb\000\000\000\000\000\000\000\000\002\138\002\146\000\000\nj\001\n\002\158\000\000\002\178\004\030\004*\000\000\000\000\nr\000\000\020\242\000\000\020\246\001\014\001\018\001\022\001\026\001\030\001\"\000\000\000\000\000\000\n\146\000\000\n\154\nZ\001&\004:\001.\0012\b\245\nz\000\000\000\000\0016\000\000\005\134\001:\000\000\n\130\n\138\000\000\000\000\000\000\000\000\000\000\021\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\003]\003]\001R\021\006\000\000\003]\001V\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\000\000\003]\000\000\003]\001^\003]\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\001\154\027J\000\000\000\000\000\000\003]\000\000\001\158\000\000\001\162\000\000\003]\003]\001\166\000\000\001\170\001\174\005\005\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003]\000\000\001\202\001\206\003]\bq\bq\000\000\000\000\000\000\bq\000\000\000\000\bq\003]\003]\003]\000\000\003]\003]\000\000\001\210\001\214\bq\005\005\bq\000\000\bq\000\000\bq\000\000\003]\000\000\000\000\000\000\003]\000\000\000\000\000\000\000\000\000\000\bq\000\000\000\000\001\246\002\154\003]\bq\bq\002\158\000\000\002\178\004\030\004*\000\000\000\000\bq\000\000\0046\bq\015\158\000\000\000\000\000\000\bq\bq\bq\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004:\000\000\000\000\000\000\000\000\bq\000\000\000\000\000\000\bq\rA\rA\000\000\000\000\000\000\rA\000\000\000\000\rA\bq\bq\bq\000\000\bq\bq\000\000\000\000\000\000\rA\000\000\rA\000\000\rA\bq\rA\000\000\bq\000\000\000\000\000\000\bq\000\000\000\000\000\000\000\000\000\000\rA\000\000\000\000\004\254\000\000\bq\rA\rA\rE\rE\000\000\000\000\004B\rE\000\000\rA\rE\000\000\rA\000\000\000\000\000\000\000\000\rA\rA\rA\rE\000\000\rE\000\000\rE\000\000\rE\000\000\000\000\000\000\000\000\000\000\000\000\rA\000\000\000\000\000\000\rA\rE\000\000\000\000\000\000\000\000\000\000\rE\rE\000\000\rA\rA\rA\004B\rA\rA\rE\000\000\000\000\rE\004R\000\000\000\000\000\000\rE\rE\rE\rA\000\000\000\000\000\000\rA\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rE\000\000\rA\000\000\rE\003]\003]\000\000\000\000\000\000\003]\000\000\000\000\003]\rE\rE\rE\000\000\rE\rE\000\000\000\000\000\000\003]\004R\003]\000\000\003]\000\000\003]\000\000\rE\001\202\001\206\000\000\rE\000\000\000\000\000\000\000\000\000\000\003]\000\000\000\000\000\000\000\000\rE\003]\003]\000\000\000\000\001\210\001\214\005\t\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\246\002\162\000\000\000\000\000\000\002\158\003]\002\178\004\030\004*\003]\001\205\000\000\000\000\0046\000\000\001\205\000\000\001\206\001\205\003]\003]\003]\000\000\003]\003]\000\000\b\209\000\000\001\205\005\t\004:\000\000\001\205\004\205\001\205\000\000\003]\000\000\000\000\000\000\003]\000\000\004Y\000\000\000\000\000\000\001\205\004Y\000\000\026\002\000\000\003]\001\205\001\205\000\000\000\000\000\000\000\000\000\000\002\154\000\000\001\205\000\000\000\000\001\205\000\000\004Y\000\000\000\000\001\205\001\205\001\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\205\001\205\000\000\004Y\004\154\003A\000\000\000\000\000\000\000\000\003A\004Y\001\206\003A\001\205\001\205\004Y\002\226\001\205\001\205\000\000\b\205\000\000\003A\000\000\004Y\004Y\003A\001\205\003A\000\000\000\000\000\000\000\000\000\000\001\205\000\000\000\000\000\000\000\000\001\205\003A\000\000\000\000\000\000\000\000\001\205\003A\001\201\000\000\000\181\004Y\000\000\000\000\002\154\000\181\003A\000\000\000\181\003A\004Y\000\000\000\000\000\000\003A\003A\003A\000\000\000\181\000\000\000\181\000\000\000\181\000\000\000\181\000\000\000\000\000\000\000\000\000\000\003A\003A\000\000\000\000\004\154\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\181\000\000\003A\003A\000\181\000\000\003A\003A\000\000\000\181\000\000\000\000\000\181\000\000\000\000\000\000\003A\000\181\000\181\000\238\000\000\000\000\000\000\003A\000\000\000\000\000\181\000\181\003A\000\000\000\000\000\000\000\000\000\181\003A\000\000\000\249\000\181\000\000\000\000\000\000\000\249\000\000\000\000\000\249\000\000\000\000\000\181\000\181\000\000\000\000\000\181\000\181\000\000\000\249\000\000\000\249\000\000\000\249\000\000\000\249\000\181\000\000\000\000\000\000\000\000\000\000\000\181\000\181\000\000\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\181\000\249\000\181\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\249\000\249\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\189\000\249\000\000\000\000\000\000\000\189\000\000\000\000\000\189\000\000\000\000\000\249\000\249\000\000\000\000\000\249\000\249\000\000\000\189\000\000\000\189\000\000\000\189\000\000\000\189\000\249\000\000\000\000\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\249\000\189\000\249\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\189\000\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\185\000\189\000\000\000\000\006\221\000\185\000\000\000\000\000\185\006\221\000\000\000\189\000\189\000\000\000\000\000\189\000\189\000\000\000\185\000\000\000\185\000\000\000\185\000\000\000\185\000\189\000\000\000\000\006\221\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\185\000\000\000\000\000\000\000\000\000\189\000\185\000\189\000\000\000\000\000\185\000\000\000\000\000\000\006\221\000\185\000\000\000\000\000\185\000\000\000\000\000\000\006\221\000\185\000\185\000\238\000\000\006\221\006\221\000\238\000\000\000\000\000\185\000\185\000\000\000\000\006\221\006\221\000\000\000\185\000\000\000\000\001\169\000\185\000\000\000\000\000\000\001\169\000\000\000\000\001\169\000\000\000\000\000\185\000\185\000\000\000\000\000\185\000\185\000\000\001\169\000\000\006\221\000\000\001\169\r\001\001\169\000\185\000\000\000\000\r\001\006\221\000\000\000\185\000\185\000\000\000\000\000\000\001\169\001\169\000\000\000\000\000\000\000\185\001\169\000\185\000\000\023\186\000\000\r\001\005\005\000\000\000\000\001\169\000\000\000\000\001\169\000\000\000\000\000\000\000\000\001\169\001\169\001\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r\001\000\000\000\000\000\000\000\000\000\000\001\169\000\000\r\001\000\000\001\169\r=\r=\r\001\r\001\000\238\r=\000\000\000\000\r=\001\169\001\169\r\001\r\001\001\169\001\169\000\000\000\000\000\000\r=\005\005\r=\000\000\r=\001\169\r=\000\000\000\000\000\000\000\000\001\169\001\169\000\000\000\000\000\000\000\000\001\169\r=\r\001\000\000\000\000\000\000\001\169\r=\r=\000\000\000\000\r\001\000\000\000\000\000\000\000\000\r=\000\000\000\000\r=\000\000\000\000\000\000\000\000\r=\r=\r=\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r=\000\000\000\000\000\000\r=\r9\r9\000\000\000\000\000\000\r9\000\000\000\000\r9\r=\r=\r=\000\000\r=\r=\000\000\000\000\000\000\r9\000\000\r9\000\000\r9\000\000\r9\000\000\r=\000\000\000\000\000\000\r=\000\000\000\000\000\000\000\000\000\000\r9\000\000\000\000\004\254\000\000\r=\r9\r9\000\000\000\000\000\000\000\000\000\000\000\000\004a\r9\000\000\000\000\r9\000\246\000\000\000\000\002\018\r9\r9\r9\000\000\000\000\000\000\000\000\000\000\000\000\017\178\000\000\000\000\000\000\004a\000\000\003\182\r9\000\000\bu\bu\r9\000\000\000\000\bu\000\000\000\000\bu\017\182\000\000\000\000\r9\r9\r9\017\222\r9\r9\bu\000\000\bu\000\000\bu\000\000\bu\000\000\007J\017\018\000\000\r9\000\000\000\000\017*\r9\000\000\000\000\bu\000\000\000\000\000\000\000\000\000\000\bu\bu\r9\000\000\000\000\000\000\018Z\000\000\000\000\bu\000\000\000\000\bu\000\000\000\000\000\000\000\000\bu\bu\000\238\017F\018n\000\000\000\000\004a\004a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\bu\000\000\000\000\000\000\bu\000\000\006\241\000\000\018~\000\000\000\000\000\000\000\000\000\000\bu\bu\bu\000\000\bu\bu\000\000\000\000\t\202\000\000\000\000\006\241\000\000\000\000\bu\006\241\000\000\bu\000\000\000\000\000\000\bu\n\002\n\026\n\"\n\n\n*\000\000\000\000\000\000\000\000\000\000\bu\001\201\000\000\000\000\n2\n:\001\201\000\000\001\206\001\201\000\000\000\000\000\000\nB\000\000\000\000\000\000\b\205\000\000\001\201\000\000\000\238\000\000\001\201\000\000\001\201\000\000\000\000\000\000\000\000\t\210\n\018\nJ\nR\nb\000\000\000\000\001\201\000\000\000\000\000\000\006\241\nj\001\201\000\000\000\000\000\000\000\000\000\000\000\000\002\154\nr\001\201\000\000\000\000\001\201\000\000\000\000\000\000\000\000\001\201\001\201\001\201\000\000\000\000\n\146\000\000\n\154\nZ\000\000\000\000\000\000\000\000\000\000\nz\000\000\001\201\001\201\000\000\000\000\004\154\000\000\n\130\n\138\000\000\000\000\000\000\016b\000\000\000\000\001\201\001\201\000\000\000\000\001\201\001\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\202\001\201\000\000\000\000\016f\000\000\000\000\000\000\001\201\000\000\000\000\000\000\000\000\001\201\n\002\n\026\n\"\n\n\n*\001\201\000\000\000\000\000\000\000\000\000\000\n\210\000\000\000\000\n2\n:\000\246\001\202\001\206\002\018\000\000\000\000\000\000\nB\000\000\000\000\000\000\000\000\000\000\017\178\000\000\000\238\000\000\004a\000\000\003\182\001\210\001\214\001\230\000\000\t\210\n\018\nJ\nR\nb\000\000\001\242\017\182\000\000\000\000\000\000\000\000\nj\017\222\000\000\000\000\000\000\000\000\000\000\001\246\002\146\nr\000\000\000\000\002\158\017\018\002\178\004\030\004*\000\000\017*\000\000\000\000\0046\000\000\n\146\016j\n\154\nZ\016z\000\000\000\000\000\000\000\000\nz\000\000\018Z\000\000\000\000\000\000\004:\000\000\n\130\n\138\005\169\005\169\000\000\000\000\000\000\005\169\017F\018n\005\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\169\000\000\005\169\000\000\005\169\000\000\005\169\000\000\000\000\018~\000\000\000\000\000\000\000\000\004n\000\000\004r\000\000\005\169\000\000\000\000\000\000\000\000\000\000\005\169\005\169\000\000\000\000\000\000\000\000\007\222\000\000\000\000\005\169\000\000\000\000\005\169\000\000\006I\000\000\000\000\005\169\005\169\000\238\000\000\002\190\000\000\000\000\002\130\000\000\000\000\000\000\000\000\002\246\000\000\002\225\002\225\005\169\006I\002\225\000\000\005\169\000\000\001\210\002\225\000\000\000\000\002\250\000\000\000\000\002\225\005\169\005\169\005\169\002\225\005\169\005\169\000\000\002\254\000\000\000\000\002\225\000\n\000\000\000\000\006\218\0032\001\190\005\169\000\000\000\000\015:\005\169\002\178\002\225\000\000\003:\002\225\002\225\000\000\b\026\b\030\b*\005\169\002\225\005v\000\000\002\225\000\000\000\000\002\225\002\225\000\000\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\005\165\007\030\000\000\005\130\005\134\005\165\002\225\000\000\005\165\000\000\000\000\000\000\000\000\000\000\002\225\002\225\000\000\015v\005\165\000\000\005\165\000\000\005\165\000\000\005\165\000\000\000\000\005\138\b2\000\000\000\000\000\000\bJ\004r\000\000\000\000\005\165\000\000\002\225\000\000\000\000\000\000\005\165\007\138\002\225\000\000\000\000\000\000\000\000\000\000\000\000\005\165\000\000\000\000\005\165\000\000\000\000\004\133\000\000\005\165\005\165\000\238\021\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\165\000\000\005\193\005\193\005\165\000\000\003\182\005\193\000\000\000\000\005\193\000\000\000\000\000\000\005\165\005\165\005\165\000\000\005\165\005\165\005\193\000\000\005\193\000\000\005\193\000\000\005\193\000\000\0222\000\000\000\000\005\165\000\000\000\000\000\000\005\165\017\018\000\000\005\193\000\000\000\000\017*\000\000\000\000\005\193\005\193\005\165\000\000\000\000\000\000\022\214\022\230\000\000\005\193\000\000\000\000\005\193\000\000\000\000\000\000\000\000\005\193\005\193\005\193\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\133\005\193\000\000\005\189\007\030\005\193\000\000\000\000\005\189\023\218\000\000\005\189\000\000\000\000\000\000\005\193\005\193\005\193\000\000\005\193\005\193\005\189\000\000\005\189\000\000\005\189\000\000\005\189\000\000\000\000\000\000\000\000\005\193\000\000\000\000\000\000\005\193\000\000\000\000\005\189\000\000\000\000\000\000\000\000\000\000\005\189\007\138\007\130\000\000\000\000\000\000\000\000\000\000\000\000\005\189\000\000\000\000\005\189\000\000\000\000\000\000\000\000\005\189\005\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\189\003V\002\190\000\000\005\189\002\130\000\000\006\166\000\000\000\000\002\246\000\000\000\000\000\000\005\189\005\189\005\189\000\000\005\189\005\189\001\210\000\000\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\005\189\000\000\000\000\000\000\005\189\000\000\000\000\000\000\000\000\003f\000\000\000\000\n\174\001\190\000\000\005\189\012\186\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\000\000\n\190\005v\t\202\000\000\000\000\012:\000\000\000\000\000\000\b\245\000\000\000\000\000\000\005z\000\000\000\000\n\002\n\026\n\"\n\n\n*\005\130\005\134\000\000\000\000\n\198\000\000\000\000\000\000\000\000\n2\n:\000\000\000\000\000\000\000\000\000\000\000\000\000\000\nB\n\206\000\000\000\000\n\218\000\000\005\138\000\000\000\238\000\000\000\000\000\000\004r\000\000\000\000\000\000\000\000\t\210\n\018\nJ\nR\nb\000\000\003=\000\000\000\000\000\000\000\000\003=\nj\001\206\003=\000\000\000\000\000\000\000\000\000\000\000\000\nr\000\000\000\000\003=\000\000\000\000\000\000\003=\000\000\003=\000\000\000\000\000\000\000\000\n\146\000\000\n\154\nZ\000\000\000\000\000\000\003=\000\000\nz\000\000\000\000\000\000\003=\000\000\000\000\001M\n\130\n\138\000\000\002\154\001M\003=\000\000\001M\003=\000\000\000\000\000\000\000\000\003=\003=\003=\000\000\001M\000\000\001M\000\000\001M\000\000\001M\000\000\000\000\000\000\000\000\000\000\003=\003=\000\000\000\000\004\154\000\000\001M\000\000\000\000\000\000\000\000\000\000\001M\000\000\003=\003=\001M\000\000\003=\003=\000\000\001M\000\000\000\000\001M\000\000\000\000\000\000\003=\001M\001M\000\238\000\000\001I\000\000\003=\000\000\000\000\001I\001M\003=\001I\000\000\000\000\000\000\001M\003=\000\000\000\000\001M\000\000\001I\000\000\001I\000\000\001I\000\000\001I\000\000\001M\001M\001M\000\000\001M\001M\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\001M\000\000\001I\000\000\000\000\000\000\001I\001M\000\000\000\000\000\000\001I\000\000\000\000\001I\000\000\000\000\000\000\001M\001I\001I\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\001I\001\133\000\000\000\000\000\000\000\000\001\133\000\000\012\153\001\133\001I\001I\001I\000\000\001I\001I\000\000\012\153\000\000\001\133\000\000\001\133\000\000\001\133\001I\001\133\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001I\001\133\012\153\000\000\000\000\000\000\000\000\000\000\012\153\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001\133\001\133\001\133\000\000\000\000\0019\000\000\000\000\000\000\000\000\0019\000\000\000\157\0019\000\000\000\000\001\133\000\000\000\000\000\000\012\153\000\157\000\000\0019\000\000\0019\000\000\0019\000\000\0019\001\133\001\133\001\133\000\000\001\133\001\133\000\000\000\000\000\000\000\000\000\000\0019\000\000\000\000\000\000\000\000\000\000\0019\000\157\000\000\000\000\001\133\000\000\000\000\000\157\000\000\000\000\000\000\000\000\0019\000\000\000\000\001\133\000\000\0019\0019\0019\000\000\001\213\000\000\000\000\000\000\000\000\001\213\000\000\015\130\001\213\000\000\002\130\000\000\0019\000\000\000\000\000\000\000\157\000\000\001\213\000\000\000\000\000\000\001\213\000\000\001\213\000\000\0019\0019\0019\000\000\0019\0019\000\000\000\000\000\000\000\000\001\213\000\000\000\000\000\000\000\000\000\000\001\213\000\000\000\000\000\000\000\000\0019\015\134\000\000\000\000\001\213\000\000\000\000\001\213\000\000\000\000\000\000\0019\001\213\001\213\000\000\015\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\213\000Y\000\000\000\000\001\213\000\000\000Y\000\000\000Y\000\000\000\000\000\000\000\000\005\134\001\213\001\213\000\000\000Y\001\213\001\213\000Y\000\000\000\000\000\000\000Y\000Y\000\000\b\145\001\213\000\000\000\000\000\000\000\000\000\000\000\000\001\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000\000\001\213\000Y\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000Y\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000Y\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\000Y\002\246\000\000\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000Y\006\198\000\000\000Y\000\000\000\000\003Z\000\000\b\145\b\226\000\000\000\000\000Y\004Y\007\030\000Y\000\000\t&\004Y\003f\000\000\004Y\r\166\001\190\000\000\000\000\000\000\000\000\000Y\002\178\000\000\004Y\003\246\000\000\000\000\004Y\003\250\004Y\004\002\000\000\n\190\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004Y\000\000\000\000\000\000\005z\000\000\004Y\007\138\000\000\000\000\004Y\000\000\005\130\005\134\000\000\004Y\000\000\000\000\004Y\000\000\000\000\000\000\000\000\004Y\002\226\000\238\000\000\000\000\000\000\000\000\000\000\000\000\004Y\004Y\r\182\000\000\005\138\000\000\000\000\004Y\004Y\000\000\004r\004Y\000\000\012\022\000\000\000\000\000\000\000\000\012\022\000\000\000\000\004Y\004Y\000\000\000\000\004Y\004Y\000\000\000\000\t\202\000\000\000\000\000\000\000\000\t\202\004Y\012\026\000\000\000\000\000\000\000\000\012\242\004Y\n\002\n\026\n\"\n\n\n*\n\002\n\026\n\"\n\n\n*\004Y\000\000\000\000\000\000\n2\n:\000\000\000\000\000\000\n2\n:\000\000\000\000\nB\000\000\000\000\000\000\000\000\nB\000\000\000\000\000\238\000\000\000\000\000\000\000\000\000\238\000\000\000\000\000\000\t\210\n\018\nJ\nR\nb\t\210\n\018\nJ\nR\nb\000\000\000\000\nj\000\000\000\000\000\000\000\000\nj\000\000\000\000\000\000\nr\000\000\0035\000\000\000\000\nr\000\000\0035\000\000\000\000\0035\000\000\000\000\000\000\n\146\000\000\n\154\nZ\000\000\n\146\0035\n\154\nZ\nz\0035\000\000\0035\000\000\nz\000\000\000\000\n\130\n\138\000\000\000\000\000\000\n\130\n\138\0035\015\154\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\0035\000\000\000\000\000\000\000\000\0035\0035\0035\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\000\000\002\246\000\000\000\000\000\000\0035\000\000\000\000\000\000\0035\000\000\001\210\000\000\006\198\000\000\000\000\000\000\000\000\003Z\0035\0035\b\226\000\000\0035\0035\000\000\000\000\000\000\000\000\023B\000\000\003f\000\000\0035\003r\001\190\000\000\000\000\000\000\015\250\0035\002\178\000\000\000\000\003\246\0035\000\000\000\000\003\250\000\000\004\002\0035\n\190\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\021\178\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024\014\003f\005\138\000\000\n\174\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\000\000\n\190\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\166\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\n\198\006\198\000\000\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022J\003f\005\138\000\000\n\174\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005\194\n\190\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\000\000\000\000\005z\002\246\000\000\000\000\000\000\000\000\005\198\000\000\005\130\005\134\000\000\001\210\n\198\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\170\003f\005\138\000\000\003r\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\t\017\000\000\000\000\000\000\000\000\000\000\003V\002\190\000\000\005z\002\130\000\000\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\t\017\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\000\000\006\022\000\000\000\000\005\138\002\225\002\225\000\000\003f\002\225\004r\003r\001\190\000\000\002\225\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\002\225\003\250\000\000\004\002\005j\000\000\005v\002\225\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\002\225\000\000\000\000\002\225\002\225\000\000\005\130\005\134\000\000\005\202\002\225\000\000\000\000\002\225\000\000\000\000\002\225\002\225\000\000\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\138\000\000\t\017\000\000\002\225\000\000\004r\004A\004A\000\000\000\000\004A\002\225\002\225\000\000\002\225\004A\000\000\000\000\000\000\000\000\000\000\004A\000\000\000\000\000\000\004A\000\000\000\000\000\000\000\000\000\000\000\000\004A\022\250\000\000\002\225\023\018\000\000\000\000\002\225\000\000\002\225\000\000\000\000\000\000\004A\000\000\000\000\004A\004A\000\000\000\000\000\000\000\000\000\000\004A\000\000\000\000\004A\000\000\000\000\000\238\004A\000\000\004A\004A\000\000\004A\0035\000\000\000\000\000\000\0035\0035\000\000\000\000\0035\0035\000\000\004A\0035\000\000\000\000\000\000\000\000\000\000\0035\004A\004A\000\000\0035\000\000\0035\000\000\0035\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\015\154\000\000\000\000\0035\015\154\0035\004A\000\000\000\000\0035\000\000\000\000\004A\000\000\0035\000\000\000\000\0035\0035\000\000\000\000\0035\0035\0035\0035\000\000\0035\0035\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\0035\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\0035\0035\025\134\000\000\0035\0035\025\182\000\000\0035\0035\012\145\000\000\000\000\000\000\000\000\012\145\000\000\000\000\012\145\000\000\015\250\0035\000\000\000\000\015\250\0035\0035\000\000\012\145\000\000\0035\000\000\012\145\000\000\012\145\000\000\000\000\000\000\000\000\000\000\004\253\000\000\000\000\000\000\000\000\000\000\012\145\000\000\000\000\000\000\000\000\000\000\012\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\145\000\000\000\000\012\145\000\000\000\000\003V\002\190\012\145\012\145\002\130\000\000\006\166\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\145\001\210\000\000\006\198\012\145\000\000\000\000\000\000\003Z\000\000\000\000\b\226\000\000\000\000\012\145\012\145\002z\000\000\012\145\012\145\000\000\003f\000\000\000\000\t\014\001\190\000\000\000\000\012\145\000\000\000\000\002\178\026v\000\000\003\246\012\145\000\000\000\000\003\250\000\000\004\002\000\000\n\190\005v\005U\000\000\012\145\000\000\000\000\005U\000\000\000\000\005U\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\005U\005\130\005\134\000\000\005U\000\000\005U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005U\000\000\000\000\000\000\000\000\000\000\005U\005\138\000\000\000\000\000\000\000\000\007\222\004r\000\000\005U\000\000\000\000\005U\000\000\000\000\000\000\000\000\005U\005U\000\238\000\000\005Y\000\000\000\000\000\000\000\000\005Y\000\000\000\000\005Y\000\000\000\000\000\000\005U\005U\000\000\000\000\005U\000\000\005Y\000\000\000\000\000\000\005Y\000\000\005Y\000\000\005U\005U\000\000\000\000\005U\005U\000\000\000\000\000\000\000\000\005Y\000\000\000\000\000\000\000\000\000\000\005Y\000\000\0035\000\000\000\000\005U\007\222\0035\000\000\005Y\0035\000\000\005Y\000\000\000\000\000\000\005U\005Y\005Y\000\238\0035\000\000\000\000\000\000\0035\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\005Y\005Y\000\000\000\000\005Y\0035\015\154\000\000\000\000\000\000\000\000\0035\000\000\000\000\005Y\005Y\000\000\000\000\005Y\005Y\0035\000\000\000\000\0035\000\000\000\000\000\000\000\000\0035\0035\0035\006\001\000\000\000\000\000\000\005Y\006\001\000\000\000\000\006\001\000\000\000\000\000\000\000\000\0035\000\000\005Y\000\000\0035\006\001\000\000\000\000\000\000\006\001\000\000\006\001\000\000\000\000\0035\0035\017\130\000\000\0035\0035\000\000\000\000\000\000\006\001\000\000\000\000\000\000\000\000\000\000\006\001\000\000\000\000\000\000\000\000\015\250\0035\000\000\000\000\006\001\000\000\000\000\006\001\000\000\000\000\000\000\000\000\006\001\006\001\000\238\000\000\000\000\000\000\000\000\000\000\025^\000\000\000\000\000\000\000\000\000\000\003V\002\190\006\001\000\000\002\130\000\000\006\001\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\006\001\006\001\021>\001\210\006\001\006\001\000\000\000\000\000\000\000\000\003Z\001\202\001\206\000\000\006\001\000\000\000\000\000\000\000\000\000\000\000\000\006\001\000\000\003f\000\000\000\000\003r\001\190\000\000\000\000\001\210\001\214\006\001\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\005\238\000\000\000\000\000\000\001\246\002\162\003V\002\190\005z\002\158\002\130\002\178\004\030\004*\000\000\002\246\005\130\005\134\0046\005\202\000\000\000\000\003\254\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\004:\000\000\000\000\004\209\000\000\005\138\000\000\006\146\000\000\b\202\003f\004r\000\000\003r\001\190\000\000\000\000\000\000\000\000\026\002\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\006.\000\000\000\000\000\000\000\000\000\000\003V\002\190\000\000\005z\002\130\000\000\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\006R\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\006:\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\003f\002\130\004r\003r\001\190\000\000\002\246\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\000\000\005v\003Z\000\000\000\000\000\000\000\000\007\129\000\000\000\000\007\129\000\000\000\000\005z\000\000\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\005\202\002\178\007\129\007\129\003\246\007\129\007\129\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\138\006M\000\000\000\000\005z\007\129\004r\003V\002\190\000\000\000\000\002\130\005\130\005\134\000\000\005\202\002\246\000\000\000\000\000\000\000\000\006M\000\000\007\129\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\005\138\011\166\000\000\000\000\000\000\000\000\004r\003V\002\190\000\000\003f\002\130\000\000\003r\001\190\000\000\002\246\007\129\000\000\007\129\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\005\226\005v\003Z\007\129\007\129\000\000\000\000\000\000\007\129\000\000\007\129\000\000\000\000\005z\007\129\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\011\178\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\005z\002\130\004r\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\011\190\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\003f\002\130\004r\003r\001\190\000\000\002\246\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\000\000\005v\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\005\202\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\138\006q\000\000\000\000\005z\000\000\004r\000\000\002\190\000\000\000\000\002\130\005\130\005\134\000\000\005\202\002\246\000\000\000\000\000\000\000\000\006q\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\005\138\000\000\000\000\000\000\000\000\002\254\004r\000\000\000\000\000\000\000\000\000\000\000\000\0032\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003:\000\000\000\000\000\000\b\026\b\030\b*\000\000\000\000\005v\000\000\000\000\000\000\006\249\007\030\000\000\000\000\000\000\006\249\000\000\000\000\006\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\006\249\000\000\000\000\000\000\006\249\000\000\006\249\000\000\001\181\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001\181\000\000\006\249\000\000\000\000\000\000\005\138\b2\006\249\007\138\001\181\bJ\004r\000\000\001\181\000\000\001\181\006\249\000\000\000\000\006\249\000\000\000\000\000\000\000\000\006\249\006\249\000\238\001\181\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\000\000\000\000\000\000\006\249\000\000\001\181\000\000\006\249\001\181\000\000\000\000\000\000\000\000\001\181\001\181\001\181\000\000\006\249\006\249\000\000\000\000\006\249\006\249\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001\217\001\181\000\000\000\000\000\000\001\217\006\249\000\000\001\217\000\000\000\000\001\181\001\181\000\000\000\000\001\181\001\181\000\000\001\217\000\000\000\000\017\142\001\217\000\000\001\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\001\217\001\181\000\000\000\000\000\000\000\000\001\217\000\000\000\000\006\005\000\000\000\000\000\000\000\000\006\005\001\217\000\000\006\005\001\217\000\000\000\000\000\000\000\000\001\217\001\217\000\000\000\000\006\005\000\000\000\000\000\000\006\005\000\000\006\005\000\000\000\000\000\000\000\000\000\000\001\217\000\000\000\000\000\000\001\217\000\000\006\005\000\000\000\000\000\000\000\000\000\000\006\005\000\000\001\217\001\217\000\000\000\000\001\217\001\217\000\000\006\005\000\000\000\000\006\005\000\000\000\000\000\000\001\217\006\005\006\005\000\238\000\000\000\000\000\000\001\217\000\000\000\000\000\000\000\000\021\026\000\000\000\000\000\000\000\000\006\005\001\217\012\145\000\000\006\005\000\000\000\000\012\145\000\000\000\000\012\145\000\000\000\000\000\000\006\005\006\005\000\000\000\000\006\005\006\005\012\145\000\000\000\000\000\000\012\145\000\000\012\145\000\000\006\005\000\000\000\000\000\000\004\253\000\000\000\000\006\005\000\000\000\000\012\145\000\000\000\000\000\000\000\000\000\000\012\145\000\000\006\005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\145\000\000\000\000\000\000\000\000\012\145\012\145\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012I\000\000\002\190\012I\000\000\028\002\000\000\012\145\000\000\000\000\028\006\000\000\000\000\012I\000\000\000\000\000\000\000\000\000\000\012I\000\000\012\145\012\145\002z\000\000\012\145\012\145\000\000\000\000\000\000\000\000\012I\000\000\000\000\000\000\012\145\000\000\012I\000\000\026\174\000\000\000\000\012\145\001\002\001\190\000\000\012I\000\000\000\000\012I\000\000\000\000\000\000\012\145\012I\004Y\000\000\000\000\000\000\000\000\004Y\000\000\028\n\004Y\000\000\000\000\000\000\000\000\000\000\000\000\012I\000\000\000\000\004Y\012I\000\000\000\000\004Y\000\000\004Y\000\000\000\000\000\000\028\014\012I\012I\000\000\000\000\012I\000\000\000\000\004Y\000\000\000\000\000\000\000\000\000\000\004Y\b1\b1\000\000\000\000\b1\007\222\000\000\012I\004Y\b1\000\000\004Y\000\000\000\000\000\000\016*\004Y\002\226\000\238\b1\000\000\000\000\000\000\000\000\000\000\000\000\b1\000\000\000\000\000\000\000\000\000\000\004Y\000\000\000\000\000\000\004Y\000\000\000\000\b1\000\000\000\000\b1\b1\000\000\000\000\004Y\004Y\000\000\b1\004Y\004Y\b1\000\000\000\000\000\000\b1\000\000\b1\b1\007J\b1\000\000\000\000\000\000\000\000\001q\004Y\000\000\000\000\000\000\001q\025~\b1\001q\000\000\000\000\000\000\004Y\000\000\000\000\b1\b1\000\000\001q\000\000\001q\000\000\001q\000\000\001q\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\000\000\001q\000\000\000\000\b1\000\000\000\000\001q\000\000\000\237\b1\000\000\000\000\000\237\000\000\000\237\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\001q\001q\000\238\000\237\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\237\000\238\000\000\001q\001q\001q\000\000\001q\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\241\000\237\000\000\000\000\000\000\000\241\001q\000\000\000\241\000\000\000\000\000\237\000\237\000\000\000\000\000\237\000\237\001q\000\241\000\000\000\000\000\000\000\241\000\000\000\241\000\000\006\245\000\000\000\000\000\000\000\000\006\245\000\237\000\000\006\245\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\241\000\237\006\245\000\000\000\000\000\000\006\245\000\000\006\245\000\241\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\241\000\241\000\238\006\245\000\000\000\000\000\000\000\000\000\000\006\245\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\006\245\000\000\000\241\006\245\000\000\000\000\000\000\000\000\006\245\006\245\000\000\000\000\000\241\000\241\000\000\000\000\000\241\000\241\000\000\000\000\000\000\000\000\000\000\000\000\006\245\000\000\000\000\000\000\006\245\000\000\000\000\000\000\000\000\000\241\000\000\006\201\006\201\000\000\006\245\006\245\016\194\000\000\006\245\006\245\000\241\005\249\000\000\000\000\000\000\000\000\005\249\000\000\000\000\005\249\006\201\006\201\006\201\000\000\000\000\006\245\017b\000\000\000\000\005\249\006\201\000\000\000\000\005\249\000\000\005\249\000\000\005a\007\030\000\000\000\000\000\000\005a\006\201\006\201\005a\000\000\005\249\006\201\000\000\006\201\006\201\006\201\005\249\000\000\005a\000\000\006\201\000\000\005a\000\000\005a\005\249\000\000\000\000\005\249\000\000\000\000\000\000\000\000\005\249\005\249\000\000\005a\006\201\000\000\000\000\000\000\000\000\005a\007\138\000\000\000\000\000\000\000\000\000\000\005\249\000\000\000\000\000\000\005\249\005a\000\000\000\000\000\000\000\000\005a\005a\000\238\000\000\005\249\005\249\000\000\000\000\005\249\005\249\000\000\000\000\000\000\000\000\011\249\000\000\005a\000\000\000\000\011\249\000\000\004\230\011\249\000\000\000\000\005\249\000\000\000\000\000\000\000\000\005a\005a\011\249\000\000\005a\005a\011\249\000\000\011\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\249\005a\000\000\000\000\000\000\000\000\011\249\000\000\000\000\000\000\000\000\000\000\000\000\001\202\002~\011\249\000\000\002\130\011\249\000\000\000\000\000\000\000\000\011\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\000\000\011\249\t\190\000\000\001\242\011\249\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\249\011\249\002\138\002\146\011\249\011\249\000\000\002\158\000\000\002\178\004\030\004*\0041\000\000\000\000\000\000\020\242\0041\026Z\004)\0041\011\249\000\000\000\000\004)\000\000\000\000\004)\000\000\000\000\0041\000\000\n\162\004:\0041\000\000\0041\004)\000\000\000\000\000\000\004)\005\134\004)\000\000\000\000\000\000\000\000\0041\000\000\000\000\000\000\026f\000\000\0041\004)\000\000\000\000\000\000\000\000\000\000\004)\000\000\0041\000\000\000\000\0041\000\000\000\000\021\006\004)\0041\000\000\004)\000\000\000\000\000\000\000\000\004)\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0041\000\000\000\000\000\000\0041\004I\000\000\004)\000\000\000\000\004I\004)\004\025\004I\0041\0041\000\000\004\025\0041\0041\004\025\004)\004)\004I\000\000\004)\004)\004I\000\000\004I\004\025\000\000\000\000\000\000\004\025\0041\004\025\000\000\000\000\000\000\000\000\004I\004)\000\000\000\000\000\000\016\234\004I\004\025\000\000\000\000\000\000\000\000\019\214\004\025\000\000\004I\000\000\000\000\004I\000\000\000\000\000\000\004\025\004I\000\000\004\025\000\000\000\000\000\000\000\000\004\025\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004I\000\000\000\000\n\222\004I\000\000\000\000\004\025\000\000\001\202\001\206\004\025\000\000\000\000\004I\004I\000\000\000\000\004I\004I\000\000\004\025\004\025\002\142\000\000\004\025\004\025\000\000\001\210\001\214\001\230\000\000\000\000\000\000\000\000\004I\000\000\000\000\001\242\000\000\000\000\000\000\004\025\000\000\000\000\001\250\020\182\006\205\006\205\000\000\000\000\001\246\002\146\024.\000\000\000\000\002\158\000\000\002\178\004\030\004*\000\000\000\000\004.\000\000\0046\006\205\006\205\006\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\205\000\000\000\000\000\000\000\000\000\000\004:\000\000\000\000\000\000\000\000\000\000\000\000\006\205\006\205\000\000\000\000\000\000\006\205\000\000\006\205\006\205\006\205\000\000\0049\000\000\000\000\006\205\000\000\0049\000\000\004!\0049\000\000\000\000\015\138\004!\000\000\000\000\004!\000\000\000\000\0049\000\000\006\205\000\000\0049\000\000\0049\004!\000\000\000\000\000\000\004!\000\000\004!\000\000\000\000\000\000\000\000\0049\000\000\000\000\000\000\000\000\000\000\0049\004!\000\000\004Q\000\000\000\000\000\000\004!\004Q\000\000\000\000\004Q\0049\000\000\004\"\000\000\006\205\0049\000\000\004!\000\000\004Q\000\000\000\000\004!\004Q\000\000\004Q\000\000\000\000\000\000\000\000\000\000\0049\000\000\000\000\000\000\000\000\000\000\004Q\004!\000\000\000\000\000\000\000\000\004Q\000\000\0049\0049\000\000\000\000\0049\0049\000\000\004!\004!\000\000\004Q\004!\004!\000\000\000\000\004Q\011*\000\000\000\000\000\000\000\000\0049\001\202\001\206\000\000\000\000\000\000\000\000\004!\000\000\000\000\004Q\018\018\000\000\000\000\000\000\000\000\000\000\003\254\020b\000\000\001\210\001\214\001\230\000\000\004Q\004Q\000\000\000\000\004Q\004Q\001\242\004m\000\000\000\000\000\000\000\000\000\246\000\000\000\000\002\194\000\000\000\000\000\000\001\246\002\146\004Q\000\000\000\000\002\158\003\178\002\178\004\030\004*\004m\000\000\003\182\020\222\0046\007\149\000\000\000\000\007\149\000\000\000\000\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\016\174\004:\000\000\000\000\007\149\007\149\000\000\007\149\007\149\024Z\000\000\000\000\017\018\000\000\000\000\000\000\000\000\017*\000\000\000\000\000\000\007m\000\000\000\000\007m\000\000\000\000\000\000\007\149\000\000\000\000\000\000\000\000\0172\000\000\000\000\000\000\004n\000\000\004r\007m\007m\000\000\007m\007m\000\000\000\238\017F\017r\000\000\000\000\004m\004m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007m\000\000\007\153\000\000\021\154\007\153\000\000\000\000\000\000\000\000\000\000\000\000\007\149\000\000\007\149\000\000\000\000\000\000\007m\000\000\000\000\007\153\007\153\000\000\007\153\007\153\007\149\000\000\000\000\005\234\007\149\000\000\000\000\000\000\007\149\007\137\007\149\000\000\007\137\000\000\007\149\000\000\000\000\000\000\000\000\007\153\000\000\000\000\007m\000\000\007m\000\000\000\000\000\000\007\137\007\137\000\000\007\137\007\137\000\000\000\000\000\000\007m\000\238\000\000\005\234\007m\000\000\000\000\000\000\007m\000\000\007m\000\000\000\000\000\000\007m\000\000\007\137\000\000\rI\rI\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\153\000\000\007\153\000\238\000\000\000\000\rI\rI\rI\0072\000\000\000\000\000\000\000\000\007\153\000\000\rI\005\234\007\153\000\000\000\000\000\000\007\153\000\000\007\153\001\202\001\206\022N\007\153\rI\rI\000\000\000\000\007\137\rI\007\137\rI\rI\rI\000\000\000\000\000\000\000\000\rI\001\210\002\170\001\230\006*\000\000\000\000\005\234\007\137\000\000\000\000\001\242\007\137\000\000\007\137\000\000\000\000\rI\007\137\000\000\001\202\001\206\022\174\000\000\001\246\002\146\000\000\000\000\000\000\002\158\000\000\002\178\004\030\004*\000\000\000\000\000\000\000\000\0046\001\210\002\170\001\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\000\000\000\000\000\000\000\246\000\000\004:\002\194\000\000\000\000\000\000\000\000\000\000\001\246\002\146\000\000\000\000\004\141\002\158\000\000\002\178\004\030\004*\003\182\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\016\174\000\000\000\000\004:\000\000\000\000\000\000\000\000\000\000\024Z\000\000\000\000\017\018\000\000\000\000\000\000\000\000\017*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017F\017r\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\154")) + ((16, "C\170R\004Ff\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021HFf\000\000\000\000\020XFfC\170\020\182\000-\000[\\\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\238\004\184\000F\000\000\001v\t|\000\000\005R\002d\nt\000\000\000\244\002\204\011l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\220\000\000\000\000\000\000\002BU2\000\000\000\000\000\000\001\148\000\000\000\000\000\000\002\238\004\026\000\000\000\000U2J\014\020X\021\178]`\020Xf\166R\004\020XN`\000\000\005\144\000\000Dp\b\160\000\000C\146\000\000\027\158\000\000\000\000\003\224\000\000\001\148\000\000\000\000\000\000\006B\000\000C\146\000\000\0046w@_ e\002\000\000\132\182\134f\000\000Mr`\202\000\000Y~\026\206p\158\001\148q&FfC\170\000\000\000\000R\004\020XSNDp\005.w@\000\000\128\252FfC\170R\004\020X\000\000\000\000\016x\023\022\001N\006&\000\000\005&\007\030\000\000\000\000\000\000\000\000\000\000\020X\000\000A\206i\228C\170\000\000\000\000Q\240\020XG\030X\234\000\000\004\002\000\000\000\000\004\250\000\000\000\000I\182\004\002\024\138\003\130\0020\000\000\000\000\003\014\000\000\021\178\006\030\006P\020X\028\254\020XC\170C\170\000\000R\012Q\182\020X\028\254A\248\020X\000\000\000\000\000\000R\004\020X\000\000\000\248\000\000X\234z\006z\148\000\000\006&\000\000\006\228\000\000\000\000C,U2\134\178\000\000h\206\134\178\000\000h\206h\206\000b\002\236\0008\000\000\020\190\000\000\b\004\000\000\000\000\bZ\000\000\000\000\000\000h\206\001\148\000\000\000\000X\000U2U\166`\202\000\000\000\000OL\000b\000\000\000\000`\202\b\004U2\000\000PB`\202Q8\000\000\000\000\000\000\004Z\000\000h\206\000\000\001\000\137J\000\000U2\005\216U2\000\000\022\\\t$\001\148\000\000\000\000\023\224\000\000\006\208\000\000Z\162\b\006\000\000\b\244h\206\n\198\000\000\011\190\000\000\007\200\000\000\000\000\007\160\000\000\000\000\000\000\021 4X\234Q\240\020XX\234\000\000\000b\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000N\\\027v\000\000\000\000\000\000\001\244&\174t\134\000\000\000\000Q\240\020XX\234\000\000\000\000rvX\234{\178z\148\000\000\136x\000\000X\234\000\000\000\000Y\214I\182\001\154\001\154\000\000\n\156X\234\000\000\000\000\000\000\004\250\011*\000\000A\012\000\000\000\000{ \000\000\136\192h\206\000\000\004b\000\000\000\000{h\000\000\137\026\t\002\000\000\000\000\000\000\000\000\011\128\000\000\022\168\000\000\000\000{ \000\000\005\242\000\000\000\000DHu\018\000\000\000\000Bn\023|\019\252\023\174\000\000\000\000\000\000\000\000\001F\000\000\000\000[l\b\164\011h\000\017U2\002\204\011\196\000\000\000\000\b\200\011h\b\156\000\000i\250R,Q\182\020X\028\254\000-\000\018\0020\000\000\012.\021\178\021\178\000-\000\018\000\018\021\178\000\000j\140\t\012Dp\006&\006d\137\164\000\000U2e\162U2`\000fBU2\006`U2f\220\000\000\t\238\b\252\tL\021\178k&\000\000\005B\t\190]\130\000\000\000\000\000\000\000\000\021\178k\192\021\178lZ\020d\0008`\160\007\030\0008`\248\000\000l\244\t\012\000\000\000\000\000\000\001B\000\000\000\000\003\144\000\000\004\172\028\254\000\000^@A\248\000\000\031\138\000\000\000\000\021\178\002\152\000\000\000\000\000\000\000\000\\$\000\000\003\184\000\000Vr\001\130\006\026\000\000\0226W\204R\004\020XH(\158\000\000\012H\b\184\000\00056\000\000\012\160\t\176\000\0006.\000\000\r\172\n\168\000\0007&\012$\025\016\000\000\r@\011\160\000\0008\030\000\000\r\152\012\152\000\0009\022\000\000\014\002\r\144\000\000:\014\014\136\000\000;\006\015\128\019`\000\000\000\000\000\000\r\186\000\000\000\000\r\156\000\000\000\000\014`\000\000\b\026\000\000\000\000\000\000\015^\000\000\015\130\000\000\000\000Lz\001\154\016Dq\168`\202\000b\000\000\000\000q\168\000\000\000\000\000\000q\168\000\000\016&\000\000\000\000\000\000\000\000\000\000\000\000;\254X\234\000\000\000\000\016j\000\000<\246\000\000=\238\000\000#\250\000\000\000\000\011\210\000\000\000\000X\234\000\000\000\000}\180\014\018\000\000\000\000H\240\000\000\b\240\000\000\000\000W6\000\000\r\178\000\000\000\000\001\130\n\244\000\000\000\000\0226\022\028\006&\000\000A\214\000\000!,\023\176\021\220\000\000\000\000\014|\000\000\000\000\001\238\025\030W\214\000\000\025\030\000\000\rD\000\000\000\000\014\164\000\000\000\000g~\005\212\004H\000\000\000\000\012\186\000\000\000\000\014\144\000\000\000\000\000\000\020X\028\254\004\176\000\000\000\000\023&\003\130\0020\b`\028\254x.\021\178\001B\028\254x\172\015\242\000\000\000\000\b`\000\000I\248\019\248\021\204\000\000\n@\016l\000\000\016v\000V`\202\003\130\000\000\016J\015\214p\158\012\156U2\030\128\020F\t\142\004\248\000\000\031x\016\148\000\000\tT\000\000\000\000\016\170`\202a\152\000\000g\208`\202\016\138`\202n\024b8\001N\016R\000\000\000\000\000\000\020X\129F\000\000X\234q\246\000\000\000\000\016\210\000\000\000\000\000\000>\230\017\030z\006?\222h|\000\000\000\000F\138\000\000\006\026\000\000IZ\000\000\020X\000\000\021\178\006x\000\000\128\252\000\000\020X\028\254\128\252\000\000\025D\023\022\001N\001\148\130\218\021\178~Bq\246\000\000\007b\n\160\0020\b`q\246\133*\003\130\0020\b`q\246\133*\000\000\000\000\b`q\246\000\000FfC\170X\234\027B\000\000\000\000FfC\170Q\182\020X\028\254\128\252\000\000\020\182\000-\000[\016HU2\rt\017\006\131\154\000\000q\246\000\000I\248\019\248\021\204y\004\023\228\012\030~v\bj\016d\020Xq\246\000\000\020Xq\246\000\000h\206f\166\019\134\002\222\001N\0008P\012\000\000\001N\0008P\012\000\000\0274\023\022\001N\001\148Q\002\021\178q\246\000\000\007b\011\152\0212\014~\000\000P\012\000\000\0020\016h\021\178q\246\135(\003\130\0020\016n\021\178q\246\135(\000\000\000\000\tX\000\000\128\208\000\000\021\178\131\206P\012\000\000\tX\000\000J\014\020X\021\178q\246\000\000I\248\019\248\021\204r\144B\138\026\222\019\170\002\142\000\000\014^C\146\000\017\000\000\017\002\016\176\024\196\020XU\218U2\tH\000\000X\184\001N\007\188\r\230\000\000\r\212\000\000\017\018\016\156U2PJ\000\000\0032\002:\014\192\000\000\014\204\000\000\017\022\016\162p\158\014 U2MzPJ\000\000Vr\020X\024\196\017D\007~\001N\000\000\014b\024\196U2\n\224\000b\000\000U2\004\018\005\n\000\000\000\000nr\000\000\000\000\014\192\024\196n\240PJ\000\000\020XU2\014 U2W~PJ\000\000\0154\000\000\000\000PJ\000\000\000\000X\184\000\000q\246\1338\019\170\002\142\014^\0178\016\238\024\196q\246\1338\000\000\000\000\019\170\002\142\014^\017F\016\224O\030Mh`\202\017fO\030h\206\020\184\017hO\030`\202\017lO\030o\144p\016\000\000\129\214\000\000\000\000q\246\1356\019\170\002\142\014^\017l\016\250O\030q\246\1356\000\000\000\000\000\000f\166\000\000\000\000\000\000\000\000\000\000\000\000\000\000P\012\000\000\133\202\020XDp\017vw@\000\000\128\252\133\202\000\000\000\000\135\130\020XDp\017~\017\012_ \135\250\003\130\017\196\000\000\000\000p\142r\144\020X\000\000\127\018\021\204\000\000\000\000\128\252\135\130\000\000\000\000\000\000y\128D\228F\134\003\130\017\220\000\000\000\000\000\000r\144\020X\000\000\003\130\017\226\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015XB\138\019\170\002\142\014^\017\180s\000\023\204\020XG\030[:\020(\001N\003\130\017\182\nt\000\000\000\000\017d\000\000\000\000e0\000\000\n\254\014\222\000\000\015*\000\000\017\186\017NU2dn\017\210\n\158\000\000\000\000\017\132\000\000\000\000\020F\0032\015\020\000\000\017\222s\130\138\022\001\154\017\150U2\015\024\000\000\000\000\017\168\000\000\000\000\000\000e0\000\000\0070\015j\000\000\015\214\000\000\018\n\017\148p\158\000\000\018\014t\004\138,\001\154\017\174U2\015j\000\000\000\000\017\196\000\000\000\000\000\000\020X\000\000e0\000\000\020z\020X\023\204\023\204u\242Ff\020X\129FX\234\021\162\000\000\012\020\001N\000\000\015\004\023\204U2\012~\006&\000\000\020XX\234s\000\023\204\015\142\023\204\000\000D\142Et\000\000b\146\000\000\000\000c.\000\000\000\000c\202\000\000\015\184\023\204df\129FX\234\021\162\000\000\000\"\000\000\000\000O\030\015\242\000\000\000\000a\198\018\"\000\000e0\000\000\023\204a\198e0\000\000\020XU2e0\000\000\015\136\000\000\000\000e0\000\000\000\000[:\000\000\130\nO\030\017\212\023\204\130\166s\000\000\000q\246\133\216\019\170\002\142\014^\0180s\000q\246\133\216\000\000\000\000\000\000\136BQ\240\000\000\000\000\000\000\000\000\000\000\000\000\132`q\246\000\000\133\202\000\000\000\000\000\000\000\000q\246\136B\000\000\018p\000\000\000\000\132`\018t\000\000q\246\136B\000\000\000\000\016,\000\000\000\000it\0032\000\000\000\000B\158\000\000U2\rz\000\000[:\016\198\000\000\000\000\000\000\015\184\000\000\000\000\000\000RZ\020X\028\254\007\170\000\000N\150\000\000\007p\000\000\000*\000\000\000\000\018\138\000\000\018\178z\006\000\000@\214\018\138\000\000\000\000\018~\026R\028B\021\204vz\023\228\020X\000\000q\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000v\130\023\228\020X\000\000\n\003B\nJ\t=\001\206\t=\023\238\003F\000\238\002\254\025\150\t=\t=\003\214\003\218\t=\003\222\0032\003\234\003\242\007\030\007Z\t=\t=\002\178\001\206\007:\003:\t=\t=\t=\bz\b~\b\138\b\158\001*\005v\t=\t=\t=\t=\t=\t=\t=\t=\t=\t\018\000\238\t=\015\198\t=\t=\003\145\t\030\t6\t\130\005\130\005\134\t=\t=\t=\r\234\t=\t=\t=\t=\002j\002\154\014\026\t=\006\250\t=\t=\0035\t=\t=\t=\t=\t=\t=\005\138\b\146\t=\t=\t=\b\170\004r\t\150\0035\t=\t=\t=\t=\r\r\r\r\023\242\011&\004\154\r\r\0112\r\r\r\r\001j\r\r\r\r\r\r\r\r\004M\r\r\r\r\001f\r\r\r\r\r\r\003i\r\r\r\r\r\r\r\r\004M\r\r\016&\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\b\030\007f\006\226\r\r\004\226\r\r\r\r\r\r\r\r\r\r\004M\r\r\r\r\004M\r\r\003\238\r\r\r\r\r\r\000\238\b\"\r\r\r\r\r\r\r\r\r\r\r\r\r\r\000\238\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\004M\r\r\r\r\007\226\r\r\r\r\001r\004M\001\218\004M\r\r\r\r\r\r\r\r\r\r\004M\r\r\r\r\r\r\r\r\r\r\000\238\r\r\r\r\006\001\r\r\r\r\000\238\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\r\b\130\004M\r\r\r\r\r\r\r\r\001\181\001\181\001\181\001\222\015\134\001\181\006\018\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\0152\001\181\006\230\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\003\134\003\138\001\181\019B\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\007>\001\181\001\181\001\181\006\001\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\019J\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\130\001\181\001\181\018\214\bZ\007f\b1\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\014\246\b\194\001\181\005\186\001\181\001\181\b^\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\181\001\182\001\181\001\181\001\181\001\181\001\181\nu\nu\002\225\007\226\r1\nu\003\149\nu\nu\001\146\nu\nu\nu\nu\001\186\nu\nu\r1\nu\nu\nu\000\238\nu\nu\nu\nu\001\198\nu\000\n\nu\nu\nu\nu\nu\nu\nu\nu\025*\007f\003\146\nu\004M\nu\nu\nu\nu\nu\000\238\nu\nu\004B\nu\001\234\nu\nu\nu\002\225\025.\nu\nu\nu\nu\nu\nu\nu\004M\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\003\149\nu\nu\007\226\nu\nu\004M\004M\007f\004M\nu\nu\nu\nu\nu\004\t\nu\nu\nu\nu\t\174\000\238\t\222\nu\004^\nu\nu\b*\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\nu\015\206\nu\nu\nu\nu\nu\003\173\003\173\005\225\007\226\003\150\003\173\002N\003\173\003\173\000\238\003\173\003\173\003\173\003\173\000\238\003\173\003\173\006\153\003\173\003\173\003\173\000\238\003\173\003\173\003\173\003\173\002R\003\173\b>\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\006\153\007f\004\t\003\173\000\238\003\173\003\173\003\173\003\173\003\173\b\213\003\173\003\173\001\206\003\173\t\025\003\173\003\173\003\173\bv\b\242\003\173\003\173\003\173\003\173\003\173\003\173\003\173\006^\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\b\233\t\166\t\214\007\226\003\173\003\173\004\210\003^\006b\000\238\003\173\003\173\003\173\003\173\003\173\002v\003\173\003\173\003\173\003\173\t\174\000\238\t\222\003\173\b\130\003\173\003\173\003b\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\003\173\000\238\003\173\003\173\003\173\003\173\003\173\003\161\003\161\000\238\001f\003i\003\161\b\213\003\161\003\161\t\025\003\161\003\161\003\161\003\161\001\238\003\161\003\161\006\165\003\161\003\161\003\161\b2\003\161\003\161\003\161\003\161\007:\003\161\b>\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\006\165\b\233\004M\003\161\000\238\003\161\003\161\003\161\003\161\003\161\b\209\003\161\003\161\001\206\003\161\004\214\003\161\003\161\003\161\015^\004M\003\161\003\161\003\161\003\161\003\161\003\161\003\161\004M\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\000\238\t\166\t\214\001f\003\161\003\161\003i\003j\tF\000\238\003\161\003\161\003\161\003\161\003\161\002\214\003\161\003\161\003\161\003\161\t\174\012\209\t\222\003\161\004B\003\161\003\161\003n\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\003\161\012\209\003\161\003\161\003\161\003\161\003\161\t\229\t\229\t\021\tJ\tf\t\229\b\209\t\229\t\229\000\238\t\229\t\229\t\229\t\229\003\018\t\229\t\229\006\166\t\229\t\229\t\229\015*\t\229\t\229\t\229\t\229\004M\t\229\007\194\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\006\253\007f\006\170\t\229\027\215\t\229\t\229\t\229\t\229\t\229\003\158\t\229\t\229\002\190\t\229\012\178\t\229\t\229\t\229\006\253\016\162\t\229\t\229\t\229\t\229\t\229\t\229\t\229\000\238\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\002f\t\229\t\229\007\226\t\229\t\229\t\021\002&\007f\004M\t\229\t\229\t\229\t\229\t\229\003\n\t\229\t\229\t\229\t\229\t\229\000\238\t\229\t\229\003\162\t\229\t\229\016\190\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\t\229\006\253\004M\t\229\t\229\t\229\t\229\t\245\t\245\004\242\007\226\b\134\t\245\0126\t\245\t\245\000\238\t\245\t\245\t\245\t\245\004\014\t\245\t\245\000\238\t\245\t\245\t\245\000\238\t\245\t\245\t\245\t\245\t\005\t\245\012:\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\004\018\002j\007\154\t\245\007v\t\245\t\245\t\245\t\245\t\245\t\014\t\245\t\245\003\022\t\245\012\202\t\245\t\245\t\245\022\206\007~\t\245\t\245\t\245\t\245\t\245\t\245\t\245\000\238\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\026\154\t\245\t\245\022\214\t\245\t\245\004M\004M\007f\t\005\t\245\t\245\t\245\t\245\t\245\003\026\t\245\t\245\t\245\t\245\t\245\004M\t\245\t\245\b)\t\245\t\245\025\138\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\t\245\000\238\t\005\t\245\t\245\t\245\t\245\t\237\t\237\019\022\007\226\b>\t\237\005R\t\237\t\237\025z\t\237\t\237\t\237\t\237\000\238\t\237\t\237\000\238\t\237\t\237\t\237\000\238\t\237\t\237\t\237\t\237\005F\t\237\000\238\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\b>\026\158\019\030\t\237\004V\t\237\t\237\t\237\t\237\t\237\005\233\t\237\t\237\000\238\t\237\012\226\t\237\t\237\t\237\r\178\005&\t\237\t\237\t\237\t\237\t\237\t\237\t\237\b\230\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\004\174\t\237\t\237\011z\t\237\t\237\019\134\004V\007f\005J\t\237\t\237\t\237\t\237\t\237\003\022\t\237\t\237\t\237\t\237\t\237\025~\t\237\t\237\004r\t\237\t\237\027.\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\t\237\012\213\004\214\t\237\t\237\t\237\t\237\t\217\t\217\004b\007\226\007:\t\217\007\021\t\217\t\217\017\190\t\217\t\217\t\217\t\217\012\213\t\217\t\217\r\182\t\217\t\217\t\217\000\238\t\217\t\217\t\217\t\217\t\001\t\217\014\142\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\006v\006\242\007\n\t\217\002\006\t\217\t\217\t\217\t\217\t\217\015v\t\217\t\217\007j\t\217\012\250\t\217\t\217\t\217\007\018\016r\t\217\t\217\t\217\t\217\t\217\t\217\t\217\015~\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\007\026\t\217\t\217\005\002\t\217\t\217\001\222\007\166\001\002\001\190\t\217\t\217\t\217\t\217\t\217\019\006\t\217\t\217\t\217\t\217\t\217\006e\t\217\t\217\003\137\t\217\t\217\0022\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\t\217\006e\015\206\t\217\t\217\t\217\t\217\t\225\t\225\015\242\005\225\007:\t\225\003}\t\225\t\225\000\238\t\225\t\225\t\225\t\225\007\198\t\225\t\225\014\146\t\225\t\225\t\225\005.\t\225\t\225\t\225\t\225\001v\t\225\011\134\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\011\246\002\190\007\170\t\225\007\178\t\225\t\225\t\225\t\225\t\225\018~\t\225\t\225\000\238\t\225\r\014\t\225\t\225\t\225\001\222\007\218\t\225\t\225\t\225\t\225\t\225\t\225\t\225\018\138\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\001\206\t\225\t\225\011\150\t\225\t\225\n\022\t\234\001\002\001\190\t\225\t\225\t\225\t\225\t\225\002\142\t\225\t\225\t\225\t\225\t\225\006m\t\225\t\225\011\142\t\225\t\225\t\238\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\t\225\006m\026\018\t\225\t\225\t\225\t\225\t\221\t\221\003\134\003\138\n\250\t\221\012z\t\221\t\221\000\238\t\221\t\221\t\221\t\221\006\030\t\221\t\221\017\006\t\221\t\221\t\221\012^\t\221\t\221\t\221\t\221\001\134\t\221\012~\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\0056\014\178\011\186\t\221\012b\t\221\t\221\t\221\t\221\t\221\022B\t\221\t\221\019\158\t\221\r\"\t\221\t\221\t\221\015\182\012\170\t\221\t\221\t\221\t\221\t\221\t\221\t\221\022\"\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\012\174\t\221\t\221\011&\t\221\t\221\0112\022J\0066\022j\t\221\t\221\t\221\t\221\t\221\005\225\t\221\t\221\t\221\t\221\t\221\006u\t\221\t\221\011&\t\221\t\221\0112\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\t\221\006u\014\182\t\221\t\221\t\221\t\221\t\233\t\233\003\134\0182\006\138\t\233\004\214\t\233\t\233\019\166\t\233\t\233\t\233\t\233\001\206\t\233\t\233\018F\t\233\t\233\t\233\006\246\t\233\t\233\t\233\t\233\001\150\t\233\012\194\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\005>\007\006\012R\t\233\003\018\t\233\t\233\t\233\t\233\t\233\004B\t\233\t\233\012\198\t\233\r>\t\233\t\233\t\233\002\154\012F\t\233\t\233\t\233\t\233\t\233\t\233\t\233\004M\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\b\237\t\233\t\233\012J\t\233\t\233\002\142\t\234\007\198\026\130\t\233\t\233\t\233\t\233\t\233\027\247\t\233\t\233\t\233\t\233\t\233\004R\t\233\t\233\014^\t\233\t\233\012\246\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\t\233\000\238\000\238\t\233\t\233\t\233\t\233\t\249\t\249\027\146\001\222\0126\t\249\004\214\t\249\t\249\023z\t\249\t\249\t\249\t\249\012\138\t\249\t\249\015:\t\249\t\249\t\249\014f\t\249\t\249\t\249\t\249\r\n\t\249\011\134\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\012\142\b\237\r.\t\249\003\018\t\249\t\249\t\249\t\249\t\249\0062\t\249\t\249\023b\t\249\rR\t\249\t\249\t\249\007F\012\218\t\249\t\249\t\249\t\249\t\249\t\249\t\249\tb\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\002\190\t\249\t\249\012\222\t\249\t\249\tz\012^\003\022\015\014\t\249\t\249\t\249\t\249\t\249\019\166\t\249\t\249\t\249\t\249\t\249\015>\t\249\t\249\015\226\t\249\t\249\r:\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\t\249\001\002\001\190\t\249\t\249\t\249\t\249\t\241\t\241\001\002\001\190\012z\t\241\012\194\t\241\t\241\025B\t\241\t\241\t\241\t\241\012F\t\241\t\241\014\162\t\241\t\241\t\241\012\170\t\241\t\241\t\241\t\241\rN\t\241\r\158\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\r\030\019\"\014\166\t\241\r\146\t\241\t\241\t\241\t\241\t\241\000\238\t\241\t\241\000\238\t\241\rf\t\241\t\241\t\241\015\018\012\138\t\241\t\241\t\241\t\241\t\241\t\241\t\241\014z\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\017\138\t\241\t\241\rb\t\241\t\241\005\237\019\026\014~\t\194\t\241\t\241\t\241\t\241\t\241\005\241\t\241\t\241\t\241\t\241\t\241\011\134\t\241\t\241\t\202\t\241\t\241\012\218\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\t\241\014\234\018:\t\241\t\241\t\241\t\241\na\na\001\206\r\170\015F\na\t\218\na\na\000\238\na\na\na\na\015\026\na\na\014\238\na\na\na\011\018\na\na\na\na\015J\na\002\253\na\na\na\na\na\na\na\na\015\030\019N\019\230\na\018\222\na\na\na\na\na\019b\na\na\004B\na\rr\na\na\na\019F\019\146\na\na\na\na\na\na\na\026~\na\na\na\na\na\na\na\na\na\na\na\b9\na\na\007\246\na\na\b5\022F\022N\019\250\na\na\na\na\na\r9\na\na\na\na\na\022\138\na\na\027\142\na\na\019\202\na\na\na\na\na\na\na\na\na\na\na\na\na\011J\b)\na\na\na\na\003\157\003\157\b\005\007\246\024:\003\157\005\229\003\157\003\157\000\238\003\157\003\157\003\157\003\157\023n\003\157\003\157\022\210\003\157\003\157\003\157\026F\003\157\003\157\003\157\003\157\026\142\003\157\025^\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\007\246\rE\022\170\003\157\000\238\003\157\003\157\003\157\003\157\003\157\022\218\003\157\003\157\000\238\003\157\011r\003\157\003\157\003\157\019\254\023\250\003\157\003\157\003\157\003\157\003\157\003\157\003\157\011\162\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\023\254\t\166\t\214\023\n\003\157\003\157\023\150\004\225\r\194\025\026\003\157\003\157\003\157\003\157\003\157\b-\003\157\003\157\003\157\003\157\t\174\024>\t\222\003\157\r\202\003\157\003\157\023\206\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\003\157\r\222\003\157\003\157\003\157\003\157\003\157\001\237\001\237\014\014\007\246\n\250\001\237\014:\002\190\001\237\015\146\002\130\001\237\t\190\001\237\015\186\002\246\001\237\025b\001\237\001\237\001\237\003\254\001\237\001\237\001\237\001\210\015\214\t\198\015\218\002\250\001\237\001\237\001\237\001\237\001\237\t\206\001\237\016\002\001\206\025N\002\254\016\022\001\237\001\237\001\237\001\237\001\237\027\"\0032\001\190\004e\001\237\016.\001\237\001\237\002\178\025\030\016B\003:\001\237\001\237\001\237\bz\b~\b\138\016n\012\150\005v\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\001\237\028\007\t\166\t\214\026\246\001\237\001\237\007\246\016\130\017\130\017\142\005\130\005\134\001\237\001\237\001\237\002\226\001\237\001\237\001\237\001\237\012\158\006\134\012\234\001\237\018N\001\237\001\237\018f\001\237\001\237\001\237\001\237\001\237\001\237\005\138\b\146\001\237\001\237\001\237\b\170\004r\018\238\018\242\001\237\001\237\001\237\001\237\nI\nI\019*\019.\019V\nI\019Z\002\190\nI\025R\002\130\nI\nI\nI\019\130\002\246\nI\027&\nI\nI\nI\020.\nI\nI\nI\001\210\0202\nI\020V\002\250\nI\nI\nI\nI\nI\nI\nI\020Z\020j\020z\002\254\020\134\nI\nI\nI\nI\nI\020\186\0032\001\190\020\190\nI\021\014\nI\nI\002\178\0216\021:\003:\nI\nI\nI\bz\b~\b\138\021J\nI\005v\nI\nI\nI\nI\nI\nI\nI\nI\nI\021\154\nI\nI\021\186\nI\nI\021\250\022\030\022.\022V\005\130\005\134\nI\nI\nI\022Z\nI\nI\nI\nI\nI\022f\nI\nI\022v\nI\nI\022\146\nI\nI\nI\nI\nI\nI\005\138\b\146\nI\nI\nI\b\170\004r\022\162\022\182\nI\nI\nI\nI\nE\nE\022\226\022\230\022\242\nE\023\002\002\190\nE\023\022\002\130\nE\nE\nE\024\n\002\246\nE\024b\nE\nE\nE\024\138\nE\nE\nE\001\210\024\242\nE\025\002\002\250\nE\nE\nE\nE\nE\nE\nE\025\158\025\166\025\182\002\254\025\194\nE\nE\nE\nE\nE\026&\0032\001\190\026:\nE\026j\nE\nE\002\178\026r\026\174\003:\nE\nE\nE\bz\b~\b\138\026\214\nE\005v\nE\nE\nE\nE\nE\nE\nE\nE\nE\027\014\nE\nE\027>\nE\nE\027J\027R\027[\027k\005\130\005\134\nE\nE\nE\027~\nE\nE\nE\nE\nE\027\154\nE\nE\027\183\nE\nE\027\199\nE\nE\nE\nE\nE\nE\005\138\b\146\nE\nE\nE\b\170\004r\027\227\028\023\nE\nE\nE\nE\0029\0029\0283\028>\028s\0029\028\135\002\190\0029\028\143\002\130\0029\t\190\0029\028\203\002\246\0029\028\211\0029\0029\0029\000\000\0029\0029\0029\001\210\002\225\t\198\000\000\002\250\0029\0029\0029\0029\0029\t\206\0029\000\000\000\000\000\000\002\254\004M\0029\0029\0029\0029\0029\000\000\0032\001\190\000\000\0029\000\n\0029\0029\002\178\000\000\000\000\003:\0029\0029\0029\bz\b~\b\138\000\000\012\150\005v\0029\0029\0029\0029\0029\0029\0029\0029\0029\000\000\004\185\0029\002\225\0029\0029\004M\006\202\002\190\004M\005\130\005\134\0029\0029\0029\000\000\0029\0029\0029\0029\000\000\000\238\004M\0029\004\185\0029\0029\004M\0029\0029\0029\0029\0029\0029\005\138\b\146\0029\0029\0029\b\170\004r\000\000\004M\0029\0029\0029\0029\004M\007f\004M\003\n\004M\004M\004M\004M\004M\004M\004M\017\230\004M\000\238\004M\004M\000\000\004M\004M\004M\016\178\004M\004M\004M\004M\004M\004M\004M\004M\004M\000\000\004M\004M\000\000\000\000\004M\004M\000\238\004M\004M\004M\004M\004M\007\226\004M\004M\004M\004M\004M\004M\004M\004M\000\238\004M\004M\004M\004M\004M\004M\004M\004M\000\238\004M\004M\004M\004M\004M\004M\004M\004M\b\209\004N\004M\000\000\000\000\004M\004M\004M\000\238\004M\000\n\000\000\004M\004M\004M\004M\004M\004M\004M\004M\004M\000\000\022\018\004M\004M\002\225\002\225\007\238\004M\004B\006\249\000\000\004M\004M\000\000\007\246\016\182\022\130\002\225\000\238\004M\004M\004M\007\250\000\000\004M\004M\004M\004M\006\249\000\161\004M\000\161\006\249\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\000\161\0236\000\161\000\161\000\000\000\161\000\161\000\000\000\000\000\161\000\161\000\000\000\161\000\161\000\161\000\161\000\000\000\161\004R\000\161\000\161\b\209\000\000\000\161\000\161\005\153\000\161\000\161\000\161\000\238\000\161\t\005\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\b\234\000\161\000\161\000\000\000\000\000\161\000\161\002\006\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\002\n\006\249\000\161\015\174\t1\000\161\002\130\000\161\001\210\000\161\005\153\002\190\000\000\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\161\000\000\000\000\000\000\000\161\003\154\0186\t1\005\153\000\222\000\000\007J\001\222\000\161\000\000\002\226\000\000\014\194\002\178\000\161\000\161\000\161\000\161\000\000\015\178\000\161\000\161\000\161\000\161\002)\002)\004e\000\000\003\n\002)\000\000\002\190\002)\015\190\002\130\002)\001b\002)\000\000\002\246\002)\007N\002)\002)\002)\000\000\002)\002)\002)\001\210\001z\000\000\001\138\002\250\002)\002)\002)\002)\002)\005\134\002)\000\000\000\000\000\000\002\254\b\189\002)\002)\002)\002)\002)\004e\0032\b\142\000\000\002)\000\000\002)\002)\002\178\000\000\006\146\003:\002)\002)\002)\bz\b~\b\138\t\166\t\214\005v\002)\002)\002)\002)\002)\002)\002)\002)\002)\006\150\t\166\t\214\b\189\002)\002)\000\000\t\174\000\000\t\222\005\130\005\134\002)\002)\002)\000\000\002)\002)\002)\002)\t\174\000\000\t\222\002)\b\189\002)\002)\000\000\002)\002)\002)\002)\002)\002)\005\138\b\146\002)\002)\002)\b\170\004r\000\238\002\225\002)\002)\002)\002)\002E\002E\002\225\002\225\000\000\002E\000\000\000\000\002E\000\000\b\189\002E\000\000\002E\004\254\000\000\002E\b\189\002E\002E\002E\000\n\002E\002E\002E\000\000\028#\000\000\000\000\000\n\002E\002E\002E\002E\002E\000\000\002E\002\225\006F\004\181\000\000\005\234\002E\002E\002E\002E\002E\000\000\006f\002\225\000\000\002E\006r\002E\002E\000\000\000\000\002\225\006\198\002E\002E\002E\004\181\000\000\006\229\t-\000\000\000\000\002E\002E\002E\002E\002E\002E\002E\002E\002E\000\000\t\166\t\214\000\000\002E\002E\006\206\014\218\000\000\002\190\006\229\t-\002E\002E\002E\000\000\002E\002E\002E\002E\t\174\002\190\t\222\002E\002\130\002E\002E\001\210\002E\002E\002E\002E\002E\002E\b\185\000\000\002E\002E\002E\000\000\022\002\000\000\000\000\002E\002E\002E\002E\002A\002A\000\000\023>\003\n\002A\023B\003\022\002A\000\000\002\178\002A\000\000\002A\000\000\017\178\002A\023r\002A\002A\002A\t\178\002A\002A\002A\012V\b\185\000\000\000\000\015\190\002A\002A\002A\002A\002A\r\150\002A\r\162\000\000\012r\023\130\012\130\002A\002A\002A\002A\002A\b\185\b\198\001\190\001*\002A\000\000\002A\002A\005\134\002\225\002\225\014\130\002A\002A\002A\014\150\014\170\014\186\000\000\000\000\000\000\002A\002A\002A\002A\002A\002A\002A\002A\002A\000\000\t\166\t\214\b\185\002A\002A\000\n\004\254\000\000\001\206\b\185\000\000\002A\002A\002A\000\000\002A\002A\002A\002A\t\174\000\000\t\222\002A\000\000\002A\002A\001\210\002A\002A\002A\002A\002A\002A\002\225\000\000\002A\002A\002A\000\000\018\246\000\000\000\000\002A\002A\002A\002A\002-\002-\000\000\000\000\002\154\002-\019~\003\022\002-\000\000\002\178\002-\000\000\002-\000\000\000\000\002-\019\150\002-\002-\002-\012\162\002-\002-\002-\002\225\002\225\016\222\000\000\000\000\002-\002-\002-\002-\002-\012\186\002-\012\210\000\000\000\000\002\225\r2\002-\002-\002-\002-\002-\000\000\b\198\014\250\000\000\002-\000\n\002-\002-\rF\000\000\rZ\014\130\002-\002-\002-\014\150\014\170\014\186\000\000\000\000\000\000\002-\002-\002-\002-\002-\002-\002-\002-\002-\000\000\t\166\t\214\002\225\002-\002-\000\000\000\000\000\000\000\000\000\238\000\000\002-\002-\002-\000\000\002-\002-\002-\002-\t\174\000\000\t\222\002-\000\000\002-\002-\000\000\002-\002-\002-\002-\002-\002-\000\000\000\000\002-\002-\002-\000\000\t\146\000\000\000\000\002-\002-\002-\002-\002=\002=\000\000\000\000\000\000\002=\012\149\006F\002=\000\000\005\234\002=\000\000\002=\000\000\000\000\002=\006f\002=\002=\002=\006r\002=\002=\002=\012\149\012\149\000\000\000\000\012\149\002=\002=\002=\002=\002=\000\000\002=\b)\000\000\000\000\b)\000\000\002=\002=\002=\002=\002=\000\000\000\000\000\000\000\000\002=\000\000\002=\002=\000\000\000\000\000\000\022\138\002=\002=\002=\000\000\000\000\000\000\000\000\000\000\000\238\002=\002=\002=\002=\002=\002=\002=\002=\002=\000\000\b)\002=\000\000\002=\002=\000\000\000\000\000\000\000\000\000\000\000\000\002=\002=\002=\b)\002=\002=\002=\002=\012\149\000\000\005\t\002=\000\000\002=\002=\002\225\t\246\002=\002=\002=\002=\002=\005\t\011>\002=\002=\002=\000\000\000\000\b)\000\000\002=\002=\002=\002=\t9\t9\000\000\000\000\000\000\t9\000\000\000\000\t9\000\n\000\000\t9\000\000\t9\000\000\000\000\n\"\005\t\t9\nF\t9\b)\t9\t9\t9\002\225\002\225\018\014\000\000\017N\nZ\nr\nz\nb\n\130\000\000\t9\002\225\002\225\000\000\002\225\000\000\t9\t9\n\138\n\146\t9\005\t\b\t\000\000\005\t\t9\000\n\n\154\t9\000\000\000\000\000\000\000\000\t9\t9\000\238\000\000\000\000\000\000\000\000\000\000\002\246\t9\t9\n*\nj\n\162\n\170\n\186\t9\t9\002\166\012\217\t9\002\225\t9\n\194\000\000\003Z\000\000\000\000\000\238\000\000\t9\t9\n\202\000\000\t9\t9\t9\t9\003f\012\217\000\000\t9\000\000\t9\t9\002B\n\234\t9\n\242\n\178\t9\t9\000\000\000\000\t9\n\210\t9\000\000\002F\000\000\005v\t9\t9\n\218\n\226\002q\002q\000\000\000\000\000\000\002q\012\157\006F\002q\000\000\005\234\002q\000\000\002q\000\000\005\130\002q\006f\002q\002q\002q\006r\002q\002q\002q\012\157\012\157\000\000\000\000\012\157\002q\002q\002q\002q\002q\000\000\002q\015\174\000\000\005\138\002\130\000\000\002q\002q\002q\002q\002q\000\000\000\000\000\000\000\000\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\002q\002q\002q\000\000\000\000\000\000\000\000\000\000\000\238\002q\002q\n*\002q\002q\002q\002q\002q\002q\000\000\015\178\002q\000\000\002q\002q\000\000\000\000\000\000\000\000\000\000\000\000\002q\002q\002q\015\190\002q\002q\002q\002q\012\157\000\000\001\206\002q\000\000\002q\002q\000\000\002q\002q\002q\002q\002q\002q\026Z\000\000\002q\002q\002q\000\000\000\000\005\134\000\000\002q\002q\002q\002q\002Y\002Y\000\000\000\000\000\000\002Y\000\000\002\190\002Y\000\000\000\000\002Y\000\000\002Y\003\170\000\000\002Y\002\154\002Y\002Y\002Y\025\202\002Y\002Y\002Y\001\210\000\000\000\000\000\000\000\000\002Y\002Y\002Y\002Y\002Y\000\000\002Y\015\174\000\000\000\000\002\130\000\000\002Y\002Y\002Y\002Y\002Y\004\154\003\202\000\000\004\229\002Y\000\000\002Y\002Y\002\178\000\000\000\000\000\000\002Y\002Y\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002Y\n*\002Y\002Y\002Y\002Y\002Y\002Y\000\000\015\178\002Y\000\000\002Y\002Y\0072\000\000\000\000\000\000\000\000\000\000\002Y\002Y\002Y\015\190\002Y\002Y\002Y\002Y\000\000\000\000\000\000\002Y\000\000\002Y\002Y\000\000\002Y\002Y\002Y\002Y\002Y\002Y\012\153\000\000\002Y\002Y\002Y\000\000\000\000\005\134\000\000\002Y\002Y\002Y\002Y\002e\002e\000\000\000\000\000\000\002e\012\153\012\153\002e\000\000\012\153\002e\000\000\002e\000\000\000\000\n\"\000\000\002e\002e\002e\021f\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\nb\002e\000\000\002e\000\000\000\000\000\000\000\000\000\000\002e\002e\002e\002e\002e\000\000\000\238\000\000\000\000\002e\000\000\002e\002e\000\000\000\000\000\000\000\000\002e\002e\002e\000\000\000\000\000\000\000\000\000\000\000\000\002e\002e\n*\nj\002e\002e\002e\002e\002e\000\000\012\153\002e\000\000\002e\002e\000\000\000\000\000\000\000\000\000\238\b\029\002e\002e\002e\b\029\002e\002e\002e\002e\000\000\000\000\000\000\002e\000\000\002e\002e\000\000\002e\002e\002e\002e\002e\002e\000\000\000\000\002e\002e\002e\000\000\011\198\000\000\000\000\002e\002e\002e\002e\002u\002u\000\000\000\000\000\000\002u\b\029\011\206\002u\000\000\011\218\002u\000\000\002u\000\000\000\000\002u\011\230\002u\002u\002u\011\242\002u\002u\002u\000\000\000\000\b\029\000\000\000\000\002u\002u\002u\002u\002u\000\000\002u\000\000\000\000\000\000\000\000\000\000\002u\002u\002u\002u\002u\000\000\000\000\000\000\000\000\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\002u\002u\002u\000\000\000\000\004\254\000\000\000\000\000\000\002u\002u\n*\002u\002u\002u\002u\002u\002u\000\000\bJ\002u\000\000\002u\002u\000\000\000\000\000\000\000\000\000\238\b\025\002u\002u\002u\b\025\002u\002u\002u\002u\000\000\bN\000\000\002u\000\000\002u\002u\000\000\002u\002u\002u\002u\002u\002u\000\000\000\000\002u\002u\002u\000\000\007\181\000\000\000\000\002u\002u\002u\002u\002U\002U\b>\000\000\000\000\002U\b\025\007\181\002U\000\000\005\234\002U\000\000\002U\000\000\000\238\002U\007\181\002U\002U\002U\007\181\002U\002U\002U\000\000\000\000\b\025\000\000\000\000\002U\002U\002U\002U\002U\000\000\002U\000\000\000\000\007\r\000\000\000\000\002U\002U\002U\002U\002U\000\000\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\007\r\002U\002U\002U\007\r\bR\004\254\000\000\000\000\000\000\002U\002U\n*\002U\002U\002U\002U\002U\002U\000\000\000\000\002U\000\000\002U\002U\000\000\000\000\000\000\000\000\007\209\000\000\002U\002U\002U\000\000\002U\002U\002U\002U\000\000\000\000\000\000\002U\000\000\002U\002U\000\000\002U\002U\002U\002U\002U\002U\000\000\000\000\002U\002U\002U\000\000\007\209\000\000\000\000\002U\002U\002U\002U\002a\002a\000\000\000\000\000\000\002a\005f\007\209\002a\000\000\005\234\002a\000\000\002a\000\000\000\000\n\"\007\209\002a\002a\002a\007\209\002a\002a\002a\000\000\000\000\000\000\000\000\000\000\002a\002a\002a\nb\002a\000\000\002a\000\000\000\000\006\253\000\000\000\000\002a\002a\002a\002a\002a\000\000\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\006\253\002a\002a\002a\006\253\000\000\000\000\000\000\000\000\000\000\002a\002a\n*\nj\002a\002a\002a\002a\002a\000\000\000\000\002a\000\000\002a\002a\000\000\000\000\000\000\000\000\000\238\000\000\002a\002a\002a\000\000\002a\002a\002a\002a\000\000\000\000\000\000\002a\000\000\002a\002a\000\000\002a\002a\002a\002a\002a\002a\000\000\000\000\002a\002a\002a\000\000\007\237\000\000\000\000\002a\002a\002a\002a\002]\002]\000\000\000\000\000\000\002]\b\134\006F\002]\000\000\005\234\002]\000\000\002]\000\000\000\000\n\"\007\237\002]\002]\002]\007\237\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\nb\002]\000\000\002]\000\000\000\000\000\000\000\000\000\000\002]\002]\002]\002]\002]\000\000\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\000\000\000\000\000\000\002]\002]\002]\000\000\000\000\000\000\000\000\000\000\000\000\002]\002]\n*\nj\002]\002]\002]\002]\002]\000\000\000\000\002]\000\000\002]\002]\000\000\000\000\000\000\000\000\007\229\000\000\002]\002]\002]\000\000\002]\002]\002]\002]\000\000\000\000\000\000\002]\000\000\002]\002]\000\000\002]\002]\002]\002]\002]\002]\000\000\000\000\002]\002]\002]\000\000\007\229\000\000\000\000\002]\002]\002]\002]\002\133\002\133\000\000\000\000\000\000\002\133\000\000\012\n\002\133\000\000\007\229\002\133\000\000\002\133\000\000\000\000\n\"\007\229\002\133\002\133\002\133\007\229\002\133\002\133\002\133\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\133\000\000\000\000\000\000\000\000\000\000\002\133\002\133\n\138\n\146\002\133\000\000\000\000\000\000\000\000\002\133\000\000\n\154\002\133\000\000\000\000\000\000\000\000\002\133\002\133\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\133\002\133\n*\nj\n\162\n\170\n\186\002\133\002\133\000\000\000\000\002\133\000\000\002\133\n\194\000\000\000\000\000\000\000\000\000\238\000\000\002\133\002\133\n\202\000\000\002\133\002\133\002\133\002\133\000\000\000\000\000\000\002\133\000\000\002\133\002\133\000\000\002\133\002\133\002\133\n\178\002\133\002\133\000\000\000\000\002\133\n\210\002\133\000\000\007\177\000\000\000\000\002\133\002\133\n\218\n\226\002m\002m\000\000\000\000\000\000\002m\000\000\007\177\002m\000\000\005\234\002m\000\000\002m\000\000\000\000\n\"\007\177\002m\002m\002m\007\177\002m\002m\002m\000\000\000\000\000\000\000\000\000\000\002m\002m\002m\nb\002m\000\000\002m\000\000\000\000\000\000\000\000\000\000\002m\002m\002m\002m\002m\000\000\000\000\000\000\000\000\002m\000\000\002m\002m\000\000\000\000\000\000\000\000\002m\002m\002m\000\000\000\000\000\000\000\000\000\000\000\000\002m\002m\n*\nj\002m\002m\002m\002m\002m\000\000\000\000\002m\000\000\002m\002m\000\000\000\000\000\000\000\000\000\238\000\000\002m\002m\002m\000\000\002m\002m\002m\002m\000\000\000\000\000\000\002m\000\000\002m\002m\000\000\002m\002m\002m\002m\002m\002m\000\000\000\000\002m\002m\002m\000\000\014R\000\000\000\000\002m\002m\002m\002m\002i\002i\000\000\000\000\000\000\002i\000\000\011\206\002i\000\000\011\218\002i\000\000\002i\000\000\000\000\n\"\011\230\002i\002i\002i\011\242\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\nb\002i\000\000\002i\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002i\000\000\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\n*\nj\002i\002i\002i\002i\002i\000\000\000\000\002i\000\000\002i\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002i\002i\000\000\002i\002i\002i\002i\000\000\000\000\000\000\002i\000\000\002i\002i\000\000\002i\002i\002i\002i\002i\002i\000\000\000\000\002i\002i\002i\000\000\000\000\000\000\000\000\002i\002i\002i\002i\002}\002}\000\000\000\000\000\000\002}\000\000\002\006\002}\000\000\002\130\002}\000\000\002}\000\000\000\000\n\"\000\000\002}\002}\002}\000\000\002}\002}\002}\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002}\000\000\002}\000\000\000\000\000\000\000\000\000\000\002}\002}\n\138\n\146\002}\000\000\027v\001\222\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\000\000\002}\002}\000\238\015\190\000\000\000\000\000\000\000\000\000\000\002}\002}\n*\nj\n\162\n\170\002}\002}\002}\000\000\000\000\002}\000\000\002}\002}\000\000\000\000\000\000\000\000\000\000\005\134\002}\002}\002}\000\000\002}\002}\002}\002}\000\000\000\000\000\000\002}\000\000\002}\002}\000\000\002}\002}\002}\n\178\002}\002}\000\000\000\000\002}\002}\002}\000\000\000\000\000\000\000\000\002}\002}\002}\002}\002Q\002Q\000\000\000\000\000\000\002Q\000\000\003\022\002Q\000\000\000\000\002Q\000\000\002Q\000\000\000\000\n\"\000\000\002Q\002Q\002Q\000\000\002Q\002Q\002Q\000\000\000\000\000\000\000\000\000\000\002Q\002Q\002Q\nb\002Q\000\000\002Q\000\000\000\000\000\000\000\000\000\000\002Q\002Q\002Q\002Q\002Q\000\000\005\190\000\000\000\000\002Q\000\000\002Q\002Q\000\000\000\000\000\000\003\246\002Q\002Q\002Q\006\154\000\000\004\002\000\000\000\000\000\000\002Q\002Q\n*\nj\002Q\002Q\002Q\002Q\002Q\000\000\000\000\002Q\000\000\002Q\002Q\000\000\000\000\000\000\000\000\000\000\000\000\002Q\002Q\002Q\000\000\002Q\002Q\002Q\002Q\000\000\000\000\000\000\002Q\000\000\002Q\002Q\000\000\002Q\002Q\002Q\002Q\002Q\002Q\000\000\000\000\002Q\002Q\002Q\000\000\000\000\000\000\000\000\002Q\002Q\002Q\002Q\002M\002M\000\000\000\000\000\000\002M\000\000\002\190\002M\000\000\000\000\002M\000\000\002M\000\000\000\000\n\"\000\000\002M\002M\002M\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002M\000\000\002M\000\000\000\000\000\000\000\000\000\000\002M\002M\n\138\n\146\002M\000\000\t\226\003\n\000\000\002M\000\000\002M\002M\000\000\000\000\000\000\000\000\002M\002M\000\238\012.\000\000\012>\000\000\000\000\000\000\002M\002M\n*\nj\n\162\n\170\002M\002M\002M\000\000\000\000\002M\000\000\002M\002M\000\000\000\000\000\000\000\000\000\000\000\000\002M\002M\002M\000\000\002M\002M\002M\002M\000\000\000\000\000\000\002M\000\000\002M\002M\000\000\002M\002M\002M\n\178\002M\002M\000\000\000\000\002M\002M\002M\000\000\000\000\000\000\000\000\002M\002M\002M\002M\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\190\002\169\000\000\000\000\002\169\000\000\002\169\000\000\000\000\n\"\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002\169\000\000\002\169\000\000\000\000\000\000\000\000\000\000\002\169\002\169\n\138\n\146\002\169\000\000\012\238\003\n\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\r\002\000\000\r\022\000\000\000\000\000\000\002\169\002\169\n*\nj\n\162\002\169\002\169\002\169\002\169\000\000\000\000\002\169\000\000\002\169\002\169\000\000\000\000\000\000\000\000\000\000\000\000\002\169\002\169\002\169\000\000\002\169\002\169\002\169\002\169\000\000\000\000\000\000\002\169\000\000\002\169\002\169\000\000\002\169\002\169\002\169\n\178\002\169\002\169\000\000\000\000\002\169\002\169\002\169\000\000\000\000\000\000\000\000\002\169\002\169\002\169\002\169\002I\002I\000\000\000\000\000\000\002I\000\000\000\000\002I\000\000\000\000\002I\000\000\002I\000\000\000\000\n\"\000\000\002I\002I\002I\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002I\000\000\002I\000\000\000\000\000\000\000\000\000\000\002I\002I\n\138\n\146\002I\000\000\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\002I\002I\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\n*\nj\n\162\n\170\002I\002I\002I\000\000\000\000\002I\000\000\002I\002I\000\000\000\000\000\000\000\000\000\000\000\000\002I\002I\002I\000\000\002I\002I\002I\002I\000\000\000\000\000\000\002I\000\000\002I\002I\000\000\002I\002I\002I\n\178\002I\002I\000\000\000\000\002I\002I\002I\000\000\000\000\000\000\000\000\002I\002I\002I\002I\002\129\002\129\000\000\000\000\000\000\002\129\000\000\000\000\002\129\000\000\000\000\002\129\000\000\002\129\000\000\000\000\n\"\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002\129\000\000\002\129\000\000\000\000\000\000\000\000\000\000\002\129\002\129\n\138\n\146\002\129\000\000\000\000\000\000\000\000\002\129\000\000\002\129\002\129\000\000\000\000\000\000\000\000\002\129\002\129\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\129\n*\nj\n\162\n\170\002\129\002\129\002\129\000\000\000\000\002\129\000\000\002\129\002\129\000\000\000\000\000\000\000\000\000\000\000\000\002\129\002\129\002\129\000\000\002\129\002\129\002\129\002\129\000\000\000\000\000\000\002\129\000\000\002\129\002\129\000\000\002\129\002\129\002\129\n\178\002\129\002\129\000\000\000\000\002\129\002\129\002\129\000\000\000\000\000\000\000\000\002\129\002\129\002\129\002\129\002y\002y\000\000\000\000\000\000\002y\000\000\000\000\002y\000\000\000\000\002y\000\000\002y\000\000\000\000\n\"\000\000\002y\002y\002y\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002y\000\000\002y\000\000\000\000\000\000\000\000\000\000\002y\002y\n\138\n\146\002y\000\000\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\002y\002y\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002y\002y\n*\nj\n\162\n\170\002y\002y\002y\000\000\000\000\002y\000\000\002y\002y\000\000\000\000\000\000\000\000\000\000\000\000\002y\002y\002y\000\000\002y\002y\002y\002y\000\000\000\000\000\000\002y\000\000\002y\002y\000\000\002y\002y\002y\n\178\002y\002y\000\000\000\000\002y\002y\002y\000\000\000\000\000\000\000\000\002y\002y\002y\002y\002\137\002\137\000\000\000\000\000\000\002\137\000\000\000\000\002\137\000\000\000\000\002\137\000\000\002\137\000\000\000\000\n\"\000\000\002\137\002\137\002\137\000\000\002\137\002\137\002\137\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\137\000\000\000\000\000\000\000\000\000\000\002\137\002\137\n\138\n\146\002\137\000\000\000\000\000\000\000\000\002\137\000\000\n\154\002\137\000\000\000\000\000\000\000\000\002\137\002\137\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\n*\nj\n\162\n\170\n\186\002\137\002\137\000\000\000\000\002\137\000\000\002\137\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\137\002\137\n\202\000\000\002\137\002\137\002\137\002\137\000\000\000\000\000\000\002\137\000\000\002\137\002\137\000\000\002\137\002\137\002\137\n\178\002\137\002\137\000\000\000\000\002\137\n\210\002\137\000\000\000\000\000\000\000\000\002\137\002\137\n\218\n\226\002\141\002\141\000\000\000\000\000\000\002\141\000\000\000\000\002\141\000\000\000\000\002\141\000\000\002\141\000\000\000\000\n\"\000\000\002\141\002\141\002\141\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002\141\000\000\002\141\000\000\000\000\000\000\000\000\000\000\002\141\002\141\n\138\n\146\002\141\000\000\000\000\000\000\000\000\002\141\000\000\n\154\002\141\000\000\000\000\000\000\000\000\002\141\002\141\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\141\002\141\n*\nj\n\162\n\170\n\186\002\141\002\141\000\000\000\000\002\141\000\000\002\141\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\141\002\141\n\202\000\000\002\141\002\141\002\141\002\141\000\000\000\000\000\000\002\141\000\000\002\141\002\141\000\000\002\141\002\141\002\141\n\178\002\141\002\141\000\000\000\000\002\141\002\141\002\141\000\000\000\000\000\000\000\000\002\141\002\141\n\218\n\226\002\145\002\145\000\000\000\000\000\000\002\145\000\000\000\000\002\145\000\000\000\000\002\145\000\000\002\145\000\000\000\000\n\"\000\000\002\145\002\145\002\145\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\002\145\000\000\002\145\000\000\000\000\000\000\000\000\000\000\002\145\002\145\n\138\n\146\002\145\000\000\000\000\000\000\000\000\002\145\000\000\n\154\002\145\000\000\000\000\000\000\000\000\002\145\002\145\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\n*\nj\n\162\n\170\n\186\002\145\002\145\000\000\000\000\002\145\000\000\002\145\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\145\002\145\n\202\000\000\002\145\002\145\002\145\002\145\000\000\000\000\000\000\002\145\000\000\002\145\002\145\000\000\002\145\002\145\002\145\n\178\002\145\002\145\000\000\000\000\002\145\002\145\002\145\000\000\000\000\000\000\000\000\002\145\002\145\n\218\n\226\b\245\b\245\000\000\000\000\000\000\b\245\000\000\000\000\b\245\000\000\000\000\b\245\000\000\b\245\000\000\000\000\n\"\000\000\b\245\b\245\b\245\000\000\b\245\b\245\b\245\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\b\245\000\000\000\000\000\000\000\000\000\000\b\245\b\245\n\138\n\146\b\245\000\000\000\000\000\000\000\000\b\245\000\000\n\154\b\245\000\000\000\000\000\000\000\000\b\245\b\245\000\238\000\000\000\000\000\000\000\000\000\000\000\000\b\245\b\245\n*\nj\n\162\n\170\n\186\b\245\b\245\000\000\000\000\b\245\000\000\b\245\n\194\000\000\000\000\000\000\000\000\000\000\000\000\b\245\b\245\n\202\000\000\b\245\b\245\b\245\b\245\000\000\000\000\000\000\b\245\000\000\b\245\b\245\000\000\b\245\b\245\b\245\n\178\b\245\b\245\000\000\000\000\b\245\n\210\b\245\000\000\000\000\000\000\000\000\b\245\b\245\n\218\n\226\002\149\002\149\000\000\000\000\000\000\002\149\000\000\000\000\002\149\000\000\000\000\002\149\000\000\002\149\000\000\000\000\n\"\000\000\002\149\002\149\002\149\000\000\002\149\002\149\002\149\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\149\000\000\000\000\000\000\000\000\000\000\002\149\002\149\n\138\n\146\002\149\000\000\000\000\000\000\000\000\002\149\000\000\n\154\002\149\000\000\000\000\000\000\000\000\002\149\002\149\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\n*\nj\n\162\n\170\n\186\002\149\002\149\000\000\000\000\002\149\000\000\002\149\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\149\002\149\n\202\000\000\002\149\002\149\002\149\002\149\000\000\000\000\000\000\002\149\000\000\002\149\002\149\000\000\n\234\002\149\n\242\n\178\002\149\002\149\000\000\000\000\002\149\n\210\002\149\000\000\000\000\000\000\000\000\002\149\002\149\n\218\n\226\b\241\b\241\000\000\000\000\000\000\b\241\000\000\000\000\b\241\000\000\000\000\b\241\000\000\b\241\000\000\000\000\n\"\000\000\b\241\b\241\b\241\000\000\b\241\b\241\b\241\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\b\241\000\000\000\000\000\000\000\000\000\000\b\241\b\241\n\138\n\146\b\241\000\000\000\000\000\000\000\000\b\241\000\000\n\154\b\241\000\000\000\000\000\000\000\000\b\241\b\241\000\238\000\000\000\000\000\000\000\000\000\000\000\000\b\241\b\241\n*\nj\n\162\n\170\n\186\b\241\b\241\000\000\000\000\b\241\000\000\b\241\n\194\000\000\000\000\000\000\000\000\000\000\000\000\b\241\b\241\n\202\000\000\b\241\b\241\b\241\b\241\000\000\000\000\000\000\b\241\000\000\b\241\b\241\000\000\b\241\b\241\b\241\n\178\b\241\b\241\000\000\000\000\b\241\n\210\b\241\000\000\000\000\000\000\000\000\b\241\b\241\n\218\n\226\002\193\002\193\000\000\000\000\000\000\002\193\000\000\000\000\002\193\000\000\000\000\002\193\000\000\002\193\000\000\000\000\n\"\000\000\002\193\002\193\002\193\000\000\002\193\002\193\002\193\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\193\000\000\000\000\000\000\000\000\000\000\002\193\002\193\n\138\n\146\002\193\000\000\000\000\000\000\000\000\002\193\000\000\n\154\002\193\000\000\000\000\000\000\000\000\002\193\002\193\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\n*\nj\n\162\n\170\n\186\002\193\002\193\000\000\000\000\002\193\000\000\002\193\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\193\002\193\n\202\000\000\002\193\002\193\002\193\002\193\000\000\000\000\000\000\002\193\000\000\002\193\002\193\000\000\n\234\002\193\n\242\n\178\002\193\002\193\000\000\000\000\002\193\n\210\002\193\000\000\000\000\000\000\000\000\002\193\002\193\n\218\n\226\002\209\002\209\000\000\000\000\000\000\002\209\000\000\000\000\002\209\000\000\000\000\002\209\000\000\002\209\000\000\000\000\n\"\000\000\002\209\002\209\002\209\000\000\002\209\002\209\002\209\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\209\000\000\000\000\000\000\000\000\000\000\002\209\002\209\n\138\n\146\002\209\000\000\000\000\000\000\000\000\002\209\000\000\n\154\002\209\000\000\000\000\000\000\000\000\002\209\002\209\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\n*\nj\n\162\n\170\n\186\002\209\002\209\000\000\000\000\002\209\000\000\002\209\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\209\002\209\n\202\000\000\002\209\002\209\002\209\002\209\000\000\000\000\000\000\002\209\000\000\002\209\002\209\000\000\n\234\002\209\n\242\n\178\002\209\002\209\000\000\000\000\002\209\n\210\002\209\000\000\000\000\000\000\000\000\002\209\002\209\n\218\n\226\002\201\002\201\000\000\000\000\000\000\002\201\000\000\000\000\002\201\000\000\000\000\002\201\000\000\002\201\000\000\000\000\n\"\000\000\002\201\002\201\002\201\000\000\002\201\002\201\002\201\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\201\000\000\000\000\000\000\000\000\000\000\002\201\002\201\n\138\n\146\002\201\000\000\000\000\000\000\000\000\002\201\000\000\n\154\002\201\000\000\000\000\000\000\000\000\002\201\002\201\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\n*\nj\n\162\n\170\n\186\002\201\002\201\000\000\000\000\002\201\000\000\002\201\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\201\002\201\n\202\000\000\002\201\002\201\002\201\002\201\000\000\000\000\000\000\002\201\000\000\002\201\002\201\000\000\n\234\002\201\n\242\n\178\002\201\002\201\000\000\000\000\002\201\n\210\002\201\000\000\000\000\000\000\000\000\002\201\002\201\n\218\n\226\002\181\002\181\000\000\000\000\000\000\002\181\000\000\000\000\002\181\000\000\000\000\002\181\000\000\002\181\000\000\000\000\n\"\000\000\002\181\002\181\002\181\000\000\002\181\002\181\002\181\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\181\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n\138\n\146\002\181\000\000\000\000\000\000\000\000\002\181\000\000\n\154\002\181\000\000\000\000\000\000\000\000\002\181\002\181\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n*\nj\n\162\n\170\n\186\002\181\002\181\000\000\000\000\002\181\000\000\002\181\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\181\002\181\n\202\000\000\002\181\002\181\002\181\002\181\000\000\000\000\000\000\002\181\000\000\002\181\002\181\000\000\n\234\002\181\n\242\n\178\002\181\002\181\000\000\000\000\002\181\n\210\002\181\000\000\000\000\000\000\000\000\002\181\002\181\n\218\n\226\002\189\002\189\000\000\000\000\000\000\002\189\000\000\000\000\002\189\000\000\000\000\002\189\000\000\002\189\000\000\000\000\n\"\000\000\002\189\002\189\002\189\000\000\002\189\002\189\002\189\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\189\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n\138\n\146\002\189\000\000\000\000\000\000\000\000\002\189\000\000\n\154\002\189\000\000\000\000\000\000\000\000\002\189\002\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n*\nj\n\162\n\170\n\186\002\189\002\189\000\000\000\000\002\189\000\000\002\189\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\189\002\189\n\202\000\000\002\189\002\189\002\189\002\189\000\000\000\000\000\000\002\189\000\000\002\189\002\189\000\000\n\234\002\189\n\242\n\178\002\189\002\189\000\000\000\000\002\189\n\210\002\189\000\000\000\000\000\000\000\000\002\189\002\189\n\218\n\226\002\185\002\185\000\000\000\000\000\000\002\185\000\000\000\000\002\185\000\000\000\000\002\185\000\000\002\185\000\000\000\000\n\"\000\000\002\185\002\185\002\185\000\000\002\185\002\185\002\185\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\185\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n\138\n\146\002\185\000\000\000\000\000\000\000\000\002\185\000\000\n\154\002\185\000\000\000\000\000\000\000\000\002\185\002\185\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n*\nj\n\162\n\170\n\186\002\185\002\185\000\000\000\000\002\185\000\000\002\185\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\185\002\185\n\202\000\000\002\185\002\185\002\185\002\185\000\000\000\000\000\000\002\185\000\000\002\185\002\185\000\000\n\234\002\185\n\242\n\178\002\185\002\185\000\000\000\000\002\185\n\210\002\185\000\000\000\000\000\000\000\000\002\185\002\185\n\218\n\226\002\197\002\197\000\000\000\000\000\000\002\197\000\000\000\000\002\197\000\000\000\000\002\197\000\000\002\197\000\000\000\000\n\"\000\000\002\197\002\197\002\197\000\000\002\197\002\197\002\197\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\197\000\000\000\000\000\000\000\000\000\000\002\197\002\197\n\138\n\146\002\197\000\000\000\000\000\000\000\000\002\197\000\000\n\154\002\197\000\000\000\000\000\000\000\000\002\197\002\197\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\n*\nj\n\162\n\170\n\186\002\197\002\197\000\000\000\000\002\197\000\000\002\197\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\197\002\197\n\202\000\000\002\197\002\197\002\197\002\197\000\000\000\000\000\000\002\197\000\000\002\197\002\197\000\000\n\234\002\197\n\242\n\178\002\197\002\197\000\000\000\000\002\197\n\210\002\197\000\000\000\000\000\000\000\000\002\197\002\197\n\218\n\226\002\213\002\213\000\000\000\000\000\000\002\213\000\000\000\000\002\213\000\000\000\000\002\213\000\000\002\213\000\000\000\000\n\"\000\000\002\213\002\213\002\213\000\000\002\213\002\213\002\213\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\213\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n\138\n\146\002\213\000\000\000\000\000\000\000\000\002\213\000\000\n\154\002\213\000\000\000\000\000\000\000\000\002\213\002\213\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n*\nj\n\162\n\170\n\186\002\213\002\213\000\000\000\000\002\213\000\000\002\213\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\213\n\202\000\000\002\213\002\213\002\213\002\213\000\000\000\000\000\000\002\213\000\000\002\213\002\213\000\000\n\234\002\213\n\242\n\178\002\213\002\213\000\000\000\000\002\213\n\210\002\213\000\000\000\000\000\000\000\000\002\213\002\213\n\218\n\226\002\205\002\205\000\000\000\000\000\000\002\205\000\000\000\000\002\205\000\000\000\000\002\205\000\000\002\205\000\000\000\000\n\"\000\000\002\205\002\205\002\205\000\000\002\205\002\205\002\205\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\205\000\000\000\000\000\000\000\000\000\000\002\205\002\205\n\138\n\146\002\205\000\000\000\000\000\000\000\000\002\205\000\000\n\154\002\205\000\000\000\000\000\000\000\000\002\205\002\205\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\n*\nj\n\162\n\170\n\186\002\205\002\205\000\000\000\000\002\205\000\000\002\205\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\205\002\205\n\202\000\000\002\205\002\205\002\205\002\205\000\000\000\000\000\000\002\205\000\000\002\205\002\205\000\000\n\234\002\205\n\242\n\178\002\205\002\205\000\000\000\000\002\205\n\210\002\205\000\000\000\000\000\000\000\000\002\205\002\205\n\218\n\226\002\177\002\177\000\000\000\000\000\000\002\177\000\000\000\000\002\177\000\000\000\000\002\177\000\000\002\177\000\000\000\000\n\"\000\000\002\177\002\177\002\177\000\000\002\177\002\177\002\177\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\177\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n\138\n\146\002\177\000\000\000\000\000\000\000\000\002\177\000\000\n\154\002\177\000\000\000\000\000\000\000\000\002\177\002\177\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n*\nj\n\162\n\170\n\186\002\177\002\177\000\000\000\000\002\177\000\000\002\177\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\177\002\177\n\202\000\000\002\177\002\177\002\177\002\177\000\000\000\000\000\000\002\177\000\000\002\177\002\177\000\000\n\234\002\177\n\242\n\178\002\177\002\177\000\000\000\000\002\177\n\210\002\177\000\000\000\000\000\000\000\000\002\177\002\177\n\218\n\226\002\001\002\001\000\000\000\000\000\000\002\001\000\000\000\000\002\001\000\000\000\000\002\001\000\000\002\001\000\000\000\000\002\001\000\000\002\001\002\001\002\001\000\000\002\001\002\001\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\002\001\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\000\000\000\000\000\000\000\000\002\001\000\000\002\001\002\001\000\000\000\000\000\000\000\000\002\001\002\001\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\002\001\000\000\002\001\002\001\000\000\000\000\000\000\000\000\000\000\000\000\002\001\002\001\002\001\000\000\002\001\002\001\002\001\002\001\000\000\000\000\000\000\002\001\000\000\002\001\002\001\000\000\002\001\002\001\002\001\002\001\002\001\002\001\000\000\000\000\002\001\002\001\014*\000\000\000\000\000\000\000\000\002\001\002\001\002\001\002\001\002\029\002\029\000\000\000\000\000\000\002\029\000\000\000\000\002\029\000\000\000\000\002\029\000\000\002\029\000\000\000\000\n\"\000\000\002\029\002\029\002\029\000\000\002\029\002\029\002\029\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\029\000\000\000\000\000\000\000\000\000\000\002\029\002\029\n\138\n\146\002\029\000\000\000\000\000\000\000\000\002\029\000\000\n\154\002\029\000\000\000\000\000\000\000\000\002\029\002\029\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\029\002\029\n*\nj\n\162\n\170\n\186\002\029\002\029\000\000\000\000\002\029\000\000\002\029\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\029\002\029\n\202\000\000\002\029\002\029\014B\002\029\000\000\000\000\000\000\002\029\000\000\002\029\002\029\000\000\n\234\002\029\n\242\n\178\002\029\002\029\000\000\000\000\002\029\n\210\002\029\000\000\000\000\000\000\000\000\002\029\002\029\n\218\n\226\002\025\002\025\000\000\000\000\000\000\002\025\000\000\000\000\002\025\000\000\000\000\002\025\000\000\002\025\000\000\000\000\n\"\000\000\002\025\002\025\002\025\000\000\002\025\002\025\002\025\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\025\000\000\000\000\000\000\000\000\000\000\002\025\002\025\n\138\n\146\002\025\000\000\000\000\000\000\000\000\002\025\000\000\n\154\002\025\000\000\000\000\000\000\000\000\002\025\002\025\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\025\002\025\n*\nj\n\162\n\170\n\186\002\025\002\025\000\000\000\000\002\025\000\000\002\025\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\025\002\025\n\202\000\000\002\025\002\025\002\025\002\025\000\000\000\000\000\000\002\025\000\000\002\025\002\025\000\000\n\234\002\025\n\242\n\178\002\025\002\025\000\000\000\000\002\025\n\210\002\025\000\000\000\000\000\000\000\000\002\025\002\025\n\218\n\226\002\173\002\173\000\000\000\000\000\000\002\173\000\000\000\000\002\173\000\000\000\000\002\173\000\000\002\173\000\000\000\000\n\"\000\000\002\173\002\173\002\173\000\000\002\173\002\173\002\173\000\000\000\000\000\000\000\000\000\000\nZ\nr\nz\nb\n\130\000\000\002\173\000\000\000\000\000\000\000\000\000\000\002\173\002\173\n\138\n\146\002\173\000\000\000\000\000\000\000\000\002\173\000\000\n\154\002\173\000\000\000\000\000\000\000\000\002\173\002\173\000\238\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\n*\nj\n\162\n\170\n\186\002\173\002\173\000\000\000\000\002\173\000\000\002\173\n\194\000\000\000\000\000\000\000\000\000\000\000\000\002\173\002\173\n\202\000\000\002\173\002\173\002\173\002\173\000\000\000\000\000\000\002\173\000\000\002\173\002\173\000\000\n\234\002\173\n\242\n\178\002\173\002\173\000\000\000\000\002\173\n\210\002\173\000\000\000\000\000\000\000\000\002\173\002\173\n\218\n\226\002\r\002\r\000\000\000\000\000\000\002\r\000\000\000\000\002\r\000\000\000\000\002\r\000\000\002\r\000\000\000\000\002\r\000\000\002\r\002\r\002\r\000\000\002\r\002\r\002\r\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\r\000\000\002\r\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\r\000\000\000\000\000\000\000\000\002\r\000\000\002\r\002\r\000\000\000\000\000\000\000\000\002\r\002\r\002\r\000\000\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\r\002\r\002\r\002\r\002\r\000\000\000\000\002\r\000\000\002\r\002\r\000\000\000\000\000\000\000\000\000\000\000\000\002\r\002\r\002\r\000\000\002\r\002\r\002\r\002\r\000\000\000\000\000\000\002\r\000\000\002\r\002\r\000\000\002\r\002\r\002\r\002\r\002\r\002\r\000\000\000\000\002\r\002\r\014*\000\000\000\000\000\000\000\000\002\r\002\r\002\r\002\r\002\017\002\017\000\000\000\000\000\000\002\017\000\000\000\000\002\017\000\000\000\000\002\017\000\000\002\017\000\000\000\000\002\017\000\000\002\017\002\017\002\017\000\000\002\017\002\017\002\017\000\000\000\000\006>\000\000\000\000\002\017\002\017\002\017\002\017\002\017\000\000\002\017\000\000\000\000\000\000\000\000\000\000\002\017\002\017\002\017\002\017\002\017\006B\000\000\000\000\000\000\002\017\000\000\002\017\002\017\000\000\000\000\000\000\000\000\002\017\002\017\002\017\000\000\000\000\000\000\000\000\000\000\000\000\002\017\002\017\002\017\002\017\002\017\002\017\002\017\002\017\002\017\000\000\000\000\002\017\000\000\002\017\002\017\000\000\000\000\000\000\000\000\000\000\000\238\002\017\002\017\002\017\000\000\002\017\002\017\002\017\002\017\000\000\000\000\000\000\002\017\000\000\002\017\002\017\000\000\002\017\002\017\002\017\002\017\002\017\002\017\000\000\000\000\002\017\002\017\014*\000\000\000\000\000\000\000\000\002\017\002\017\002\017\002\017\001\006\000\000\000\006\000\000\007\029\000\000\002\186\002\190\006F\002\234\002\130\005\234\006R\000\000\000\000\002\246\001\n\000\000\006f\000\000\002\142\000\000\006r\007\029\000\000\001\210\003\206\007\029\002\190\0036\001\018\b\206\b\210\001\030\001\"\003\170\000\000\000\000\003F\000\000\002\254\bB\025j\000\000\b\246\b\250\001\210\003\222\0032\003\234\b\254\007\030\000\000\001:\000\000\002\178\000\000\000\000\003:\000\000\000\000\000\000\bz\b~\b\138\b\158\000\000\005v\000\000\003\202\001>\001B\001F\001J\001N\000\000\002\178\t\018\001R\000\000\007\017\000\000\001V\000\000\t\030\t6\t\130\005\130\005\134\000\000\000\000\001Z\000\000\000\000\000\000\007\029\000\000\001^\002\225\007\017\000\000\000\000\018\202\007\017\0072\000\000\000\000\001\154\0062\000\000\011&\005\138\b\146\0112\001\158\000\000\014r\004r\t\150\001\006\001\166\000\006\001\170\001\174\0256\002\186\002\190\000\n\002\234\002\130\000\000\000\000\000\000\000\000\002\246\001\n\000\000\000\000\000\000\b\202\000\000\000\238\000\000\002\225\001\210\000\000\000\000\000\000\0036\001\018\b\206\b\210\001\030\001\"\000\000\002\225\002\225\003F\000\000\002\254\000\000\b\214\000\000\b\246\b\250\000\238\003\222\0032\003\234\b\254\007\030\000\000\001:\000\000\002\178\006\245\000\000\003:\000\000\000\000\000\000\bz\b~\b\138\b\158\006F\005v\000\000\005\234\001>\001B\001F\001J\001N\006\245\006f\t\018\001R\006\245\006r\000\000\001V\000\000\t\030\t6\t\130\005\130\005\134\000\000\006F\001Z\000\000\005\234\025:\000\000\000\000\001^\000\000\000\000\006f\000\000\000\000\000\000\006r\000\000\000\000\001\154\006\134\000\000\000\000\005\138\b\146\012\205\001\158\000\000\014r\004r\t\150\004y\001\166\000\006\001\170\001\174\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\012\205\002\246\000\000\002\030\003\178\000\000\002\"\000\000\004y\000\000\003\182\001\210\000\000\017F\006\245\002\250\000\000\003>\003B\002.\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\016\218\000\000\003\214\003\218\004\026\003\222\0032\003\234\003\242\007\030\000\000\000\000\017>\002\178\000\000\000\000\003:\017V\002:\000\000\bz\b~\b\138\b\158\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017^\000\000\t\018\000\000\t!\000\000\000\000\000\000\000\000\t\030\t6\t\130\005\130\005\134\017r\017\158\000\000\000\000\004y\004y\000\000\000\000\000\000\006\178\004\005\000\000\t!\000\000\000\000\002>\012\205\012\185\000\000\000\000\017\218\021\230\005\138\b\146\025V\000\173\000\000\b\170\004r\t\150\000\173\000\000\002\190\000\173\000\000\002\130\012\205\t\190\000\000\002\030\002\246\000\000\002\"\000\173\000\000\000\173\000\000\000\173\000\000\000\173\001\210\000\238\t\198\000\000\002\250\002.\000\000\000\000\0026\012\185\t\206\000\173\000\000\000\000\000\000\002\254\000\000\000\173\000\000\000\000\000\000\000\173\000\000\0032\001\190\015\174\000\173\000\000\002\130\000\173\002\178\004\005\002:\003:\000\173\000\173\000\173\bz\b~\b\138\000\000\012\150\005v\000\173\000\173\006F\021\142\000\000\005\234\tR\000\173\000\000\000\000\t!\000\173\006f\000\000\000\000\000\000\006r\000\000\000\000\005\130\005\134\000\173\000\173\015\178\000\000\000\173\000\173\000\000\000\000\000\000\000\000\000\000\000\000\002>\000\000\000\173\000\000\015\190\000\000\021\178\000\000\000\173\000\173\005\138\b\146\000\000\000\000\000\197\b\170\004r\000\000\000\173\000\197\000\173\002\190\000\197\000\000\002\130\000\000\t\190\000\000\000\000\002\246\005\134\000\000\000\197\000\000\000\197\000\000\000\197\000\000\000\197\001\210\021\190\t\198\000\000\002\250\000\000\000\000\000\000\000\000\000\000\t\206\000\197\000\000\t2\000\000\002\254\000\000\000\197\021R\000\000\000\000\000\197\000\000\0032\001\190\000\000\000\197\000\000\000\000\000\197\002\178\000\000\000\000\003:\000\197\000\197\000\197\bz\b~\b\138\000\000\012\150\005v\000\197\000\197\000\000\000\000\000\000\000\000\000\000\000\197\000\000\000\000\014\022\000\197\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\197\000\197\000\000\000\000\000\197\000\197\000\000\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\197\000\000\000\000\000\000\000\000\000\000\000\197\000\197\005\138\b\146\000\000\000\000\000\000\b\170\004r\000\000\000\197\000\000\000\197\000\014\000\018\000\022\000\026\000\030\000\000\000\"\000&\000*\000.\0002\000\000\0006\000:\000\000\000\000\000>\016\154\006F\000\000\000B\005\234\015\174\000\000\002\006\002\130\000\000\000F\006f\000\000\000\000\000\000\006r\000J\002\n\000N\000R\000V\000Z\000^\000b\000f\001\210\000\000\000\000\000j\000n\000\000\000r\000\000\000v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\154\000\000\000\000\000\000\015\178\000z\007J\001\222\000~\000\130\000\000\000\000\000\000\002\178\000\000\000\134\000\138\000\142\015\190\000\000\021\146\000\000\000\000\000\146\000\150\000\154\000\158\000\000\000\162\000\166\000\170\000\000\001\r\000\000\000\174\000\178\000\182\001\r\000\000\000\000\000\186\007N\000\190\000\194\005\134\000\000\000\000\000\000\000\000\000\000\000\198\000\000\000\202\000\000\021\158\000\000\001\r\003\213\000\206\000\210\000\000\000\214\003\213\003V\002\190\003\213\000\000\002\130\000\000\006\238\000\000\021R\002\246\000\000\000\000\003\213\000\000\000\000\001\r\003\213\003R\003\213\001\210\007\189\007\014\000\000\001\r\000\000\000\000\003Z\000\000\001\r\tB\003\213\000\000\n\205\000\000\000\000\000\000\003\213\001\r\001\r\003f\000\000\000\000\011\006\001\190\000\000\003\213\000\000\000\000\003\213\002\178\007\189\000\000\003\246\003\213\003\213\n\201\003\250\000\000\004\002\000\000\011\022\005v\n\205\001\r\007\189\000\000\000\000\007\189\t\006\003\213\003\213\000\000\001\r\005z\007\189\000\000\n\205\000\000\007\189\n\205\011\178\005\130\005\134\003\213\003\213\011\030\n\205\003\213\003\213\000\000\n\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\201\011&\000\000\n\201\011f\003\213\005\138\000\000\000\000\000\000\n\201\000\000\004r\t\r\n\201\000\006\003\213\000\000\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\000\000\002\246\000\000\000\000\004\153\000\000\t\r\000\000\t\r\t\r\003\182\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\016\218\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\007\030\000\000\000\000\017>\002\178\000\000\000\000\003:\017V\000\000\000\000\bz\b~\b\138\b\158\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017^\000\000\t\018\000\000\028F\000\000\000\000\000\000\000\000\t\030\t6\t\130\005\130\005\134\017r\017\158\000\000\000\006\028g\015\006\000\246\002\186\002\190\002\194\002\234\002\130\000\000\000\000\000\000\000\000\002\246\000\000\000\000\028\150\000\000\021\230\005\138\b\146\t\r\003\182\001\210\b\170\004r\t\150\002\250\000\000\003>\003B\000\000\000\000\000\000\003\186\000\000\003F\000\000\002\254\000\000\016\218\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\007\030\000\000\016\170\017>\002\178\000\000\000\000\003:\017V\002\006\000\000\bz\b~\b\138\b\158\000\000\005v\000\000\000\000\002\n\000\000\000\000\000\000\000\000\017^\000\000\t\018\001\210\028F\000\000\000\000\000\000\000\000\t\030\t6\t\130\005\130\005\134\017r\017\158\000\000\000\000\004\161\000\000\003\154\000\000\000\000\000\000\001\006\000\000\007J\001\222\000\000\000\000\003V\002\190\006\014\002\178\002\130\021\230\005\138\b\146\014\134\002\246\001\n\b\170\004r\t\150\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\007N\000\000\000\000\002\225\000\000\003z\002\225\001.\006.\000\000\000\000\003r\001\190\0016\002\225\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\002\225\003\250\000\000\004\002\005j\000\n\005v\000\000\002\225\001>\001B\001F\001J\001N\000\000\000\000\000\n\001R\005z\000\000\002\225\001V\000\000\000\000\000\000\002\225\005\130\005\134\000\000\005\202\001Z\002\225\002\225\002\225\002\225\000\000\001^\000\000\002\225\000\000\000\000\000\000\000\000\000\000\002\225\000\000\001\154\0062\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\001\006\000\000\001\166\002\225\001\170\001\174\003V\002\190\tr\002\225\002\130\000\000\000\000\000\000\000\000\002\246\001\n\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\006.\000\000\000\000\003r\001\190\0016\000\000\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\001Z\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\0062\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\001\006\000\000\001\166\000\000\001\170\001\174\003V\002\190\011\n\000\000\002\130\000\000\000\000\000\000\000\000\002\246\001\n\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\006.\000\000\000\000\003r\001\190\0016\000\000\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\001Z\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\0062\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\001\006\000\000\001\166\000\000\001\170\001\174\003V\002\190\r\214\000\000\002\130\000\000\000\000\000\000\000\000\002\246\001\n\000\000\000\000\000\000\002\142\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\001\014\001\018\001\022\003v\001\030\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003z\000\000\001.\006.\000\000\000\000\003r\001\190\0016\000\000\000\000\001:\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\001>\001B\001F\001J\001N\000\000\000\000\000\000\001R\005z\000\000\000\000\001V\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\001Z\000\000\000\000\000\000\000\000\000\000\001^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\154\0062\000\000\000\000\005\138\000\000\000\000\001\158\000\000\001\162\004r\000\000\005\t\001\166\000\000\001\170\001\174\005\t\005\t\005\t\005\t\b\021\005\t\000\000\005\t\005\t\b\021\000\000\005\t\000\000\005\t\000\000\005\t\005\t\005\t\005\t\005\t\005\t\000\000\005\t\005\t\005\t\000\000\000\000\000\000\b\021\000\000\000\000\005\t\000\000\000\000\000\000\000\000\005\t\005\t\005\t\000\000\000\000\000\000\005\t\005\t\005\t\000\000\005\t\000\000\000\000\005\t\b\021\005\t\000\000\000\000\005\t\005\t\005\t\000\000\b\021\005\t\005\t\005\t\000\000\b\021\b\021\000\238\000\000\000\000\005\t\005\t\005\t\000\000\b\021\b\021\005\t\005\t\000\000\000\000\000\000\005\t\000\000\000\000\005\t\000\000\005\t\005\t\005\t\000\000\005\t\005\t\005\t\005\t\000\000\005\t\005\t\b\021\000\000\000\000\b\021\000\000\000\000\000\000\000\000\005\t\020b\005\t\005\t\b\021\000\000\002\150\005\t\000\000\000\000\000\000\000\000\005\t\005\t\n\229\000\000\005\t\n\229\005\t\005\t\n\229\n\229\012\205\012\185\n\229\000\000\n\229\000\000\000\000\n\229\000\000\000\000\000\000\n\229\n\229\000\000\n\229\n\229\000\000\n\229\000\000\n\229\012\205\025\130\000\000\002\030\n\229\000\000\002\"\n\229\002\006\000\000\000\000\000\000\000\000\002*\000\000\n\229\000\000\n\229\002\n\002.\n\229\n\229\0026\012\185\000\000\000\000\001\210\n\229\000\000\000\000\n\229\000\000\000\000\n\229\n\229\000\000\n\229\000\000\n\229\n\229\000\000\000\000\000\000\003\154\000\000\000\000\002:\000\000\000\000\007J\001\222\n\229\000\000\000\000\000\000\000\000\002\178\000\000\000\000\n\229\n\229\000\000\000\000\n\229\000\000\n\229\000\000\000\000\000\000\000\000\005\166\000\000\000\000\000\000\000\000\001\202\001\206\n\229\n\229\000\000\n\229\n\229\000\000\n\229\007N\n\229\000\000\n\229\000\000\n\229\002>\n\229\b\249\b\249\001\210\001\214\001\230\b\249\000\000\001\206\b\249\000\000\000\000\000\000\001\242\000\000\000\000\018\246\b\249\000\000\b\249\b\249\b\249\000\000\b\249\b\249\b\249\001\246\020^\000\000\019~\000\000\002\158\000\000\002\178\004\030\004*\000\000\b\249\000\000\000\000\020n\000\000\000\000\b\249\b\249\000\000\000\000\b\249\000\000\000\000\002\154\000\000\b\249\000\000\000\000\b\249\000\000\004:\000\000\000\000\b\249\b\249\b\249\000\000\000\000\000\000\000\000\000\000\000\000\b\249\b\249\000\000\000\000\000\000\000\000\000\000\b\249\000\000\000\000\000\000\004\154\000\000\000\000\b\249\000\000\000\000\000\000\000\000\000\000\000\000\b\249\b\249\b\249\000\000\b\249\b\249\000\000\004e\000\000\000\000\000\000\000\000\004e\000\000\b\249\004e\b\249\b\249\000\000\000\000\000\000\b\249\000\000\000\000\000\000\004e\b\249\000\000\000\000\004e\b\249\004e\b\249\b\249\012\141\012\141\000\000\000\000\004e\012\141\000\000\001\206\012\141\004e\000\000\000\000\000\000\000\000\000\000\004e\004\186\000\000\012\141\012\141\012\141\004B\012\141\012\141\012\141\000\000\000\000\004e\004e\000\000\000\000\000\000\004e\002\226\000\000\000\000\012\141\000\000\000\000\000\000\000\000\000\000\012\141\012\141\000\000\000\000\012\141\000\000\004e\002\154\004e\012\141\000\000\000\000\012\141\000\000\000\000\000\000\004e\012\141\012\141\012\141\004e\004e\002\226\000\238\004e\004e\012\141\012\141\000\000\000\000\004R\004e\000\000\012\141\000\000\000\000\000\000\004\154\000\000\000\000\012\141\004e\000\000\000\000\000\000\000\000\021f\012\141\012\141\012\141\000\000\012\141\012\141\000\000\007\005\000\000\004e\000\000\000\000\007\005\000\000\012\141\007\005\012\141\012\141\004e\000\000\000\000\012\141\000\000\000\000\000\000\007\005\012\141\000\000\000\000\007\005\012\141\007\005\012\141\012\141\b\253\b\253\000\000\000\000\000\000\b\253\000\000\001\206\b\253\007\005\000\000\000\000\000\000\000\000\000\000\007\005\b\253\000\000\b\253\b\253\b\253\000\000\b\253\b\253\b\253\000\000\000\000\007\005\000\000\000\000\000\000\000\000\007\005\007\005\000\000\000\000\b\253\000\000\000\000\000\000\000\000\000\000\b\253\b\253\000\000\000\000\b\253\000\000\007\005\002\154\000\000\b\253\000\000\000\000\b\253\000\000\000\000\000\000\000\000\b\253\b\253\b\253\007\005\007\005\016\238\000\000\007\005\007\005\b\253\b\253\002\225\000\000\000\000\000\000\000\000\b\253\000\000\002\225\000\000\004\154\018\030\000\000\b\253\007\005\000\000\000\000\000\000\000\000\002\225\b\253\b\253\b\253\002\225\b\253\b\253\000\000\000\n\002\225\002\225\002\225\000\000\000\000\002\225\b\253\002\225\b\253\b\253\002\225\002\225\002\225\b\253\002\225\002\225\002\225\002\225\b\253\002\225\002\225\002\225\b\253\002\225\b\253\b\253\000\000\002\225\000\n\000\000\002\225\002\225\002\225\000\000\002\225\000\000\002\225\002\225\000\n\002\225\002\225\002\225\000\n\002\225\002\225\002\225\000\000\000\000\001*\002\225\002\225\000\000\002\225\002\225\002\225\002\225\002\225\002\225\000\n\002\225\002\225\000\000\002\225\002\225\002\225\000\000\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\000\000\000\000\002\225\000\n\002\225\002\225\002\225\002\225\002\225\000\000\000\000\002\225\002\225\002\225\002\225\002\225\000\000\006\157\002\225\0009\002\225\002\225\000\000\0009\0009\002\225\0009\0009\002\225\000\000\002\225\002\225\0009\000\000\002\225\000\000\000\000\006\157\002\225\002\225\000\000\000\000\0009\002\225\002\225\002\225\0009\003\190\0009\0009\000\000\000\000\000\000\002\225\000\000\0009\000\000\0009\000\000\000\000\000\000\0009\0009\007&\0009\0009\0009\0009\0009\000\000\000\000\000\000\0009\000\000\000\000\0009\000\000\000\000\000\000\0009\0009\0009\0009\000\000\0009\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0009\000\000\000\000\000\000\012\205\012\185\000\000\0009\0009\0009\0009\0009\000\000\006\153\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\012\205\000\000\000\000\002\030\0005\000\000\002\"\000\000\000\000\006\153\0009\0009\000\000\002\206\0005\0009\0009\0009\0005\002.\0005\0005\0026\012\185\000\000\000\000\000\000\0005\000\000\0005\000\000\000\000\000\000\0005\0005\000\000\0005\0005\0005\0005\0005\000\000\000\000\000\000\0005\000\000\002:\0005\000\000\000\000\000\000\0005\0005\0005\0005\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0005\000\000\000\000\000\000\000\000\000\000\000\000\0005\0005\0005\0005\0005\000\000\006\169\000\000\012U\000\000\000\000\000\000\012U\012U\000\000\012U\012U\002>\000\000\000\000\000\000\012U\000\000\000\000\000\000\000\000\006\169\0005\0005\000\000\000\000\012U\0005\0005\0005\012U\000\000\012U\012U\000\000\000\000\000\000\000\000\000\000\012U\000\000\012U\000\000\000\000\000\000\012U\012U\000\000\012U\012U\012U\012U\012U\000\000\000\000\000\000\012U\000\000\000\000\012U\000\000\000\000\000\000\012U\012U\012U\012U\000\000\012U\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012U\000\000\000\000\000\000\000\000\000\000\000\000\012U\012U\012U\012U\012U\000\000\006\165\000\000\012Q\000\000\000\000\000\000\012Q\012Q\000\000\012Q\012Q\000\000\000\000\000\000\000\000\012Q\000\000\000\000\000\000\000\000\006\165\012U\012U\000\000\000\000\012Q\012U\012U\012U\012Q\000\000\012Q\012Q\000\000\000\000\000\000\000\000\000\000\012Q\000\000\012Q\000\000\000\000\000\000\012Q\012Q\000\000\012Q\012Q\012Q\012Q\012Q\000\000\001\202\001\206\012Q\000\000\000\000\012Q\000\000\000\000\000\000\012Q\012Q\012Q\012Q\000\000\012Q\000\000\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\012Q\000\000\000\000\000\000\000\000\001\242\000\000\012Q\012Q\012Q\012Q\012Q\001\250\000\000\000\000\000\000\000\000\000\000\001\246\002\146\000\000\000\000\000\000\002\158\000\000\002\178\004\030\004*\012\145\012\145\000\000\000\000\0046\012\145\012Q\012Q\012\145\000\000\000\000\012Q\012Q\012Q\000\000\000\000\004\138\000\000\012\145\012\145\012\145\004:\012\145\012\145\012\145\000\000\001\021\000\000\000\000\000\000\000\000\001\021\000\000\000\000\000\000\000\000\012\145\000\000\000\000\000\000\000\000\000\000\012\145\012\145\000\000\000\000\012\145\000\000\000\000\000\000\001\021\012\145\000\000\000\000\012\145\000\000\000\000\000\000\000\000\012\145\012\145\012\145\000\000\000\000\000\000\000\000\000\000\000\000\012\145\012\145\000\000\000\000\001\021\000\000\018\254\012\145\000\000\000\000\000\000\012\145\001\021\000\000\012\145\000\000\000\000\001\021\000\000\000\000\000\000\012\145\012\145\012\145\000\000\012\145\012\145\001\021\000\000\000\000\000\000\000\000\000\000\000\000\b\017\012\145\000\006\012\145\012\145\b\017\002\186\002\190\012\145\002\234\002\130\000\000\000\000\012\145\000\000\002\246\000\000\012\145\001\021\012\145\012\145\000\000\003\254\000\000\b\017\001\210\000\000\001\021\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\000\000\000\000\003F\000\000\002\254\000\000\000\000\000\000\003\214\003\218\b\017\003\222\0032\003\234\003\242\007\030\000\000\000\000\b\017\002\178\000\000\000\000\003:\b\017\b\017\000\238\bz\b~\b\138\b\158\000\000\005v\b\017\b\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\018\000\000\000\000\000\000\000\000\000\000\000\000\t\030\t6\t\130\005\130\005\134\000\000\000\000\b\017\000\000\000\000\b\017\000\000\000\000\000\000\000\000\000\000\000\006\000\000\000\000\b\017\002\186\002\190\000\000\002\234\002\130\000\000\000\000\005\138\b\146\002\246\000\000\000\000\b\170\004r\t\150\000\000\014\154\000\000\000\000\001\210\000\000\000\000\000\000\002\250\000\000\003>\003B\000\000\000\000\000\000\001\197\000\000\003F\000\000\002\254\001\197\000\000\000\000\003\214\003\218\000\000\003\222\0032\003\234\003\242\007\030\000\000\000\000\000\000\002\178\000\000\000\000\003:\000\000\001\197\000\000\bz\b~\b\138\b\158\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0059\r\r\t\018\000\000\000\000\005=\r\r\001\197\000\000\t\030\t6\t\130\005\130\005\134\000\000\001\197\000\000\000\000\000\000\0059\001\197\001\197\000\238\0059\005=\000\000\003\029\003\029\005=\001\197\001\197\003\029\000\000\000\000\003\029\000\000\005\138\b\146\000\000\000\000\000\000\b\170\004r\t\150\003\029\003\029\003\029\000\000\003\029\003\029\003\029\000\000\000\000\000\000\000\000\001\197\000\000\000\000\000\000\000\000\000\000\000\000\003\029\000\000\001\197\000\000\000\000\000\000\003\029\004\130\000\000\000\000\003\029\000\000\000\000\000\000\000\000\003\029\r\r\r\r\003\029\000\000\000\000\r\r\r\r\003\029\003\029\003\029\000\000\000\000\000\000\0059\000\000\000\000\003\029\003\029\005=\r\r\000\000\r\r\000\000\003\029\r\r\000\000\r\r\003\029\0059\000\000\003\029\0059\000\000\005=\000\000\000\000\005=\003\029\003\029\003\029\004\137\003\029\003\029\000\000\000\000\019\014\000\000\000\000\000\000\000\000\000\000\003\029\000\000\003\029\003\029\000\000\000\000\000\000\003\029\000\000\000\000\000\000\000\000\003\029\003\182\n\241\000\000\003\029\n\241\003\029\003\029\003V\002\190\000\000\000\000\002\130\000\000\006\238\000\000\000\000\002\246\000\000\000\000\000\000\n\241\n\241\019:\n\241\n\241\000\000\001\210\000\000\007\014\000\000\017>\000\000\000\000\003Z\000\000\017V\tB\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\241\019v\003f\000\000\000\000\003r\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\n\241\003\250\000\000\004\002\005j\011\022\005v\000\000\004\137\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\019\218\005z\001\202\001\206\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\005\202\n\241\000\000\n\241\000\000\000\000\000\000\000\000\000\000\001\210\001\214\000\000\000\000\000\000\000\000\n\241\000\000\000\000\n\241\n\241\000\000\005\138\000\000\n\241\000\000\n\241\000\000\004r\n\237\n\241\000\000\n\237\001\246\002\162\003V\002\190\000\000\002\158\002\130\002\178\004\030\004*\000\000\002\246\000\000\000\000\0046\n\237\n\237\000\000\n\237\n\237\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\004:\000\000\000\000\026b\000\000\000\000\000\000\000\000\n\237\000\000\003f\000\000\000\000\006\n\001\190\000\000\000\000\000\000\000\000\026N\002\178\000\000\000\000\003\246\000\000\000\000\n\237\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\012q\000\000\000\000\012q\000\000\000\000\005\130\005\134\000\000\005\202\n\237\000\000\n\237\012q\000\000\000\000\000\000\000\000\000\000\012q\000\000\001\221\001\221\000\000\n\237\000\000\001\221\n\237\n\237\001\221\005\138\012q\n\237\000\000\n\237\000\000\004r\012q\n\237\001\221\001\221\001\221\000\000\001\221\001\221\001\221\012q\000\000\000\000\012q\000\000\000\000\000\000\000\000\012q\000\000\000\000\001\221\000\000\000\000\000\000\000\000\000\000\001\221\001\221\000\000\000\000\001\221\000\000\000\000\012q\000\000\001\221\000\000\012q\001\221\000\000\000\000\000\000\000\000\001\221\001\221\001\221\000\000\012q\012q\000\000\000\000\012q\001\221\001\221\000\000\000\000\000\000\028>\000\000\001\221\004\145\000\000\000\000\001\221\000\000\022\014\001\221\000\000\012q\000\000\000\000\000\000\000\000\001\221\001\221\001\221\000\000\001\221\001\221\000\000\000\000\000\000\000\000\000\000\003\182\000\000\000\000\001\221\000\000\001\221\001\221\003V\002\190\000\000\001\221\002\130\000\000\006\238\000\000\001\221\002\246\000\000\000\000\004\254\000\000\001\221\022~\000\000\000\000\000\000\001\210\000\000\007\014\000\000\017>\000\000\000\000\003Z\000\000\017V\tB\000\000\000\000\000\000\000\000\000\000\000\000\000\000\023\"\0232\003f\000\000\000\000\011\006\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\n\201\003\250\000\000\004\002\000\000\011\022\005v\000\000\004\145\000\000\000\000\000\000\000\000\000\000\000\000\004\017\000\000\024&\005z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\000\000\011\030\005\137\005\137\000\000\000\000\000\000\005\137\000\000\000\000\005\137\000\000\000\000\000\000\000\000\n\201\000\000\000\000\n\201\n\201\005\137\005\138\005\137\000\000\005\137\n\201\005\137\004r\000\000\n\201\004\017\000\000\000\000\000\000\000\000\000\000\000\246\000\000\005\137\002\194\000\000\000\000\000\000\000\000\005\137\005\137\000\000\000\000\000\000\028\150\005\137\000\000\000\000\005\137\000\000\003\182\005\137\000\000\000\000\000\000\000\000\005\137\005\137\005\137\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\016\218\000\000\000\000\000\000\005\137\005\137\000\000\000\000\005\137\024\166\000\000\001\006\017>\000\000\000\000\000\000\000\000\017V\005\137\005\137\005\137\000\000\005\137\005\137\000\000\000\000\000\000\001\n\007\246\000\000\000\000\002\142\000\000\017^\000\000\005\137\000\000\028F\005\137\005\137\001\014\001\018\001\022\001\026\001\030\001\"\000\000\017r\017\158\000\000\005\137\004\161\000\000\001&\000\000\001.\0012\000\000\000\000\000\000\000\000\0016\000\000\000\000\001:\000\000\000\000\000\000\021\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\003]\003]\001R\000\000\000\000\003]\001V\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\003]\003]\000\000\003]\001^\003]\000\000\003]\003]\000\000\000\000\000\000\000\000\000\000\001\154\027z\000\000\000\000\003]\003]\003]\001\158\003]\001\162\003]\003]\003]\001\166\000\000\001\170\001\174\005\017\000\000\000\000\003]\000\000\003]\003]\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\000\000\000\000\005\021\000\000\000\000\003]\000\000\000\000\003]\000\000\000\000\000\000\003]\003]\003]\003]\003]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\003]\003]\003]\000\000\003]\000\000\000\000\005\017\000\000\000\000\000\000\000\000\000\000\000\000\003]\003]\003]\000\000\003]\003]\005}\005}\000\000\000\000\005\021\005}\000\000\000\000\005}\003]\000\000\003]\003]\000\000\000\000\003]\000\000\000\000\005}\000\000\005}\000\000\005}\000\000\005}\000\000\003]\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005}\000\000\000\000\000\000\000\000\000\000\005}\005}\000\000\000\000\000\000\000\000\b>\000\000\000\000\005}\000\000\000\000\005}\000\000\000\000\000\000\000\000\005}\005}\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005}\005}\000\000\000\000\005}\000\000\t\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005}\005}\005}\000\000\005}\005}\000\000\000\000\n\"\000\000\000\000\012j\t\t\000\000\t\t\t\t\000\000\005}\000\000\000\000\005}\005}\nZ\nr\nz\nb\n\130\000\000\000\000\001\202\002~\000\000\005}\002\130\000\000\000\000\n\138\n\146\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\154\000\000\000\000\001\210\001\214\001\230\002\134\000\000\000\238\000\000\000\000\000\000\000\000\001\242\001\006\000\000\000\000\n*\nj\n\162\n\170\n\186\000\000\000\000\000\000\000\000\002\138\002\146\000\000\n\194\001\n\002\158\000\000\002\178\004\030\004*\000\000\000\000\n\202\000\000\021>\000\000\021B\001\014\001\018\001\022\001\026\001\030\001\"\000\000\000\000\000\000\n\234\000\000\n\242\n\178\001&\004:\001.\0012\t\t\n\210\000\000\000\000\0016\000\000\005\134\001:\000\000\n\218\n\226\000\000\000\000\000\000\000\000\000\000\021N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001B\001F\001J\001N\000\000\b\133\b\133\001R\021R\000\000\b\133\001V\000\000\b\133\000\000\000\000\000\000\000\000\000\000\000\000\001Z\000\000\000\000\b\133\000\000\b\133\001^\b\133\000\000\b\133\000\000\000\000\000\000\000\000\000\000\000\000\001\154\027\150\000\000\000\000\000\000\b\133\000\000\001\158\000\000\001\162\000\000\b\133\b\133\001\166\000\000\001\170\001\174\000\000\000\000\000\000\b\133\000\000\000\000\b\133\000\000\000\000\000\000\000\000\b\133\b\133\b\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\133\000\000\000\000\000\000\b\133\rY\rY\000\000\000\000\000\000\rY\000\000\000\000\rY\b\133\b\133\b\133\000\000\b\133\b\133\000\000\000\000\000\000\rY\000\000\rY\000\000\rY\b\133\rY\000\000\b\133\001\202\001\206\000\000\b\133\000\000\000\000\000\000\000\000\000\000\rY\000\000\000\000\004\254\000\000\b\133\rY\rY\r]\r]\001\210\001\214\004B\r]\000\000\rY\r]\000\000\rY\000\000\000\000\000\000\000\000\rY\rY\rY\r]\000\000\r]\000\000\r]\000\000\r]\001\246\002\154\000\000\000\000\000\000\002\158\rY\002\178\004\030\004*\rY\r]\000\000\000\000\0046\000\000\015\202\r]\r]\000\000\rY\rY\rY\004B\rY\rY\r]\000\000\000\000\r]\004R\004:\000\000\000\000\r]\r]\r]\rY\000\000\000\000\000\000\rY\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\r]\000\000\rY\000\000\r]\001\205\000\000\000\000\000\000\000\000\001\205\000\000\001\206\001\205\r]\r]\r]\000\000\r]\r]\000\000\b\229\000\000\001\205\004R\000\000\000\000\001\205\006\237\001\205\000\000\r]\000\000\006\237\000\000\r]\000\000\000\000\000\000\000\000\000\000\001\205\000\000\000\000\000\000\000\000\r]\001\205\001\205\000\000\000\000\000\000\006\237\000\000\002\154\000\000\001\205\000\000\000\000\001\205\000\000\000\000\000\000\000\000\001\205\001\205\001\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\237\000\000\000\000\000\000\000\000\000\000\001\205\001\205\006\237\000\000\004\154\003A\000\000\006\237\006\237\000\238\003A\000\000\001\206\003A\001\205\001\205\006\237\006\237\001\205\001\205\000\000\b\225\000\000\003A\000\000\000\000\000\000\003A\001\205\003A\000\000\000\000\000\000\000\000\000\000\001\205\000\000\000\000\000\000\000\000\001\205\003A\006\237\000\000\000\000\000\000\001\205\003A\001\201\000\000\000\181\006\237\000\000\000\000\002\154\000\181\003A\000\000\000\181\003A\000\000\000\000\000\000\000\000\003A\003A\003A\024\006\000\181\000\000\000\181\000\000\000\181\000\000\000\181\000\000\000\000\000\000\000\000\000\000\003A\003A\000\000\000\000\004\154\000\000\000\181\000\000\000\000\000\000\000\000\000\000\000\181\000\000\003A\003A\000\181\000\000\003A\003A\000\000\000\181\000\000\000\000\000\181\000\000\000\000\000\000\003A\000\181\000\181\000\238\000\000\000\000\000\000\003A\000\000\000\000\000\181\000\181\003A\000\000\000\000\000\000\000\000\000\181\003A\000\000\000\249\000\181\000\000\000\000\000\000\000\249\000\000\000\000\000\249\000\000\000\000\000\181\000\181\000\000\000\000\000\181\000\181\000\000\000\249\000\000\000\249\000\000\000\249\000\000\000\249\000\181\000\000\000\000\000\000\000\000\000\000\000\181\000\181\000\000\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\181\000\249\000\181\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\249\000\000\000\000\000\000\000\000\000\249\000\249\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\000\000\000\000\000\000\249\000\000\000\000\000\189\000\249\000\000\000\000\000\000\000\189\000\000\000\000\000\189\000\000\000\000\000\249\000\249\000\000\000\000\000\249\000\249\000\000\000\189\000\000\000\189\000\000\000\189\000\000\000\189\000\249\000\000\000\000\000\000\000\000\000\000\000\249\000\249\000\000\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\249\000\189\000\249\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\189\000\000\000\000\000\000\000\000\000\189\000\189\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\000\000\000\000\189\000\000\000\000\000\185\000\189\000\000\000\000\r\025\000\185\000\000\000\000\000\185\r\025\000\000\000\189\000\189\000\000\000\000\000\189\000\189\000\000\000\185\000\000\000\185\000\000\000\185\000\000\000\185\000\189\000\000\000\000\r\025\000\000\000\000\000\189\000\189\000\000\000\000\000\000\000\185\000\000\000\000\000\000\000\000\000\189\000\185\000\189\000\000\000\000\000\185\000\000\000\000\000\000\r\025\000\185\000\000\000\000\000\185\000\000\000\000\000\000\r\025\000\185\000\185\000\238\000\000\r\025\r\025\000\238\000\000\000\000\000\185\000\185\000\000\000\000\r\025\r\025\000\000\000\185\000\000\000\000\001\169\000\185\000\000\000\000\000\000\001\169\000\000\000\000\001\169\000\000\000\000\000\185\000\185\000\000\000\000\000\185\000\185\000\000\001\169\000\000\r\025\000\000\001\169\004e\001\169\000\185\000\000\000\000\004e\r\025\000\000\000\185\000\185\000\000\000\000\000\000\001\169\001\169\000\000\000\000\000\000\000\185\001\169\000\185\000\000\000\000\000\000\004e\005\017\000\000\000\000\001\169\000\000\000\000\001\169\000\000\000\000\000\000\000\000\001\169\001\169\001\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004e\000\000\000\000\000\000\000\000\000\000\001\169\000\000\004e\000\000\001\169\rU\rU\004e\002\226\000\000\rU\000\000\000\000\rU\001\169\001\169\004e\004e\001\169\001\169\000\000\000\000\000\000\rU\005\017\rU\000\000\rU\001\169\rU\000\000\000\000\000\000\000\000\001\169\001\169\000\000\000\000\000\000\000\000\001\169\rU\004e\000\000\000\000\000\000\001\169\rU\rU\000\000\000\000\004e\000\000\000\000\000\000\000\000\rU\000\000\000\000\rU\000\000\000\000\000\000\000\000\rU\rU\rU\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\rU\000\000\000\000\000\000\rU\rQ\rQ\000\000\000\000\000\000\rQ\000\000\000\000\rQ\rU\rU\rU\000\000\rU\rU\000\000\000\000\000\000\rQ\000\000\rQ\000\000\rQ\000\000\rQ\000\000\rU\000\000\000\000\000\000\rU\000\000\000\000\000\000\000\000\000\000\rQ\000\000\000\000\004\254\000\000\rU\rQ\rQ\000\000\000\000\000\000\000\000\000\000\000\000\004m\rQ\000\000\000\000\rQ\000\246\000\000\000\000\002\018\rQ\rQ\rQ\000\000\000\000\000\000\000\000\000\000\000\000\017\222\000\000\000\000\000\000\004m\000\000\003\182\rQ\000\000\b\137\b\137\rQ\000\000\000\000\b\137\000\000\000\000\b\137\017\226\000\000\000\000\rQ\rQ\rQ\018\n\rQ\rQ\b\137\000\000\b\137\000\000\b\137\000\000\b\137\000\000\007\146\017>\000\000\rQ\000\000\000\000\017V\rQ\000\000\000\000\b\137\000\000\000\000\000\000\000\000\000\000\b\137\b\137\rQ\000\000\000\000\000\000\018\162\000\000\000\000\b\137\000\000\000\000\b\137\000\000\000\000\000\000\000\000\b\137\b\137\000\238\017r\018\182\000\000\000\000\004m\004m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\b\137\000\000\000\000\000\000\b\137\000\000\007\001\000\000\018\198\000\000\000\000\000\000\000\000\000\000\b\137\b\137\b\137\000\000\b\137\b\137\000\000\000\000\n\"\000\000\000\000\007\001\000\000\000\000\b\137\007\001\000\000\b\137\000\000\000\000\000\000\b\137\nZ\nr\nz\nb\n\130\000\000\000\000\000\000\000\000\000\000\b\137\001\201\000\000\000\000\n\138\n\146\001\201\000\000\001\206\001\201\000\000\000\000\000\000\n\154\000\000\000\000\000\000\b\225\000\000\001\201\000\000\000\238\000\000\001\201\000\000\001\201\000\000\000\000\000\000\000\000\n*\nj\n\162\n\170\n\186\000\000\000\000\001\201\000\000\000\000\000\000\007\001\n\194\001\201\000\000\000\000\000\000\000\000\000\000\000\000\002\154\n\202\001\201\000\000\000\000\001\201\000\000\000\000\000\000\000\000\001\201\001\201\001\201\000\000\000\000\n\234\000\000\n\242\n\178\000\000\000\000\000\000\000\000\000\000\n\210\000\000\001\201\001\201\000\000\000\000\004\154\000\000\n\218\n\226\000\000\000\000\000\000\016\142\000\000\000\000\001\201\001\201\000\000\000\000\001\201\001\201\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\"\001\201\000\000\000\000\016\146\000\000\000\000\000\000\001\201\000\000\000\000\000\000\000\000\001\201\nZ\nr\nz\nb\n\130\001\201\000\000\000\000\000\000\000\000\000\000\006V\000\000\000\000\n\138\n\146\000\246\001\202\001\206\002\018\000\000\000\000\000\000\n\154\000\000\000\000\000\000\000\000\000\000\017\222\000\000\000\238\000\000\004m\000\000\003\182\001\210\001\214\001\230\000\000\n*\nj\n\162\n\170\n\186\000\000\001\242\017\226\000\000\000\000\000\000\000\000\n\194\018\n\000\000\000\000\000\000\000\000\000\000\001\246\002\146\n\202\000\000\000\000\002\158\017>\002\178\004\030\004*\000\000\017V\000\000\000\000\0046\000\000\n\234\016\150\n\242\n\178\016\166\000\000\000\000\000\000\000\000\n\210\000\000\018\162\000\000\000\000\000\000\004:\000\000\n\218\n\226\005\181\005\181\000\000\000\000\000\000\005\181\017r\018\182\005\181\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\181\000\000\005\181\000\000\005\181\000\000\005\181\000\000\000\000\018\198\000\000\000\000\000\000\000\000\004n\000\000\004r\000\000\005\181\000\000\000\000\000\000\000\000\000\000\005\181\005\181\000\000\000\000\000\000\000\000\b>\000\000\000\000\005\181\000\000\000\000\005\181\000\000\006Y\000\000\000\000\005\181\005\181\000\238\000\000\002\190\000\000\000\000\002\130\000\000\000\000\000\000\000\000\002\246\000\000\002\225\002\225\005\181\006Y\002\225\000\000\005\181\000\000\001\210\002\225\000\000\000\000\002\250\000\000\000\000\002\225\005\181\005\181\005\181\002\225\005\181\005\181\000\000\002\254\000\000\000\000\002\225\000\n\000\000\000\000\007\"\0032\001\190\005\181\000\000\000\000\015f\005\181\002\178\002\225\000\000\003:\002\225\002\225\000\000\bz\b~\b\138\005\181\002\225\005v\000\000\002\225\000\000\000\000\002\225\002\225\000\000\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\005\177\007f\000\000\005\130\005\134\005\177\002\225\000\000\005\177\000\000\000\000\000\000\000\000\000\000\002\225\002\225\000\000\015\162\005\177\000\000\005\177\000\000\005\177\000\000\005\177\000\000\000\000\005\138\b\146\000\000\000\000\000\000\b\170\004r\000\000\000\000\005\177\000\000\002\225\000\000\000\000\000\000\005\177\007\226\002\225\000\000\000\000\000\000\000\000\000\000\000\000\005\177\000\000\000\000\005\177\000\000\000\000\000\000\000\000\005\177\005\177\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\177\000\000\ra\ra\005\177\000\000\000\000\ra\000\000\000\000\ra\000\000\000\000\000\000\005\177\005\177\005\177\000\000\005\177\005\177\ra\000\000\ra\000\000\ra\000\000\ra\000\000\000\000\000\000\000\000\005\177\000\000\000\000\000\000\005\177\000\000\000\000\ra\000\000\000\000\000\000\000\000\000\000\ra\ra\005\177\000\000\000\000\000\000\000\000\000\000\000\000\ra\000\000\000\000\ra\000\000\000\000\000\000\000\000\ra\ra\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\ra\000\000\re\re\ra\000\000\000\000\re\000\000\000\000\re\000\000\000\000\000\000\ra\ra\ra\000\000\ra\ra\re\000\000\re\000\000\re\000\000\re\000\000\000\000\000\000\000\000\ra\000\000\000\000\000\000\ra\000\000\000\000\re\000\000\000\000\000\000\000\000\000\000\re\007\226\ra\000\000\000\000\000\000\000\000\000\000\000\000\re\000\000\000\000\re\000\000\000\000\000\000\000\000\re\re\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\re\000\000\005\201\007f\re\000\000\000\000\005\201\000\000\000\000\005\201\000\000\000\000\000\000\re\re\re\000\000\re\re\005\201\000\000\005\201\000\000\005\201\000\000\005\201\000\000\000\000\000\000\000\000\re\000\000\000\000\000\000\re\000\000\000\000\005\201\000\000\000\000\000\000\000\000\000\000\005\201\007\226\re\000\000\000\000\000\000\000\000\000\000\000\000\005\201\000\000\000\000\005\201\000\000\000\000\000\000\000\000\005\201\005\201\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\201\000\000\005\205\005\205\005\201\000\000\000\000\005\205\000\000\000\000\005\205\000\000\000\000\000\000\005\201\005\201\005\201\000\000\005\201\005\201\005\205\000\000\005\205\000\000\005\205\000\000\005\205\000\000\000\000\000\000\000\000\005\201\000\000\000\000\000\000\005\201\000\000\000\000\005\205\000\000\000\000\000\000\000\000\000\000\005\205\005\205\005\201\000\000\000\000\000\000\000\000\000\000\000\000\005\205\000\000\000\000\005\205\000\000\000\000\000\000\000\000\005\205\005\205\005\205\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\205\003V\002\190\000\000\005\205\002\130\000\000\006\238\000\000\000\000\002\246\000\000\000\000\000\000\005\205\005\205\005\205\000\000\005\205\005\205\001\210\000\000\007\014\000\000\000\000\000\000\000\000\003Z\000\000\000\000\tB\005\205\000\000\000\000\000\000\005\205\000\000\000\000\000\000\000\000\003f\000\000\000\000\011\006\001\190\000\000\b\n\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\000\000\011\022\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003=\000\000\000\000\005z\000\000\003=\000\000\001\206\003=\000\000\000\000\005\130\005\134\000\000\000\000\011\030\000\000\000\000\003=\000\000\000\000\000\000\003=\000\000\003=\000\000\000\000\000\000\000\000\000\000\011&\000\000\000\000\0112\000\000\005\138\003=\000\000\000\000\000\000\000\000\004r\003=\000\000\000\000\001M\000\000\000\000\000\000\002\154\001M\003=\000\000\001M\003=\000\000\000\000\000\000\000\000\003=\003=\003=\000\000\001M\000\000\001M\000\000\001M\000\000\001M\000\000\000\000\000\000\000\000\000\000\003=\003=\000\000\000\000\004\154\000\000\001M\000\000\000\000\000\000\000\000\000\000\001M\000\000\003=\003=\001M\000\000\003=\003=\000\000\001M\000\000\000\000\001M\000\000\000\000\000\000\003=\001M\001M\000\238\000\000\001I\000\000\003=\000\000\000\000\001I\001M\003=\001I\000\000\000\000\000\000\001M\003=\000\000\000\000\001M\000\000\001I\000\000\001I\000\000\001I\000\000\001I\000\000\001M\001M\001M\000\000\001M\001M\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\001M\000\000\001I\000\000\000\000\000\000\001I\001M\000\000\000\000\000\000\001I\000\000\000\000\001I\000\000\000\000\000\000\001M\001I\001I\000\238\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\001I\001\133\000\000\000\000\000\000\000\000\001\133\000\000\012\177\001\133\001I\001I\001I\000\000\001I\001I\000\000\012\177\000\000\001\133\000\000\001\133\000\000\001\133\001I\001\133\000\000\000\000\000\000\000\000\000\000\001I\000\000\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001I\001\133\012\177\000\000\000\000\000\000\000\000\000\000\012\177\000\000\000\000\000\000\000\000\001\133\000\000\000\000\000\000\000\000\001\133\001\133\001\133\000\000\000\000\0019\000\000\000\000\000\000\000\000\0019\000\000\000\157\0019\000\000\000\000\001\133\000\000\000\000\000\000\012\177\000\157\000\000\0019\000\000\0019\000\000\0019\000\000\0019\001\133\001\133\001\133\000\000\001\133\001\133\000\000\000\000\000\000\000\000\000\000\0019\000\000\000\000\000\000\000\000\000\000\0019\000\157\000\000\000\000\001\133\000\000\000\000\000\157\000\000\000\000\000\000\000\000\0019\000\000\000\000\001\133\000\000\0019\0019\0019\000\000\001\213\000\000\000\000\000\000\000\000\001\213\000\000\015\174\001\213\000\000\002\130\000\000\0019\000\000\001\202\001\206\000\157\000\000\001\213\000\000\000\000\000\000\001\213\000\000\001\213\000\000\0019\0019\0019\000\000\0019\0019\000\000\001\210\002\170\001\230\001\213\000\000\000\000\000\000\000\000\000\000\001\213\001\242\000\000\000\000\000\000\0019\015\178\000\000\000\000\001\213\000\000\000\000\001\213\000\000\001\246\002\146\0019\001\213\001\213\002\158\015\190\002\178\004\030\004*\000\000\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\001\213\000Y\000\000\000\000\001\213\000\000\000Y\000\000\000Y\000\000\000\000\000\000\004:\005\134\001\213\001\213\000\000\000Y\001\213\001\213\000Y\000\000\000\000\000\000\000Y\000Y\000\000\b\165\001\213\000\000\000\000\000\000\000\000\000\000\000\000\001\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000\000\001\213\000Y\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000\000\000\000\000\000\000\000\000Y\000Y\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000Y\000Y\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\238\000\000\000Y\002\246\000\000\000Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\000Y\007\014\000\000\000Y\000\000\000\000\003Z\000\000\b\165\tB\000\000\000\000\000Y\004e\007f\000Y\000\000\t~\004e\003f\000\000\004e\r\210\001\190\000\000\000\000\000\000\000\000\000Y\002\178\000\000\004e\003\246\000\000\000\000\004e\003\250\004e\004\002\000\000\011\022\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004e\000\000\000\000\000\000\005z\000\000\004e\007\226\000\000\000\000\004e\000\000\005\130\005\134\000\000\004e\000\000\000\000\004e\000\000\000\000\000\000\000\000\004e\002\226\000\238\000\000\000\000\007\145\000\000\000\000\007\145\004e\004e\r\226\000\000\005\138\000\000\000\000\004e\004e\0035\004r\004e\000\000\000\000\0035\007\145\007\145\0035\007\145\007\145\000\000\004e\004e\000\000\000\000\004e\004e\0035\000\000\000\000\000\000\0035\000\000\0035\000\000\004e\000\000\000\000\000\000\007\145\000\000\000\000\004e\000\000\000\000\0035\015\198\025\202\000\000\000\000\000\000\0035\000\000\004e\000\000\000\000\000\000\007\145\000\000\000\000\0035\000\000\000\000\0035\000\000\000\000\000\000\000\000\0035\0035\0035\003V\002\190\000\000\000\000\002\130\000\000\006\238\000\000\000\000\002\246\000\000\000\000\000\000\0035\000\000\000\000\007\145\0035\007\145\001\210\000\000\007\014\000\000\000\000\000\000\000\000\003Z\0035\0035\tB\005\226\0035\0035\007\145\007\145\000\000\000\000\023\142\007\145\003f\007\145\0035\003r\001\190\007\145\000\000\000\000\016&\0035\002\178\000\000\000\000\003\246\0035\000\000\000\000\003\250\000\000\004\002\0035\011\022\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\238\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\021\254\007\014\000\000\000\000\000\000\000\000\003Z\000\000\000\000\tB\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\024Z\003f\005\138\000\000\011\006\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\000\000\011\022\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\006\238\000\000\005z\002\246\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\000\000\001\210\011\030\007\014\000\000\000\000\000\000\000\000\003Z\000\000\000\000\tB\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\150\003f\005\138\000\000\011\006\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005\194\011\022\005v\000\000\000\000\000\000\003V\002\190\000\000\000\000\002\130\000\000\000\000\000\000\005z\002\246\000\000\000\000\000\000\000\000\005\198\000\000\005\130\005\134\000\000\001\210\011\030\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\022\246\003f\005\138\000\000\003r\001\190\000\000\000\000\004r\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\t%\000\000\000\000\000\000\000\000\000\000\003V\002\190\000\000\005z\002\130\000\000\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\t%\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\000\000\000\000\006\134\000\000\000\000\005\138\002\225\002\225\000\000\003f\002\225\004r\003r\001\190\000\000\002\225\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\002\225\003\250\000\000\004\002\005j\000\000\005v\002\225\000\n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\002\225\000\000\000\000\002\225\002\225\000\000\005\130\005\134\000\000\005\202\002\225\000\000\000\000\002\225\000\000\000\000\002\225\002\225\000\000\002\225\002\225\000\000\002\225\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\138\000\000\t%\000\000\002\225\000\000\004r\004M\004M\000\000\000\000\004M\002\225\002\225\000\000\002\225\004M\000\000\000\000\000\000\000\000\000\000\004M\000\000\000\000\000\000\004M\000\000\000\000\000\000\000\000\000\000\000\000\004M\023F\000\000\002\225\023^\000\000\000\000\002\225\000\000\002\225\000\000\000\000\000\000\004M\000\000\000\000\004M\004M\000\000\000\000\000\000\000\000\000\000\004M\000\000\000\000\004M\000\000\000\000\000\238\004M\000\000\004M\004M\000\000\004M\0035\000\000\000\000\000\000\0035\0035\000\000\000\000\0035\0035\000\000\004M\0035\000\000\000\000\000\000\000\000\000\000\0035\004M\004M\000\000\0035\000\000\0035\000\000\0035\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\015\198\000\000\000\000\0035\015\198\0035\004M\000\000\000\000\0035\000\000\000\000\004M\000\000\0035\000\000\000\000\0035\0035\000\000\000\000\0035\0035\0035\0035\000\000\0035\0035\0035\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0035\000\000\000\000\000\000\0035\000\000\000\000\000\000\0035\000\000\000\000\000\000\000\000\000\000\0035\0035\025\210\000\000\0035\0035\026\002\000\000\0035\0035\012\169\000\000\000\000\000\000\000\000\012\169\000\000\000\000\012\169\000\000\016&\0035\000\000\000\000\016&\0035\0035\000\000\012\169\000\000\0035\000\000\012\169\000\000\012\169\000\000\000\000\000\000\000\000\000\000\005\t\000\000\000\000\000\000\000\000\000\000\012\169\000\000\000\000\000\000\000\000\000\000\012\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\169\000\000\000\000\012\169\000\000\000\000\003V\002\190\012\169\012\169\002\130\000\000\006\238\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\169\001\210\000\000\007\014\012\169\000\000\000\000\000\000\003Z\000\000\000\000\tB\000\000\000\000\012\169\012\169\002z\000\000\012\169\012\169\000\000\003f\000\000\000\000\tn\001\190\000\000\000\000\012\169\000\000\000\000\002\178\026\194\000\000\003\246\012\169\000\000\000\000\003\250\000\000\004\002\000\000\011\022\005v\005a\000\000\012\169\000\000\000\000\005a\000\000\000\000\005a\000\000\000\000\005z\000\000\000\000\000\000\000\000\000\000\000\000\005a\005\130\005\134\000\000\005a\000\000\005a\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005a\000\000\000\000\000\000\000\000\000\000\005a\005\138\000\000\000\000\000\000\000\000\b>\004r\000\000\005a\000\000\000\000\005a\000\000\000\000\000\000\000\000\005a\005a\000\238\000\000\005e\000\000\000\000\000\000\000\000\005e\000\000\000\000\005e\000\000\000\000\000\000\005a\005a\000\000\000\000\005a\000\000\005e\000\000\000\000\000\000\005e\000\000\005e\000\000\005a\005a\000\000\000\000\005a\005a\000\000\000\000\000\000\000\000\005e\000\000\000\000\000\000\000\000\000\000\005e\000\000\0035\000\000\000\000\005a\b>\0035\000\000\005e\0035\000\000\005e\000\000\000\000\000\000\005a\005e\005e\000\238\0035\000\000\000\000\000\000\0035\000\000\0035\000\000\000\000\000\000\000\000\000\000\000\000\005e\005e\000\000\000\000\005e\0035\015\198\000\000\000\000\000\000\000\000\0035\000\000\000\000\005e\005e\000\000\000\000\005e\005e\0035\000\000\000\000\0035\000\000\000\000\000\000\000\000\0035\0035\0035\006\017\000\000\000\000\000\000\005e\006\017\000\000\000\000\006\017\000\000\000\000\000\000\000\000\0035\000\000\005e\000\000\0035\006\017\000\000\000\000\000\000\006\017\000\000\006\017\000\000\000\000\0035\0035\017\174\000\000\0035\0035\000\000\000\000\000\000\006\017\000\000\000\000\000\000\000\000\000\000\006\017\000\000\000\000\000\000\000\000\016&\0035\000\000\000\000\006\017\000\000\000\000\006\017\000\000\000\000\000\000\000\000\006\017\006\017\000\238\000\000\000\000\000\000\000\000\000\000\025\170\000\000\000\000\000\000\000\000\000\000\003V\002\190\006\017\000\000\002\130\000\000\006\017\000\000\000\000\002\246\000\000\000\000\000\000\000\000\000\000\000\000\006\017\006\017\021\138\001\210\006\017\006\017\000\000\000\000\000\000\000\000\003Z\001\202\001\206\000\000\006\017\000\000\000\000\000\000\000\000\000\000\000\000\006\017\000\000\003f\000\000\000\000\003r\001\190\000\000\000\000\001\210\001\214\006\017\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\005\238\000\000\000\000\000\000\001\246\002\162\003V\002\190\005z\002\158\002\130\002\178\004\030\004*\000\000\002\246\005\130\005\134\0046\005\202\000\000\000\000\003\254\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\004:\000\000\000\000\004\217\000\000\005\138\000\000\006\218\000\000\t*\003f\004r\000\000\003r\001\190\000\000\000\000\000\000\000\000\026N\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\006J\000\000\000\000\000\000\000\000\000\000\003V\002\190\000\000\005z\002\130\000\000\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\006\158\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\006j\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\003f\002\130\004r\003r\001\190\000\000\002\246\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\000\000\005v\003Z\000\000\000\000\000\000\000\000\007\165\000\000\000\000\007\165\000\000\000\000\005z\000\000\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\005\202\002\178\007\165\007\165\003\246\007\165\007\165\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\138\006]\000\000\000\000\005z\007\165\004r\003V\002\190\000\000\000\000\002\130\005\130\005\134\000\000\005\202\002\246\000\000\000\000\000\000\000\000\006]\000\000\000\238\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\005\138\011\210\000\000\000\000\000\000\000\000\004r\003V\002\190\000\000\003f\002\130\000\000\003r\001\190\000\000\002\246\007\165\000\000\007\165\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\007\165\005v\003Z\005\234\007\165\000\000\000\000\000\000\007\165\000\000\007\165\000\000\000\000\005z\007\165\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\011\222\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\005z\002\130\004r\000\000\000\000\000\000\002\246\000\000\005\130\005\134\000\000\005\202\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\000\000\000\000\000\000\003Z\000\000\000\000\000\000\011\234\000\000\000\000\000\000\000\000\005\138\003V\002\190\000\000\003f\002\130\004r\003r\001\190\000\000\002\246\000\000\000\000\000\000\002\178\000\000\000\000\003\246\000\000\000\000\001\210\003\250\000\000\004\002\005j\000\000\005v\003Z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005z\000\000\003f\000\000\000\000\003r\001\190\000\000\005\130\005\134\000\000\005\202\002\178\000\000\000\000\003\246\000\000\000\000\000\000\003\250\000\000\004\002\005j\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\138\006\129\000\000\000\000\005z\000\000\004r\000\000\002\190\000\000\000\000\002\130\005\130\005\134\000\000\005\202\002\246\000\000\000\000\000\000\000\000\006\129\000\000\000\000\000\000\000\000\001\210\000\000\000\000\000\000\002\250\000\000\000\000\000\000\000\000\000\000\005\138\000\000\000\000\000\000\000\000\002\254\004r\000\000\000\000\000\000\000\000\000\000\000\000\0032\001\190\000\000\000\000\000\000\000\000\000\000\002\178\000\000\000\000\003:\000\000\000\000\000\000\bz\b~\b\138\000\000\000\000\005v\000\000\000\000\000\000\007\t\007f\000\000\000\000\000\000\007\t\000\000\000\000\007\t\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\130\005\134\007\t\000\000\000\000\000\000\007\t\000\000\007\t\000\000\001\181\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001\181\000\000\007\t\000\000\000\000\000\000\005\138\b\146\007\t\007\226\001\181\b\170\004r\000\000\001\181\000\000\001\181\007\t\000\000\000\000\007\t\000\000\000\000\000\000\000\000\007\t\007\t\000\238\001\181\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\000\000\000\000\000\000\007\t\000\000\001\181\000\000\007\t\001\181\000\000\000\000\000\000\000\000\001\181\001\181\001\181\000\000\007\t\007\t\000\000\000\000\007\t\007\t\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\001\217\001\181\000\000\000\000\000\000\001\217\007\t\000\000\001\217\000\000\000\000\001\181\001\181\000\000\000\000\001\181\001\181\000\000\001\217\000\000\000\000\017\186\001\217\000\000\001\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\181\000\000\000\000\000\000\001\217\001\181\000\000\000\000\000\000\000\000\001\217\000\000\000\000\006\021\000\000\000\000\000\000\000\000\006\021\001\217\000\000\006\021\001\217\000\000\000\000\000\000\000\000\001\217\001\217\000\000\000\000\006\021\000\000\000\000\000\000\006\021\000\000\006\021\000\000\000\000\000\000\000\000\000\000\001\217\000\000\000\000\000\000\001\217\000\000\006\021\000\000\000\000\000\000\000\000\000\000\006\021\000\000\001\217\001\217\000\000\000\000\001\217\001\217\000\000\006\021\000\000\000\000\006\021\000\000\000\000\000\000\001\217\006\021\006\021\000\238\000\000\000\000\000\000\001\217\000\000\000\000\000\000\000\000\021f\000\000\000\000\000\000\000\000\006\021\001\217\012\169\000\000\006\021\000\000\000\000\012\169\000\000\000\000\012\169\000\000\000\000\000\000\006\021\006\021\000\000\000\000\006\021\006\021\012\169\000\000\000\000\000\000\012\169\000\000\012\169\000\000\006\021\000\000\000\000\000\000\005\t\000\000\000\000\006\021\000\000\000\000\012\169\000\000\000\000\000\000\000\000\000\000\012\169\000\000\006\021\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\169\000\000\000\000\000\000\000\000\012\169\012\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012a\000\000\002\190\012a\000\000\028N\000\000\012\169\000\000\000\000\028R\000\000\000\000\012a\000\000\000\000\000\000\000\000\000\000\012a\000\000\012\169\012\169\002z\000\000\012\169\012\169\000\000\000\000\000\000\000\000\012a\000\000\004e\000\000\012\169\000\000\012a\004e\026\250\000\000\004e\012\169\001\002\001\190\000\000\012a\000\000\000\000\012a\000\000\004e\000\000\012\169\012a\004e\000\000\004e\000\000\000\000\004e\000\000\028V\004e\000\000\000\000\000\000\000\000\000\000\004e\012a\000\000\000\000\004e\012a\004e\000\000\004e\000\000\004e\000\000\000\000\000\000\028Z\012a\012a\000\000\004e\012a\000\000\000\000\004e\004e\002\226\000\000\000\000\000\000\004e\bE\bE\000\000\000\000\bE\b>\000\000\012a\004e\bE\004e\004e\000\000\000\000\000\000\016V\004e\002\226\000\238\bE\000\000\000\000\000\000\000\000\004e\004e\bE\000\000\004e\004e\000\000\000\000\004e\000\000\007\246\000\000\004e\000\000\000\000\bE\000\000\000\000\bE\bE\000\000\004e\004e\004e\000\000\bE\004e\004e\bE\000\000\000\000\000\000\bE\000\000\bE\bE\007\146\bE\000\000\000\000\000\000\000\000\001q\004e\000\000\000\000\000\000\001q\000\000\bE\001q\000\000\000\000\000\000\004e\000\000\000\000\bE\bE\000\000\001q\000\000\001q\000\000\001q\000\000\001q\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\237\000\000\001q\000\000\000\000\bE\000\000\000\000\001q\000\000\000\237\bE\000\000\000\000\000\237\000\000\000\237\000\000\000\000\000\000\001q\000\000\000\000\000\000\000\000\001q\001q\000\238\000\237\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\000\000\000\001q\000\000\000\237\000\000\000\000\000\237\000\000\000\000\000\000\000\000\000\237\000\237\000\238\000\000\001q\001q\001q\000\000\001q\001q\000\000\000\000\000\000\000\000\000\000\000\000\000\237\000\000\000\000\000\241\000\237\000\000\000\000\000\000\000\241\001q\000\000\000\241\000\000\000\000\000\237\000\237\000\000\000\000\000\237\000\237\001q\000\241\000\000\000\000\000\000\000\241\000\000\000\241\000\000\007\005\000\000\000\000\000\000\000\000\007\005\000\237\000\000\007\005\000\000\000\241\000\000\000\000\000\000\000\000\000\000\000\241\000\237\007\005\000\000\000\000\000\000\007\005\000\000\007\005\000\241\000\000\000\000\000\241\000\000\000\000\000\000\000\000\000\241\000\241\000\238\007\005\000\000\000\000\000\000\000\000\000\000\007\005\000\000\000\000\000\000\000\000\000\000\000\000\000\241\000\000\007\005\000\000\000\241\007\005\000\000\000\000\000\000\000\000\007\005\007\005\000\000\000\000\000\241\000\241\000\000\000\000\000\241\000\241\000\000\000\000\000\000\000\000\000\000\000\000\007\005\000\000\000\000\000\000\007\005\0116\000\000\000\000\000\000\000\241\000\000\001\202\001\206\011j\007\005\007\005\016\238\000\000\007\005\007\005\000\241\006\t\000\000\000\000\000\000\000\000\006\t\000\000\000\000\006\t\001\210\002\170\001\230\000\000\000\000\007\005\017\142\000\000\000\000\006\t\001\242\000\000\000\000\006\t\000\000\006\t\000\000\005m\007f\000\000\000\000\000\000\005m\001\246\002\146\005m\000\000\006\t\002\158\000\000\002\178\004\030\004*\006\t\000\000\005m\000\000\0046\000\000\005m\000\000\005m\006\t\000\000\000\000\006\t\000\000\000\000\000\000\000\000\006\t\006\t\000\000\005m\004:\000\000\000\000\000\000\000\000\005m\007\226\000\000\000\000\000\000\000\000\000\000\006\t\000\000\000\000\000\000\006\t\005m\000\000\000\000\000\000\000\000\005m\005m\000\238\000\000\006\t\006\t\000\000\000\000\006\t\006\t\000\000\000\000\000\000\000\000\012\017\000\000\005m\000\000\000\000\012\017\000\000\000\000\012\017\000\000\000\000\006\t\000\000\000\000\000\000\000\000\005m\005m\012\017\000\000\005m\005m\012\017\000\000\012\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\017\005m\000\000\000\000\000\000\000\000\012\017\000\000\000\000\000\000\000\000\000\000\000\000\001\202\002~\012\017\000\000\002\130\012\017\000\000\000\000\000\000\000\000\012\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\210\001\214\001\230\000\000\000\000\000\000\000\000\012\017\n\022\000\000\001\242\012\017\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\012\017\012\017\002\138\002\146\012\017\012\017\000\000\002\158\000\000\002\178\004\030\004*\004=\000\000\000\000\000\000\021>\004=\026\166\0045\004=\012\017\000\000\000\000\0045\000\000\000\000\0045\000\000\000\000\004=\000\000\n\250\004:\004=\000\000\004=\0045\000\000\000\000\000\000\0045\005\134\0045\000\000\000\000\000\000\000\000\004=\000\000\000\000\000\000\026\178\000\000\004=\0045\000\000\000\000\000\000\000\000\000\000\0045\000\000\004=\000\000\000\000\004=\000\000\000\000\021R\0045\004=\000\000\0045\000\000\000\000\000\000\000\000\0045\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004=\000\000\000\000\000\000\004=\004U\000\000\0045\000\000\000\000\004U\0045\004%\004U\004=\004=\000\000\004%\004=\004=\004%\0045\0045\004U\000\000\0045\0045\004U\000\000\004U\004%\000\000\000\000\000\000\004%\004=\004%\000\000\000\000\000\000\000\000\004U\0045\000\000\000\000\000\000\017\022\004U\004%\000\000\000\000\000\000\000\000\020\030\004%\000\000\004U\000\000\000\000\004U\000\000\000\000\000\000\004%\004U\000\000\004%\000\000\000\000\000\000\000\000\004%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004U\000\000\000\000\011*\004U\000\000\000\000\004%\000\000\001\202\001\206\004%\000\000\000\000\004U\004U\000\000\000\000\004U\004U\000\000\004%\004%\002\142\000\000\004%\004%\000\000\001\210\001\214\001\230\000\000\000\000\000\000\000\000\004U\000\000\000\000\001\242\000\000\000\000\000\000\004%\000\000\000\000\001\250\021\002\006\221\006\221\000\000\000\000\001\246\002\146\024z\000\000\000\000\002\158\000\000\002\178\004\030\004*\000\000\000\000\004.\000\000\0046\006\221\006\221\006\221\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\221\000\000\000\000\000\000\000\000\000\000\004:\000\000\000\000\000\000\000\000\000\000\000\000\006\221\006\221\000\000\000\000\000\000\006\221\000\000\006\221\006\221\006\221\000\000\004E\000\000\000\000\006\221\000\000\004E\000\000\004-\004E\000\000\000\000\015\182\004-\000\000\000\000\004-\000\000\000\000\004E\000\000\006\221\000\000\004E\000\000\004E\004-\000\000\000\000\000\000\004-\000\000\004-\000\000\000\000\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\004E\004-\000\000\004]\000\000\000\000\000\000\004-\004]\000\000\000\000\004]\004E\000\000\004\"\000\000\006\221\004E\000\000\004-\000\000\004]\000\000\000\000\004-\004]\000\000\004]\000\000\000\000\000\000\000\000\000\000\004E\000\000\000\000\000\000\000\000\000\000\004]\004-\000\000\000\000\000\000\000\000\004]\000\000\004E\004E\000\000\000\000\004E\004E\000\000\004-\004-\000\000\004]\004-\004-\000\000\000\000\004]\0116\000\000\000\000\000\000\000\000\004E\001\202\001\206\000\000\000\000\000\000\000\000\004-\000\000\000\000\004]\018Z\000\000\000\000\000\000\000\000\000\000\003\254\020\170\000\000\001\210\001\214\001\230\000\000\004]\004]\000\000\000\000\004]\004]\001\242\004y\000\000\000\000\000\000\000\000\000\246\000\000\000\000\002\194\000\000\000\000\000\000\001\246\002\146\004]\000\000\000\000\002\158\003\178\002\178\004\030\004*\004y\000\000\003\182\021*\0046\007}\000\000\000\000\007}\000\000\000\000\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\016\218\004:\000\000\000\000\007}\007}\000\000\007}\007}\024\166\000\000\000\000\017>\000\000\000\000\000\000\000\000\017V\000\000\000\000\000\000\007\169\000\000\000\000\007\169\000\000\000\000\000\000\007}\000\000\000\000\000\000\000\000\017^\000\000\000\000\000\000\004n\000\000\004r\007\169\007\169\000\000\007\169\007\169\000\000\007}\017r\017\158\000\000\000\000\004y\004y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\169\000\000\007\153\000\000\021\230\007\153\000\000\000\000\000\000\000\000\000\000\000\000\007}\000\000\007}\000\000\000\000\000\000\000\238\000\000\000\000\007\153\007\153\000\000\007\153\007\153\007}\000\000\000\000\005\234\007}\000\000\006\217\006\217\007}\000\000\007}\000\000\000\000\000\000\007}\000\000\000\000\000\000\000\000\007\153\000\000\000\000\007\169\000\000\007\169\006\217\006\217\006\217\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\217\007\169\000\238\000\000\005\234\007\169\000\000\000\000\000\000\007\169\000\000\007\169\000\000\006\217\006\217\007\169\ri\ri\006\217\000\000\006\217\006\217\006\217\000\000\000\000\000\000\000\000\006\217\000\000\000\000\000\000\000\000\007\153\000\000\007\153\ri\ri\ri\007z\000\000\000\000\000\000\000\000\000\000\006\217\ri\006F\000\000\000\000\005\234\007\153\000\000\000\000\000\000\007\153\000\000\007\153\000\000\ri\ri\007\153\000\000\000\000\ri\000\000\ri\ri\ri\000\000\000\000\000\000\000\000\ri\001\202\001\206\022\154\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\202\001\206\022\250\004\230\000\000\ri\000\000\000\000\001\210\002\170\001\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\001\210\002\170\001\230\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\242\000\000\001\246\002\146\001\202\001\206\000\000\002\158\000\000\002\178\004\030\004*\000\000\001\246\002\146\000\000\0046\000\000\002\158\000\000\002\178\004\030\004*\001\210\001\214\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\004:\000\000\000\000\000\000\000\246\000\000\000\000\002\194\000\000\000\000\000\000\004:\000\000\001\246\002\162\000\000\000\000\004\153\002\158\000\000\002\178\004\030\004*\003\182\000\000\000\000\000\000\0046\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\186\000\000\000\000\000\000\000\000\000\000\016\218\000\000\000\000\004:\000\000\000\000\004\221\000\000\000\000\024\166\000\000\000\000\017>\000\000\000\000\000\000\000\000\017V\000\000\000\000\000\000\000\000\026N\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017^\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\017r\017\158\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\021\230")) and lhs = - (8, "\012\011\n\t\b\007\006\005\004\003\002\001\000\216\216\215\215\214\213\213\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\212\211\211\210\209\209\209\209\209\209\209\209\208\208\208\208\208\208\208\208\207\207\207\206\206\205\204\204\204\203\203\202\202\202\202\202\202\201\201\201\201\201\201\201\201\200\200\200\200\200\200\200\200\199\199\199\199\198\197\196\196\196\196\195\195\195\195\194\194\194\193\193\193\193\192\191\191\191\190\190\189\189\188\188\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\187\186\186\185\185\184\183\182\181\181\180\180\179\179\179\179\178\178\178\178\177\177\176\176\176\176\175\174\173\173\172\172\171\171\170\169\169\168\167\167\166\165\164\164\164\163\163\162\161\161\161\161\161\160\160\160\160\160\160\160\160\159\159\159\159\159\159\158\158\157\157\157\156\156\155\155\155\154\154\153\153\152\152\151\151\150\150\149\149\148\148\147\147\146\146\145\145\144\144\144\143\143\143\143\142\142\141\141\140\140\139\139\139\139\139\138\138\138\138\137\137\137\136\136\136\136\136\136\136\135\135\135\135\135\135\135\134\134\133\133\132\132\132\132\132\132\131\131\130\130\129\129\128\128\127\127\127~}}}||{{{{{{{{{zzyyxxxxxxxxxxxwvuutttttsrrqqppppppppppppppoonnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllkkjjiihhggffeeddccbbaaaaaaaaaaa`_^]\\[ZYXWWWWWWWWWWVVVUUUTTTTSSSSSSSSSRRQQQQQPPOONMLLKKKKKJJIIHHHGGGGGGFFFEEDDCCBBAA@@@??>>==<<;;::9988776655544433322211110/..................-----,,,,,,,+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**))))))))))))))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((''&&&%%$$$$$$$$$$$$$$$$##\"\"!!!!!!! \031\031\030\030\030\030\030\029\029\028\027\026\026\026\025\025\024\024\024\024\024\024\024\024\024\024\023\023\022\022\022\022\021\021\020\019\019\019\019\019\018\017\017\016\016\016\015\015\015\014\014\014\014\r\r") + (8, "\012\011\n\t\b\007\006\005\004\003\002\001\000\218\218\217\217\216\215\215\214\214\214\214\214\214\214\214\214\214\214\214\214\214\214\214\214\214\214\214\213\213\212\211\211\211\211\211\211\211\211\210\210\210\210\210\210\210\210\209\209\209\208\208\207\206\206\206\205\205\204\204\204\204\204\204\203\203\203\203\203\203\203\203\202\202\202\202\202\202\202\202\201\201\201\201\200\199\198\198\198\198\197\197\197\197\196\196\196\195\195\195\195\194\193\193\193\192\192\191\191\190\190\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\189\188\188\187\187\186\185\184\183\183\182\182\181\181\181\181\180\180\180\180\179\179\178\178\178\178\177\176\175\175\174\174\173\173\172\171\171\170\169\169\168\167\166\166\166\165\165\164\163\163\163\163\163\162\162\162\162\162\162\162\162\161\161\160\160\160\160\160\160\159\159\158\158\158\157\157\156\156\156\156\155\155\154\154\153\153\152\152\151\151\150\150\149\149\148\148\147\147\146\146\145\145\145\144\144\144\144\143\143\142\142\141\141\140\140\140\140\140\139\139\139\139\138\138\138\137\137\137\137\137\137\137\136\136\136\136\136\136\136\135\135\134\134\133\133\133\133\133\133\132\132\131\131\130\130\129\129\128\128\128\127~~~}}|||||||||{{zzyyyyyyyyyyyxwvuutttttsrrqqppppppppppppppoonnmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmmllkkjjiihhggffeeddccbbaaaaaaaaaaa`_^]\\[ZYXWWWWWWWWWWVVVUUUTTTTTSSSSSSSSSRRQQQQQPPOONMLLKKKKKJJIIHHHGGGGGGFFFEEDDCCBBAA@@@??>>==<<;;::9988776655544433322211110/...................-----,,,,,,,+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++**))))))))))))))))))))))(((((((((((((((((((((((((((((((((((((((((((((((((((''&&&%%$$$$$$$$$$$$$$$$##\"\"!!!!!!! \031\031\030\030\030\030\030\029\029\028\027\026\026\026\025\025\024\024\024\024\024\024\024\024\024\024\023\023\022\022\022\022\021\021\020\019\019\019\019\019\018\017\017\016\016\016\015\015\015\014\014\014\014\014\014\r\r") and goto = - ((16, "\000%\000\193\000G\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\012\000\000\000\000\000\129\001\152\000\030\0003\000#\000\004\000\190\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000b\000\000\000\000\000\000\000\000\000\000\000t\000\000\000\000\000\000\000\242\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=2\000\000\000\000\000\000\000\254\000\000\000\000\000\000\000\000\000\000\000\000\000\000'\238\001T\001>\000\223\000\000\001B9\220\001\236\001\218\000:\000\000\000\000\000\000\001x\000\000\000\000\000\182\000\000\000\000\000\000\000\000\003\156\000\000\002\150\000\000\000\000\000\000\000\000\000\000\001\022\000\000\000\218\003\202\bf\000\000\000\000\011\018'\238\000\000\000\000\001\254\000\000\000\027\000\000:~\002\184\000\000\001\156\001r\000\000\000\000\002\172\002\142\002\208\003b\001\226\003\202\004\142\000f\001\194\0022\003\216\002\152\011b\000\000\005(\003\244\003\188\002h\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004r\000\000\t>\005(\011\194\000\000\000\000\004.\005d\004\0301\236\000\000\000\000\000\000\000\000\000\000\000\000\000\000\007\148\000\000\004\168\005l\005@\000\000\000\000\000\000\000\000\000\173\000\000\000\000\005\144\000\167\006\018\006(\007\214\000\000\0050\005H\006*\000Q\004\228\006L \232\000\000\000\000\005X\006\254\011\204\000\000!\b\001\244!\026\"V\000\000\003B\000\000\000\000\000\000\000\000\006\018=F\006\020\000\000\001\012\0064\000\000\004P6\150\000\131\000\000\001\172\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0002:\005\190\000\000\000\000\000\000\000\192\000\000\tD\000\000\000\000\002\164\000o\000\000\000\000\003\248\000\000\006n\000\000\002\164\t\148\002\164\000\000\000\000\000\000\000\000\000\0007 \000\000\007\"\006@\000\000=\168\007N\030`\000\000\000\000\000\000\0062\000\000\000\000\000\000\000\000\006F\000\000\000\000\000\000\000\000\000\0002L\000\000\000\000\000\000\000\000\000\000\000\000\001\158\007N\000\000\000\000\000\000\006F\007\1342\146\006\224\007p\015\214\000\000\003\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000(\000\000\000\000\000\000\000\000\b\0122\160\000\000\000\000\007\030\b\0042\214\000\000\000\000\000\00038\007\0143\152\000\000\007\014\000\0003\164\007\014\000\0003\228\007\014\000\000\007\014\000\000\000\000\007\014\000\000\000\0004J\000\000\007\0144\138\000\000\007\014\002|\000\000\000\000\"V\000\000\000\000\000\000\000\000\007\014\"z\000\000\000\000\000\000\007\014\000\000\006F\007\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\016\000\000\007\136\000\000=\132\006F\000\000\000\000\000\000\000\000\b\b\b\184\012$\b\026\b\030\b@\b\028\005\014\b`\0001\t\006\000\000\000\000\000\029\005\136\b\160\001\172\b\200\bL\000\000\000\145\004\138\005\180\007\136\n\"\000\000\000\000C\158\000\000C\224\t\212\000\000=\198\006F>@\006F\000\000\003\"\000\000\003x\000\000\000\000\003\220\000\000\000\000\000\000\nt\000\000\n\030\000\145\000\000\000\000\t>\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\145\000\000\000\000\000\145\000\000\b\200\007\014\000\000\002\182\004\228\000\000\002\182\000\000\000\000\n\206\000\145\000\000\000\000\000\000\000\000\000\000\000\000\002\182\012\132\rL\n4\t\218\"\152\000n\000\000\t\130\b\182\r\158\t\234\b\228\025X1N\000\000\000\000\000\000\000\000\000\000\0032\t\188\000\000\000\000\000\000\t\250\b\244\007V\002\182\011\240\000\000\000\145\000\000\000\000\000\000\001\244\000\000>T\006F\r\166\n\018\t\030\r\254\n \t0\014\180\"\186\007\014\015\024\n\"\t89\190\n\244\000\000#\002\007\014>x\006F\n\238\000\000\000\000\000\000\000\000\007\148\011&\011L\000\000\000\000\b\176\015 \n\208\t>4\172\007\014\015t\n\222\tF6(\000\000>\172\000\000\000\000\015|\"\244\018\\\000\000\000\000\000\000\000\000>\208\000\000\000\000\000\000\007\172\016B\000\000\000\000\000\000\000\000#^>\222\000\000\000\000\000\000\000\000\000\000\n\170\016\150\000\000\n\180$\"\n\180$,\n\180\000\000?\026\000\000$\128\n\180\016\234\004\152\016\244\000\000\000\000$\136\n\180%\022\n\180%\030\n\180%\250\n\180&\002\n\180&\026\n\180&\152\n\180&\246\n\180&\254\n\180'\140\n\180'\148\n\180'\232\n\180(v\n\180(\128\n\180)\014\n\180)^\n\180)h\n\180)\246\n\180*F\n\180*\212\n\180\t\170*\2484\232\007\148\011x\000\000+8;l\000\000\017N\000\000?,\000\000\006F;\166\000\000\006F?P\006F\000\000\017\184\000\000\000\000\000\000+\\\000\000\000\000\000\000\000\000\000\000\007\014\000\000\000\000?\210\000\000\006F\000\000\000\000;\166\011\136\000\000@6\006F\018\018\000\000\000\000\011\"\000\000@H\006F\018\160\000\000\000\000\018\196\000\000\000\000\000\000@Z\006F\019\028\000\000\n\252\019\132\000\0005J\000\000\007\0145\142\000\000\007\0145\176\000\000\007\014\003d\000\000\000\000\000\000\000\000\000\0005\240\007\014\004\222\005\022\000\000\000\000\000\000\n\180\019\222\000\000\000\000\000\000+\150\n\180\000\000\000\000\000\000\000\000\0206\000\000\000\000\000\000\n\180\020D\000\000\020\158\000\000\000\000\000\000\021\004\000\000\000\000\000\000\000\000@\146\000\000\000\000\021^\000\000\000\000\000\000,H\n\180\021l\000\000\000\000\000\000,\138\n\180\021\196\000\000\000\000,\176\n\180\n\180\000\000\007\228\022\030\000\000\000\000-\b\n\180\022l\000\000\000\000-(\n\180-v\n\180\000\000.\004\n\180\000\000\000\000\022\250\000\000\000\000.\152\n\180\023,\000\000\000\000.\200\n\180\023\\\000\000\000\000.\232\n\180\000\000/\000\n\180\000\000;\138\000\000\000\000\n\180\000\000\000\000\023\142\000\000\000\000\023\192\000\000\000\000\011D\000\000\000\000\024\028\000\000\024$\000\000\000\000\000\000\007\148\011\226\000\0007\022\n<\002\164\025\004\000\0007r\000\000\000\000\000\0007\194\000\000\000\000\025$\000\000\025\146\000\000\000\000\000\000\000\000/\n\000\000\000\000\000\000/f\n\1800r\n\180\000\000\n\252\025\156\000\000\000\000\025\236\000\0000T\000\000\000\0001N\000\000\000\000\000\000\026\134\000\000\000\000\000\000\000\000\026\144\000\000\000\000\000\000\000\000\012\152\000\000\000\000\000\000\003\154\000\000\000<\000\000\000;\000\000\0128\000\000\004\144\000\000\000\000\000\000\000\000\000\000\000\000\0032\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\180\000\000\012\164\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\184\007\232\002\182\027T\000\000\011\166\t\224\012*\001\144\t\136\002\182\r@\000\145\t\176\002\182\000\000\027x\000\000\004\142\000\000\011\194\t\238\004X\000\000\000\000\000\000\000\000\000\000\011\218\001.\000\146\000\000\000\000\000\000;\222\000\000C\240\000\000\t\246\000\000\n\016\000\000\000\000\000\000\000\000\002\158\000\000\000\000\000\000\011*\002\164\000\000\002\164\001\178\000\000\rv\002\164\002\164\n\024\000\000\027\186\000\000\000\000\n8\012\172\000\0000\180\005$\000\000\000\000\000\000\000\000\000\000\000\000\n\180\000\000\028\180\000\000\n\180\000\000\000\000\014\242\000\000\000\145\000\000\016H\000\000\000\145\000\000\017\012\000\145\000\000\003Z\000\000\n<\n\022\005`\000\000\011\226\011\234\nV\012\024\012\164\017T\000\145\006\012\000\000\nZ\012\134\012\188\005\024\006\184\012\150\n\130\r\014\006\146\b\132\012\228\000\000\000\000\007\188\b\148\000\000\004\168\002\2426N\007\014\028\028\000\000\007X\003\178\012\158\n\154\011^\005\224\000\000\012\168\n\158\006\200\000\000@\172\006F\rZ\r\132\000\000\t:\000\000\012\244\n\166\006>\r2\003V\000\000\000\000\000\000\000\000\n\216\tZ\000\000\n\222\tl\000\000\bb\0164\rF\rP\n\228\006\216\t\172\000\000\n\230\007\138\n\018\000\000\rR\n\238\r\220\000\000\t\028\000\000\n\132\000\000\r\252\000\000\018\024\000\145\r\216\011\002\014\022\000\000\018\202\0056\r\236\000\000\000\000\003j\006\160\011$\000\000\019\228\000\145\011F\000\000\004\022\000\000\r\210\011\016\0212\006\154\000\000\r\222\011>\007\176\r2\r\230\r\240\011L\015F\000\000\014\000\001\200\000\000\000\000\000\000\000\000\000\171\011X\r\226@\190\006F\000\000\002\200\011\142\014\148\000\000\000\000\000\000\000\000\000\000\000\000A\000\006\164\000\000\011\182\014\246\000\000\000\000\000\000\000\000\000\000\000\000\006\174\000\000A\030\006F\011\226\000\000\006F\011\218\000\184\000\000\011\230\011\232\007\024\000\000\001\004\004L\000\000\002\190\000\000A\"\006F\006F\000\000\000\000\007\b\000\000\b\252\000\000\001\186\007\b\007\b\000\000\011\236;\204\006FA\152\006F\012\b\000\000\000\000\000\000\000\000\012\014\000\000\000\000\007N\000\000\007l\014`\011\240\015p\014*\000\000\000\000\001\196\b|\014h\000\000\000\000\011\250\015\128\014@\000\000\000\000\029\018\000\000\012\222\000\000!(6H\006F\000\000,N\018\132\000\000A\252\000\000\000\000\000\000\007\b\000\000\000\000\012:\014|\012\000\015\144\014J\000\000\000\000B\014\012\144\014\140\000\000\000\000\000\000<:\000\000\000\000\000\000\000\000\000\000\000\000\012\146\000\000\014\152\012\020\006\162\000\000\015\134\015>\012\180\014\166\000\000\000\000\014\170\012>\b*\000\000\000\000\tl6\150\005|\000\000\000\000\000\000\bL\014p\012p\000\000\014z\bL\000\000\015V\012\188\014\196\000\000\000\000\000\000\006F\003v\004(\005\180\000\000\000\000\000\000\000\000\014\138\012t\000\000\006\128\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006F\014z\012\128\015\208\014\138\000\0007\224\000\237\012\146\014^\003\156\000\019\012\150\015\016\000\000\015\200\028\130\000\000\000\000\029J\000\000\012\208\000\000\nL\000\000\000\000\000\000\000\000\000\000\000\000B\018\006F\000\000\015\204\029l\000\000\000\000\030\002\000\000\000\245\012\156\015r\000\000\000\0007\250:\020\015(\000\000B0\006F\0302\000\000\000\000\030T\000\000\000\000\r0\000\000\000\\\000\000\000\000\000\000\000\000\000\000\000\000:\204\000\000\000\0008\188:\208\015*\000\000BP\006F\030\234\000\000\000\000\031\028\000\000\000\000\012\184\031<\r<\000\000\012\190\012\198\002\016\002\208\012\200\t&\012\214\015|0\214\r\\\000\000\r\016\r2\tf\000\000\004*\002k\000\200\004\219\002X\006\022\006%\001%\006\024\006\213\001W\001F\002Y\003\217\006\237\004\220\006+\006\025\006&\004\221\006\131\003\137\002\246\002\247\001%\002g\006e\001\147\001e\001\019\003\253\006,\001\016\0009\001.\001\023\001\016\001H\001\023\001$\006\031\001\016\001\023\001\026\000\128\006!\006\026\001\023\001\026\006\238\006Z\003\254\000\200\001\127\001)\006#\001\016\000\203\002l\000\203\002r\006\166\001\023\001$\001n\003\220\002x\000\200\001\132\002n\001\016\006$\000\147\000\135\006q\001\215\001\023\001$\000\196\001\238\006\027\000\200\000\201\006\021\002i\002\020\002\021\001e\006\028\002z\001%\006\167\003\140\003\145\004\219\002\024\004\000\002k\000\200\004\219\002X\006\022\006%\000=\006\024\000\174\004\220\001`\002Y\005\210\004\226\004\220\006+\006\025\006&\004\252\006y\004\003\003\181\001e\000\134\002g\000\196\001\129\000\186\000\200\000\201\006,\001%\006i\006j\001\130\002\001\001\132\001l\000\203\006\031\005\212\006k\006l\003\234\006!\006\026\002\244\001e\000\147\006-\000\181\001\215\006m\004\b\006#\005\213\001\016\002l\001.\002r\005\215\006\214\001\023\001$\005\238\002x\000\179\001\132\002n\001\016\006$\000\189\002\020\002\021\001e\001\023\001\026\000\196\000\151\006\027\000\200\000\201\006\021\002i\002\020\002\021\001e\006\028\002z\004\236\003\248\003\247\003\249\000\150\002\024\003\165\002k\000\200\002\251\002X\006\022\006%\003\174\006\024\000\202\000\183\005F\002Y\005\210\001\016\000\172\006+\006\025\006&\004\239\001\023\001$\002\001\001\217\000\178\002g\000\200\006i\006j\002\251\003\175\006,\001\031\000\203\004\241\001+\006k\006l\000\203\000\196\006\031\005\212\000\200\001\002\004\215\006!\006\026\006m\004\b\004c\006)\001\003\000\200\002\002\004\242\006#\005\213\004\147\002l\001\"\002r\005\215\007\005\002\021\001e\005\231\002x\001\219\001\132\002n\004'\006$\002\023\001\023\001\031\001\006\001\031\001 \004c\001 \006\027\000\200\0012\003\178\002i\002k\000\200\001\002\006\028\002z\006\021\001\223\002\020\002\021\001e\002\024\006\180\002k\000\200\005\251\005F\001\"\0013\001\"\007\b\007\t\004\213\002X\007\011\001O\004\149\006\024\006+\005M\005N\002Y\004f\001\222\001\132\003\168\006\025\007\r\000\194\001\023\0007\005\254\006\167\006,\002g\005^\003\173\001\016\0007\005W\004\b\002\002\006\031\001\023\001$\001\224\006\000\006!\002l\004\150\001*\006c\001*\001\132\000\184\006\026\002m\006#\001\132\002n\002l\000\196\002r\000\196\000\200\000\201\000\200\000\201\002x\0018\001\132\002n\006\001\006$\007\006\006\206\002k\000\200\006\179\001\016\000\188\001\016\002\020\002\021\001e\001\023\001$\001\023\001$\006\027\000\203\002z\005\210\002i\000\193\001%\006\021\006\028\002\020\002\021\001e\007\028\004\149\002\251\002\024\006G\002k\000\200\005M\005N\003\221\007\020\000\196\002X\007\021\000\200\001\002\006\024\007\016\000\204\005\212\002Y\001.\000\211\005V\001\246\006\025\007\029\005W\004\b\001>\002\251\001>\006?\002g\005\213\006,\001%\002\251\001%\005\215\004\218\005\205\001F\005\222\006\031\001\246\002\251\003\168\006\207\006!\001\250\003\230\004\b\002\003\006\026\000\147\000\200\001\202\001\215\006#\006\221\003\220\002l\001.\002r\001.\001H\002\251\001H\002\253\002x\002\005\001\132\002n\002\003\006$\002\023\000\200\0049\006\208\000\203\006\168\006\169\000\224\006\215\001\023\002\001\002\024\006\027\002k\000\200\004c\002i\002z\000\200\000\228\006\028\002\252\001d\001e\002~\005W\004\b\002\024\004\014\002k\000\200\006\021\004F\002\020\002\021\001e\002\004\004\138\004c\004\019\007!\000\200\001f\002\192\003\234\001h\001i\006\216\002X\006\022\0063\001\198\006\024\001\239\003\220\002\251\002Y\002\004\004+\006,\001\230\006\025\006&\000\212\001\234\005\245\001\023\000\225\006\031\002g\002l\006\217\003\234\006!\002\001\004(\001\031\002\251\002m\001 \001\132\002n\006\222\006#\001\132\000\234\002l\000\241\002r\006\218\006\026\005?\003\247\003\249\002x\000\249\001\132\002n\000\147\006$\0050\001\215\001\229\001\"\001\235\006o\001Y\001\132\001\031\000\196\001\n\001 \000\200\000\201\004U\001e\001m\002z\001\236\005S\003\247\003\249\004Q\002\002\006\027\000\203\001\r\001n\002i\000\203\000\200\001\030\006\028\001;\006\021\001\"\002\020\002\021\001e\002\024\005\210\002k\000\200\006\002\0044\004\198\001*\000\203\002\251\007\020\000\236\002X\007\021\002\251\000\196\006\024\006+\000\200\001\002\002Y\004\201\002\193\000\242\002\251\006\025\007\024\001\164\006v\005\212\005\254\005\217\006,\002g\000\196\003\234\001\016\000\200\000\201\001*\000\245\006\031\001\023\001$\005\213\006\000\006!\001\129\002\002\005\215\001B\001\006\004>\005\219\006\026\001\157\006#\001\132\001l\002l\004\143\002r\006\144\000\200\002\251\005\210\0007\002x\001\016\001\132\002n\006\001\006$\000\203\001\023\001$\004\155\001d\001e\004`\004\b\004\188\005[\003\247\003\249\000\203\001\246\001-\006\027\004r\002z\004:\002i\005\212\001%\001\023\006\028\001f\001v\001G\001h\001i\000\203\002\024\003\220\002k\000\200\006\021\005\213\002\020\002\021\001e\001\247\005\215\002\251\002\003\007\027\005\216\000\200\001>\004\210\001.\001\246\000\200\002X\006\022\001%\001\016\006\024\000\250\004\203\004\228\002Y\001\023\001$\006,\001V\006\025\006/\006\176\001w\001\229\001x\002\199\006\031\002g\001G\001E\002!\006!\001\159\002\003\001\\\001.\000\200\000\147\001H\005:\001\215\006#\001\156\001\016\002l\004\243\002r\000m\006\026\001\023\001$\001C\002x\001\127\001\132\002n\002\004\006$\000\196\005#\004v\000\200\001\002\004\245\001n\001t\001\023\000\200\001]\001\031\004\239\001\031\001 \000\203\001 \002z\003\b\001\246\004\222\000\200\001\002\001~\006\027\004C\001\031\004\241\002i\005$\005d\005%\006\028\000\203\002\004\001\163\001\203\001\175\001\"\002\024\001\"\002k\000\200\001d\001e\003\204\003@\004\242\002\003\000\200\001\002\000\200\001\016\006@\003\025\000\203\0062\005F\001\023\001\026\005&\004L\001\016\001f\002\192\001\129\001h\001i\001\023\001$\004\222\006,\000\203\001\130\002\251\001\132\001l\003\220\002\251\005\254\006\031\001*\003Q\001*\001u\006!\002\251\002\251\004\159\004\b\001\198\003\234\001\199\005'\006\000\006#\001\186\006\157\002l\001\230\002r\001\180\005(\001\234\005)\001\023\002x\002\004\001\132\002n\001\016\006$\001\016\002\020\002\021\001e\001\023\001$\001\023\001$\006\001\0007\006\143\002\251\001\031\001\016\004\016\005e\002X\002z\001\188\001\023\001$\004\t\006\133\003\202\002Y\001m\006\152\003\247\003\249\004\253\006Q\001\235\001\031\004?\000\203\001 \001n\002g\005+\000\200\001\185\004D\006z\005-\0057\001\236\000\203\005M\005N\001>\001\195\001>\001\031\005a\005C\004\b\001%\002\251\001%\001\"\005f\002\015\005O\005_\002\020\002\021\001e\005W\004\b\005b\003r\001%\006g\002\251\004\224\001\191\005F\000\200\006\187\002X\000\203\006h\002\251\001.\002\018\001.\001H\002Y\001H\003u\000m\004~\002 \003\147\004\222\001\129\002i\001\023\006\131\001\237\002g\001\031\001*\001\157\001 \001\132\001l\002\024\001\208\002k\000\200\001\016\000\203\002/\002\251\001\246\005I\001\023\001$\002\020\002\021\001e\0022\000\203\004\\\001\210\0028\005\200\001\"\002M\000\200\001\016\005\130\002R\002X\001\246\001\031\001\023\001$\002o\004h\003\212\002Y\001G\002\003\005F\000\203\000\200\006\229\004k\001\226\001\016\001\233\000m\000\203\002g\003\195\001\023\001$\002i\001\031\003\216\003\191\001 \002\003\002\251\002l\000\200\002r\001%\002\024\001*\002k\000\200\002x\000\203\001\132\002n\005M\005N\005\192\004s\001>\002\170\000\203\006\159\001\246\001\"\000\203\001%\003\203\000\203\006\231\005O\005_\000\203\001&\002z\005W\004\b\001\016\002\014\002o\002\004\005F\005\224\001\023\001$\000\200\001%\003\209\001\198\004*\001\228\002i\002\003\001.\003\224\000\200\001H\001\230\003\241\002\251\002\004\001\234\002\024\001\023\002k\000\200\002l\001*\002r\004w\005\134\003\243\001\016\0010\002x\004\005\001\132\002n\001\023\001$\001\031\006\173\000\203\001 \005M\005N\006a\004\b\001>\000\203\002\017\004\n\001\031\004)\002o\001%\001\016\002z\002\031\005O\005_\001\235\001\023\001$\005W\004\b\004/\001\"\0046\000\203\002.\002\004\002\020\002\021\001e\001\236\000\203\0021\0027\002C\000\203\002l\001.\002r\005F\001H\004\127\002X\004<\002x\001%\001\132\002n\000\203\002@\002Y\001\198\000\203\001\254\002\251\004O\006V\004T\005M\005N\001\230\004_\001>\002g\001\234\001*\001\023\002z\000\203\001%\000\203\002\251\003o\005O\005_\002\020\002\021\001e\005W\004\b\002\020\002\021\001e\000\203\000\196\000\203\004g\000\200\000\201\004j\002X\002H\004q\004u\001\016\002X\001.\004z\002Y\001H\001\023\001$\001\246\002Y\001\235\000\203\001\016\004\134\006D\004\021\002G\002g\001\023\001$\004\153\005\210\002g\000\203\001\236\000\203\002L\004\144\002i\000\203\002\020\002\021\001e\002Q\004P\002\254\002w\002\003\002\174\002\024\000\200\002k\000\200\004\158\004\148\002X\002\209\005M\005N\005\212\004\163\001>\002\216\002Y\000\203\002\251\004\173\000\203\001%\004\015\000\203\000\203\006\155\006\156\005\213\000\203\002g\005W\004\b\005\215\001%\002o\002\245\005\226\002\251\000\203\002i\002\251\002\020\002\021\001e\002i\000\203\004\179\001\246\001.\003d\002\024\001H\002k\000\200\003l\002\024\002X\002k\000\200\002\004\003\252\002l\002\251\002r\002Y\001\198\004\190\002$\000\203\002x\003\201\001\132\002n\006K\001\230\000\203\002\003\002g\001\234\000\200\001\023\000\203\002o\003\161\004\205\004\202\003\171\002o\002i\003\193\004\223\004\209\002z\004\230\001\031\004\247\003\208\005\b\003\210\002\024\005\001\002k\000\200\005\026\004\235\002\251\002\251\004\240\000\203\002l\003\223\003\014\004\004\005/\002l\004\012\002r\002x\001\235\001\132\002n\001\"\002x\002\251\001\132\002n\0045\002\251\000\203\005\024\004.\002o\001\236\006\021\0059\002\004\002i\002\251\0040\0043\002z\002\020\002\021\001e\004B\002z\000\203\002\024\007\020\002k\000\200\007\021\000\203\000\203\006\024\000\203\002X\000\203\002l\005E\002r\005Y\000\203\006\025\002Y\000\203\002x\005i\001\132\002n\001\031\0048\005 \005,\003\198\000\203\005o\002g\005s\002o\004A\005\143\002\020\002\021\001e\002\251\002\020\002\021\001e\002z\0054\002\251\006\026\001\016\005K\005\183\000\203\002X\005\243\001\023\001$\002X\005\188\005\227\005|\002Y\002l\002\251\002r\002Y\005\193\003\184\004=\002\251\002x\003\136\001\132\002n\002g\004@\004N\000\203\002g\000\203\000\196\004S\006\027\000\200\000\201\000\203\002\020\002\021\001e\001\198\006\028\003\214\002i\002z\000\203\005\223\000\203\004[\001\230\000\203\002\251\002X\001\234\002\024\001\023\002k\000\200\001%\005\159\002Y\007\023\005\210\005\199\000\203\005\185\003\131\000\203\002\251\004Z\004^\000\203\000\203\002g\005\207\005\248\001\016\006\r\006J\000\203\006\030\005\196\001\023\001$\002i\001.\002o\005\230\002i\006\031\005\212\004i\002\251\001\235\006!\002\024\002\251\002k\000\200\002\024\002\251\002k\000\200\002\251\006#\005\213\002\251\001\236\000\203\002\251\005\215\004t\006d\002l\005\244\003\014\004p\004y\005\242\002\251\006$\002x\004\141\001\132\002n\000\203\006p\002o\006~\001d\001e\002o\002i\002\251\001%\005\246\000\203\000\203\004\129\000\203\000\203\006\128\002\251\002\024\002z\002k\000\200\004\140\002\251\001f\001v\004\135\001h\001i\002l\002\251\002r\004\139\002l\005\250\002r\004\002\002x\005\255\001\132\002n\002x\006\011\001\132\002n\006\018\002\251\003\127\006 \000\203\002o\006'\002\251\002\020\002\021\001e\004\152\002\020\002\021\001e\002z\0060\004\157\000\203\002z\000\203\005\000\001w\002X\001x\0024\004\162\002X\004\165\004\169\006u\002Y\002l\000\203\002r\002Y\004\177\003x\004\184\006\161\002x\003i\001\132\002n\002g\006\175\004\195\004\255\002g\004\248\004\249\004\254\007\014\001\127\002\020\002\021\001e\005\002\002\020\002\021\001e\005\003\005\"\002z\001n\005\027\005\028\000\200\007\025\002X\005!\0056\0052\002X\007\030\003\130\0053\002Y\0055\005`\005D\002Y\000\196\003a\005H\000\200\000\201\001\198\005J\004\029\002g\003Y\005L\005X\002g\005h\001\230\005j\005k\005p\001\234\005t\001\023\002i\001d\001e\005x\002i\005\138\005\145\005\149\005\173\005\194\005\210\002\024\005\218\002k\000\200\002\024\005\228\002k\000\200\006\020\001\129\001f\001g\006\014\001h\001i\006\015\006\019\001\130\006\"\001\132\001l\006I\006T\006_\006s\006t\001\235\005\212\006x\006\160\006\164\006\174\002o\006\178\005#\002i\002o\007\000\000\000\002i\001\236\000\000\005\213\002\020\002\021\001e\002\024\005\215\002k\000\200\002\024\006\007\002k\000\200\000\000\000\000\000\000\000\000\002X\002l\000\000\002r\005$\002l\005%\002r\002Y\002x\000\000\001\132\002n\002x\002d\001\132\002n\000\000\000\000\000\000\002o\002g\000\000\000\000\002o\000\000\001m\002\020\002\021\001e\000\000\000\000\002z\000\000\000\000\005&\002z\001n\000\000\000\000\000\200\000\000\002X\000\000\000\000\000\000\000\000\002l\000\000\002r\002Y\002l\000\000\003\014\000\000\002x\002q\001\132\002n\002x\000\000\001\132\002n\002g\000\000\000\000\000\000\000\000\005'\002\020\002\021\001e\000\000\000\000\002\020\002\021\001e\005(\002z\005)\002i\000\000\002z\000\000\002X\000\000\001\198\000\000\004!\002X\000\000\002\024\002Y\002k\000\200\001\230\001\129\002Y\002\128\001\234\000\000\001\023\005c\002\127\001\157\002g\001\132\001l\000\000\000\000\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\002i\002o\000\000\005+\000\000\000\000\000\000\000\000\005-\0057\000\000\002\024\002X\002k\000\200\000\000\000\000\001\235\005a\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002\179\000\000\002l\000\000\002r\001\236\000\000\002g\005b\000\000\002x\000\000\001\132\002n\000\000\000\000\002i\002o\000\000\000\000\000\000\002i\000\000\000\000\002\020\002\021\001e\002\024\000\000\002k\000\200\000\000\002\024\002z\002k\000\200\001\198\000\000\004$\002X\000\000\000\000\000\000\000\000\002l\001\230\002r\002Y\000\000\001\234\000\000\001\023\002x\002\190\001\132\002n\000\000\000\000\000\000\002o\002g\000\000\000\000\000\000\002o\000\000\002i\000\000\000\000\002\020\002\021\001e\001\198\000\000\0042\002z\000\000\002\024\000\000\002k\000\200\001\230\000\000\000\000\002X\001\234\002l\001\023\002r\001\235\000\000\002l\002Y\002r\002x\000\000\001\132\002n\002\213\002x\000\000\001\132\002n\001\236\000\000\002g\002\020\002\021\001e\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\000\002i\000\000\000\000\002z\000\000\000\000\001\235\000\000\000\000\000\000\003T\002\024\000\000\002k\000\200\001\031\000\000\002l\005\015\002r\001\236\002\020\002\021\001e\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\000\000\003U\000\000\002X\000\000\000\000\002\020\002\021\001e\001\"\002o\002Y\002i\000\000\000\000\002z\000\000\002\220\001\198\000\000\004\131\002X\000\000\002\024\002g\002k\000\200\001\230\000\000\002Y\000\000\001\234\000\000\001\023\000\000\002\223\000\000\002l\000\000\002r\006\021\000\000\002g\000\000\000\000\002x\000\000\001\132\002n\002\023\002\020\002\021\001e\000\000\000\000\002o\000\000\000\000\006\022\000\000\002\024\006\024\002k\000\200\000\000\002X\000\000\000\000\002z\000\000\006\025\001\235\000\000\002Y\000\000\000\000\000\000\000\000\000\000\002\229\000\000\001\016\002l\002i\002r\001\236\002g\001\023\001$\000\000\002x\000\000\001\132\002n\002\024\003W\002k\000\200\000\000\006\026\000\000\002i\002\020\002\021\001e\000\000\000\000\001\198\000\000\004\137\000\000\000\000\002\024\002z\002k\000\200\001\230\002X\000\000\002l\001\234\000\000\001\023\000\000\000\000\002Y\002o\002m\000\000\001\132\002n\002\232\000\000\006\027\000\000\000\000\000\000\000\000\002g\001%\000\000\006\028\000\000\000\000\002o\002i\000\000\002\020\002\021\001e\000\000\000\000\000\000\002l\000\000\002r\002\024\000\000\002k\000\200\001\235\002x\002X\001\132\002n\006\029\001.\000\000\000\000\000\000\002Y\002l\000\000\002r\001\236\000\000\003\001\000\000\000\000\002x\006\030\001\132\002n\002g\002z\000\000\000\000\000\000\002o\006\031\000\000\002\020\002\021\001e\006!\000\000\000\000\002i\002\020\002\021\001e\000\000\002z\000\000\006#\000\000\002X\000\000\002\024\000\000\002k\000\200\000\000\002X\002Y\002l\000\000\002r\000\000\000\000\006$\002Y\000\000\002x\003\011\001\132\002n\002g\000\000\000\000\000\000\003\016\000\000\000\000\002g\000\000\002\020\002\021\001e\000\000\002o\000\000\002i\002\020\002\021\001e\002z\000\000\001\198\000\000\004\146\000\000\000\000\002\024\000\000\002k\000\200\001\230\002X\003T\000\000\001\234\000\000\001\023\000\000\000\000\002Y\002l\000\000\002r\000\000\000\000\000\000\000\000\000\000\002x\003\018\001\132\002n\002g\000\000\000\000\000\000\005\214\000\000\002o\002i\000\000\000\000\000\000\000\000\000\000\000\000\002i\002\020\002\021\001e\002\024\002z\002k\000\200\001\235\000\000\000\000\002\024\000\000\002k\000\200\000\000\002X\000\000\000\000\002l\000\000\002r\001\236\000\000\002Y\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\003\022\000\000\002o\002g\002\023\000\000\000\000\000\000\000\000\002o\000\000\002i\002\020\002\021\001e\002\024\002z\002k\000\200\002\020\002\021\001e\002\024\000\000\002k\000\200\000\000\002X\000\000\002l\000\000\003\014\000\000\000\000\002X\002Y\002l\002x\003\014\001\132\002n\000\000\002Y\000\000\002x\003\030\001\132\002n\002g\000\000\003W\000\000\003$\000\000\002o\002g\000\000\000\000\000\000\000\000\002z\000\000\002i\002\020\002\021\001e\000\000\002z\000\000\000\000\000\000\000\000\000\000\002\024\002l\002k\000\200\000\000\002X\000\000\000\000\002l\002m\003\014\001\132\002n\002Y\000\000\001\198\002x\004\154\001\132\002n\000\000\000\000\000\000\003*\001\230\000\000\002g\000\000\001\234\000\000\001\023\000\000\002o\000\000\002i\002\020\002\021\001e\000\000\002z\000\000\002i\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\002X\000\000\002\024\000\000\002k\000\200\000\000\000\000\002Y\002l\000\000\003\014\000\000\000\000\0032\000\000\000\000\002x\001\235\001\132\002n\002g\000\000\000\000\002\020\002\021\001e\002o\000\000\000\000\000\000\000\000\001\236\000\000\002o\002i\000\000\000\000\000\000\002X\002z\000\000\000\000\000\000\000\000\000\000\002\024\002Y\002k\000\200\000\000\000\000\000\000\0037\002l\000\000\003\014\000\000\000\000\000\000\002g\002l\002x\003\014\001\132\002n\000\000\000\000\000\000\002x\000\000\001\132\002n\001\198\000\000\006O\000\000\000\000\002o\000\000\002i\000\000\001\230\000\000\000\000\002z\001\234\000\000\001\023\000\000\000\000\002\024\002z\002k\000\200\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\003.\000\000\000\000\002X\000\000\000\000\002x\000\000\001\132\002n\000\000\002Y\002i\002\020\002\021\001e\002o\000\000\000\000\001\235\000\000\003C\000\000\002\024\002g\002k\000\200\000\000\002X\002z\000\000\000\000\000\000\001\236\000\000\000\000\002Y\002\020\002\021\001e\000\000\000\000\000\000\002l\000\000\002r\003H\000\000\000\000\002g\000\000\002x\002X\001\132\002n\002o\000\000\000\000\000\000\000\000\002Y\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\003M\000\000\000\000\002g\002z\000\000\000\000\002X\000\000\000\000\000\000\000\000\002l\002i\002r\002Y\000\000\002\020\002\021\001e\002x\000\000\001\132\002n\002\024\003\\\002k\000\200\002g\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\000\000\002i\000\000\002Y\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\002\024\003_\002k\000\200\002g\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\002i\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\002X\000\000\000\000\002o\002X\002l\000\000\003\014\002Y\002i\000\000\000\000\002Y\002x\003e\001\132\002n\000\000\003g\000\000\002\024\002g\002k\000\200\000\000\002g\000\000\002o\000\000\000\000\002l\000\000\003\014\000\000\002i\000\000\002z\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\002o\000\000\002l\000\000\003\014\000\000\000\000\000\000\000\000\002z\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002o\000\000\002l\002i\003\014\000\000\000\000\002i\002z\000\000\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\002\024\000\000\002k\000\200\000\000\000\000\002\020\002\021\001e\002l\000\000\003.\000\000\000\000\000\000\002z\000\000\002x\000\000\001\132\002n\002X\002\020\002\021\001e\000\000\000\000\000\000\002o\002Y\000\000\000\000\002o\000\000\000\000\003q\000\000\002X\000\000\000\000\002z\000\000\002g\000\000\000\000\002Y\000\000\000\000\002\020\002\021\001e\003z\000\000\000\000\000\000\002l\000\000\002r\002g\002l\000\000\002r\000\000\002x\000\000\001\132\002n\002x\000\000\001\132\002n\003\182\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\002\020\002\021\001e\000\000\002z\000\000\000\000\000\000\002z\000\000\002X\000\000\000\000\000\000\000\000\002X\000\000\000\000\002Y\002i\000\000\000\000\000\000\002Y\003}\000\000\000\000\000\000\000\000\003\139\002\024\002g\002k\000\200\000\000\002i\002g\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\000\000\002\023\002o\002Y\000\000\000\000\000\000\000\000\000\000\003\142\000\000\000\000\002\024\000\000\002k\000\200\002g\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\002i\002r\000\000\000\000\000\000\002i\000\000\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\002l\002\024\002r\002k\000\200\000\000\000\000\000\000\002x\000\000\001\132\002n\002\020\002\021\001e\002z\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\002l\002X\002o\000\000\002i\002z\002X\002o\002m\002Y\001\132\002n\000\000\000\000\002Y\002\024\000\000\002k\000\200\003\152\000\000\000\000\002g\000\000\003\157\000\000\000\000\002g\000\000\002l\000\000\002r\000\000\000\000\002l\000\000\002r\002x\000\000\001\132\002n\000\000\002x\000\000\001\132\002n\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\002r\000\000\000\000\000\000\006\021\002i\002x\000\000\001\132\002n\002i\000\000\000\000\002\020\002\021\001e\002\024\000\000\002k\000\200\000\000\002\024\006\022\002k\000\200\006\024\000\000\000\000\002X\002z\000\000\002\020\002\021\001e\006\025\000\000\002Y\000\000\000\000\000\000\000\000\000\000\003\206\000\000\000\000\000\000\002X\000\000\002o\002g\000\000\000\000\000\000\002o\002Y\000\000\000\000\000\000\000\000\000\000\003\219\000\000\000\000\006\026\002\020\002\021\001e\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\003\014\000\000\002X\002l\000\000\003\014\002x\000\000\001\132\002n\002Y\002x\000\000\001\132\002n\000\000\004\007\000\000\000\000\000\000\006\027\000\000\000\000\002g\000\000\000\000\000\000\000\000\006\028\002z\000\000\002i\000\000\000\000\002z\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\002i\000\000\002X\006(\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002\024\000\000\002k\000\200\000\000\004J\000\000\006\030\000\000\000\000\000\000\000\000\002g\000\000\002o\000\000\006\031\000\000\000\000\000\000\000\000\006!\002i\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\006#\002o\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\002l\002X\002r\000\000\000\000\000\000\006$\000\000\002x\002Y\001\132\002n\001d\001e\000\000\005w\000\000\000\000\002l\000\000\002r\000\000\002g\000\000\002o\000\000\002x\000\000\001\132\002n\002i\002z\001f\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\002z\000\000\002l\000\000\002r\000\000\004\023\000\000\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\001\031\000\000\000\000\005\012\000\000\000\000\000\000\002o\000\000\001w\000\000\001x\0024\000\000\000\000\002i\002z\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\001\"\002k\000\200\000\000\000\000\000\000\000\000\002l\002X\002r\002\020\002\021\001e\001\127\000\000\002x\002Y\001\132\002n\000\000\000\000\000\000\005z\000\000\001n\002X\000\000\000\200\000\000\002g\000\000\002o\000\000\002Y\000\000\003\130\000\000\000\000\002z\005\137\000\000\000\000\000\000\005\014\000\000\000\000\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\002r\000\000\000\000\000\000\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\005\017\000\000\000\000\000\000\001\129\000\000\002\020\002\021\001e\002i\002z\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\002\024\002X\002k\000\200\000\000\000\000\002i\000\000\000\000\002Y\002\020\002\021\001e\000\000\000\000\005\140\000\000\002\024\000\000\002k\000\200\000\000\002g\000\000\000\000\002X\000\000\002\020\002\021\001e\000\000\005\018\002o\002Y\000\000\000\000\000\000\000\000\000\000\005\153\000\000\001\031\002X\004\220\001 \005\023\002g\005\020\000\000\002o\002Y\000\000\000\000\000\000\000\000\000\000\005\156\000\000\001.\002l\000\000\002r\000\000\002g\000\000\000\000\000\000\002x\001\"\001\132\002n\000\000\000\000\000\000\000\000\000\000\002l\000\000\002r\000\000\000\000\002i\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\002z\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\002i\000\000\002z\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\002\024\002X\002k\000\200\000\000\000\000\002i\000\000\002o\002Y\000\000\002\020\002\021\001e\000\000\005\177\000\000\002\024\000\000\002k\000\200\000\000\002g\000\000\001\016\000\000\002X\002\020\002\021\001e\001\023\001$\002o\000\000\002Y\002l\000\000\002r\000\000\000\000\005\180\000\000\002X\002x\000\000\001\132\002n\002g\000\000\002o\002Y\000\000\000\000\000\000\000\000\000\000\005\184\000\000\000\000\002l\000\000\002r\000\000\002g\000\000\000\000\002z\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\001>\002l\000\000\002r\000\000\006\021\002i\001%\000\000\002x\000\000\001\132\002n\000\000\000\000\002z\000\000\002\024\000\000\002k\000\200\000\000\000\000\006\022\000\000\000\000\006\024\000\000\000\000\000\000\000\000\002i\002z\000\000\001.\006\025\000\000\001?\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\002i\000\000\002o\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\006\026\000\000\000\000\002X\000\000\000\000\000\000\001d\001e\000\000\002o\002Y\002l\000\000\002r\000\000\000\000\006\191\000\000\000\000\002x\000\000\001\132\002n\002g\000\000\002o\001f\001v\000\000\001h\001i\000\000\000\000\006\027\000\000\000\000\002l\000\000\002r\000\000\000\000\006\028\002z\000\000\002x\000\000\001\132\002n\000\000\006Y\000\000\000\000\002l\000\000\002r\000\000\000\000\000\000\000\000\000\000\002x\000\000\001\132\002n\000\000\0061\000\000\002z\000\000\001w\000\000\001x\0024\000\000\000\000\000\000\002\020\002\021\001e\000\000\006\030\000\000\002i\002z\000\000\000\000\000\000\000\000\000\000\006\031\000\000\002X\000\000\002\024\006!\002k\000\200\000\000\000\000\002Y\001\127\002\020\002\021\001e\006#\006\193\000\000\000\000\000\000\000\000\000\000\001n\002g\000\000\000\200\000\000\002X\002\020\002\021\001e\006$\000\000\003\130\000\000\002Y\002o\000\000\001d\001e\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002g\000\000\000\000\002Y\001\031\000\000\000\000\005\012\000\000\000\000\001f\001v\000\000\001h\001i\002l\002g\002r\000\000\000\000\001\166\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\001\"\000\000\001\129\002i\000\000\000\000\000\000\000\000\000\000\000\000\001\130\000\000\001\132\001l\002\024\002z\002k\000\200\000\000\000\000\000\000\000\000\001w\000\000\001x\001\153\000\000\000\000\002i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\005\014\002i\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\001\127\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\002o\001\016\002l\000\000\002r\000\000\000\000\001\023\005\017\000\000\002x\000\000\001\132\002n\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\004\024\000\000\000\000\000\000\002z\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\002l\000\000\004\020\001d\001e\000\000\000\000\000\000\002x\001\129\001\132\002n\000\000\000\000\000\000\002z\005\018\001\130\000\000\001\132\001l\001d\001e\001f\001v\000\000\001h\001i\004\220\000\000\005\022\002z\005\020\001\150\000\000\002\020\002\021\001e\000\000\000\000\000\000\001f\001v\001.\001h\001i\000\000\000\000\000\000\000\000\002X\001\155\000\000\001d\001e\000\000\000\000\000\000\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001w\000\000\001x\001\153\000\000\002g\000\000\001f\001v\000\000\001h\001i\000\000\000\000\000\000\002\020\002\021\001e\001w\000\000\001x\001\153\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\002X\001\127\000\000\000\000\000\000\000\000\000\000\000\000\002Y\000\000\000\000\000\000\001n\001f\001v\000\200\001h\001i\000\000\001\127\001w\002g\001x\0024\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\002i\000\000\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\001\127\000\000\002X\000\000\000\000\001w\000\000\001x\002<\000\000\002Y\001n\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\001\129\000\000\003~\002g\000\000\000\000\002o\000\000\001\130\002i\001\132\001l\000\000\000\000\000\000\000\000\001\127\000\000\001\129\000\000\002\024\000\000\002k\000\200\000\000\000\000\001\130\001n\001\132\001l\000\200\000\000\000\000\002l\000\000\003\190\000\000\000\000\000\000\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\000\000\001\129\000\000\002o\000\000\000\000\000\000\000\000\002?\001\130\000\000\001\132\001l\002i\000\000\002z\002\020\002\021\001e\000\000\000\000\002\020\002\021\001e\002\024\000\000\002k\000\200\000\000\000\000\002l\002X\003X\000\000\000\000\000\000\002X\001\129\002x\002Y\001\132\002n\000\000\000\000\002Y\001\130\000\000\001\132\001l\000\000\000\000\000\000\002g\000\000\000\000\000\000\002o\002g\000\000\000\000\000\000\002z\000\000\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\002X\002l\000\000\002\255\002Y\000\000\000\000\000\000\002Y\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\002g\000\000\000\000\000\000\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002i\000\000\000\000\002z\000\000\002i\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\002o\000\000\000\000\002X\002i\002o\000\000\002Y\002i\000\000\000\000\002Y\000\000\000\000\000\000\002\024\000\000\002k\000\200\002\024\002g\002k\000\200\000\000\002g\000\000\000\000\002l\000\000\002t\000\000\000\000\002l\000\000\002v\002x\000\000\001\132\002n\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\002o\000\000\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\002{\000\000\002l\002i\002\130\000\000\002x\002i\001\132\002n\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\002\024\000\000\002k\000\200\002\020\002\021\001e\000\000\002\020\002\021\001e\002z\000\000\000\000\000\000\002z\000\000\000\000\000\000\002X\002\020\002\021\001e\002X\000\000\000\000\000\000\002Y\002o\000\000\000\000\002Y\002o\000\000\000\000\002X\000\000\000\000\000\000\000\000\002g\000\000\000\000\002Y\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\002g\002\132\000\000\002l\000\000\002\134\000\000\002x\000\000\001\132\002n\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\002z\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\002i\000\000\000\000\000\000\002i\000\000\000\000\002Y\000\000\000\000\000\000\002\024\000\000\002k\000\200\002\024\002i\002k\000\200\000\000\002g\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\002o\000\000\000\000\002X\002o\000\000\000\000\002X\000\000\000\000\000\000\002Y\000\000\000\000\000\000\002Y\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002g\000\000\000\000\002l\002g\002\136\000\000\002l\000\000\002\138\000\000\002x\002i\001\132\002n\002x\000\000\001\132\002n\002l\000\000\002\140\000\000\002\024\000\000\002k\000\200\002x\000\000\001\132\002n\000\000\000\000\000\000\002z\000\000\000\000\000\000\002z\002\020\002\021\001e\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\002X\002o\000\000\000\000\002X\002i\000\000\000\000\002Y\002i\000\000\000\000\002Y\000\000\000\000\000\000\002\024\000\000\002k\000\200\002\024\002g\002k\000\200\000\000\002g\000\000\000\000\002l\000\000\002\142\002\020\002\021\001e\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\001\031\000\000\000\000\001 \002X\000\000\002o\000\000\000\000\000\000\002o\000\000\002Y\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002g\000\000\001\"\000\000\006\140\000\000\000\000\000\000\002l\000\000\002\144\000\000\002l\002i\002\146\000\000\002x\002i\001\132\002n\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\002\024\000\000\002k\000\200\000\000\000\000\000\000\002\020\002\021\001e\000\000\002z\002\020\002\021\001e\002z\000\000\001*\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002X\002o\000\000\002Y\002i\002o\000\000\000\000\002Y\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002g\002k\000\200\001\016\000\000\002g\000\000\000\000\000\000\001\023\001$\000\000\002l\000\000\002\148\000\000\002l\000\000\002\150\000\000\002x\000\000\001\132\002n\002x\000\000\001\132\002n\000\000\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\002z\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\001>\002X\000\000\000\000\002l\002i\002\152\001%\000\000\002Y\002i\006\147\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\000\000\002\024\002g\002k\000\200\000\000\002\020\002\021\001e\000\000\000\000\002\020\002\021\001e\001.\002z\000\000\001H\000\000\000\000\000\000\002X\000\000\000\000\000\000\000\000\002X\000\000\002o\002Y\000\000\000\000\000\000\002o\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002g\000\000\000\000\000\000\000\000\002g\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\002\154\000\000\000\000\002l\002i\002\156\002x\000\000\001\132\002n\000\000\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002\020\002\021\001e\000\000\002z\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\002X\000\000\000\000\000\000\002i\000\000\000\000\002o\002Y\002i\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\002\024\002g\002k\000\200\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\002\158\000\000\000\000\000\000\002X\000\000\002x\000\000\001\132\002n\000\000\002o\002Y\000\000\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002g\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\000\000\002\160\000\000\000\000\002l\002i\002\162\002x\000\000\001\132\002n\000\000\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\002z\000\000\000\000\000\000\000\000\002z\002X\000\000\000\000\000\000\002\171\001e\000\000\000\000\002Y\002i\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002g\002k\000\200\002\225\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\002l\000\000\002\164\000\000\000\000\000\000\002\188\000\000\002x\000\000\001\132\002n\000\000\002o\002\191\001d\001e\001f\002\192\000\000\001h\001i\000\000\000\000\002\188\000\000\000\000\002\230\002\246\002\247\000\000\002z\002\191\000\000\000\000\001f\002\192\000\000\001h\001i\002l\002i\002\166\002\020\002\021\001e\000\000\000\000\002x\000\000\001\132\002n\002\024\000\000\002k\000\200\000\000\006\021\002X\001\127\000\000\000\000\000\000\000\000\000\000\000\000\002Y\000\000\000\000\000\000\001n\002z\007\020\000\200\000\000\007\021\000\000\000\000\006\024\002g\000\000\000\000\000\000\000\000\002o\000\000\000\000\006\025\000\000\000\000\000\000\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\002\250\000\000\000\200\000\000\000\000\000\000\001m\000\000\002l\000\000\002\168\000\000\000\000\006\026\000\000\000\000\002x\001n\001\132\002n\000\200\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\002\020\002\021\001e\000\000\002\193\001\130\002i\001\132\001l\000\000\002z\001\031\000\000\000\000\005\012\002X\000\000\002\024\006\027\002k\000\200\000\000\002\193\002Y\002\195\000\000\006\028\000\000\000\000\001\129\000\000\000\000\000\000\002\020\002\021\001e\002g\001\157\001\"\001\132\001l\000\000\002\194\000\000\000\000\000\000\007\022\001\129\002X\002o\000\000\000\000\002\020\002\021\001e\001\157\002Y\001\132\001l\000\000\000\000\000\000\000\000\000\000\000\000\006\030\000\000\002X\000\000\002g\000\000\000\000\000\000\000\000\006\031\002Y\002l\000\000\003\005\006!\000\000\005\014\000\000\000\000\002x\000\000\001\132\002n\002g\006#\000\000\000\000\000\000\000\000\000\000\002i\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\000\000\006$\002\024\002z\002k\000\200\001\016\002X\002\020\002\021\001e\000\000\001\023\005\017\000\000\002Y\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002X\002i\000\000\000\000\000\000\002g\000\000\000\000\002Y\000\000\000\000\002o\002\024\000\000\002k\000\200\000\000\000\000\000\000\000\000\002i\002g\000\000\000\000\002\020\002\021\001e\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\000\000\000\000\000\000\002l\002X\003\"\005\018\000\000\000\000\002o\000\000\002x\002Y\001\132\002n\000\000\000\000\000\000\004\220\000\000\005\021\000\000\005\020\000\000\000\000\002g\000\000\000\000\002o\002i\000\000\000\000\000\000\001.\002z\000\000\002l\000\000\003(\000\000\002\024\005#\002k\000\200\002x\002i\001\132\002n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\002\024\003-\002k\000\200\002\020\002\021\001e\002x\000\000\001\132\002n\002z\000\000\005$\006\199\005%\002o\000\000\000\000\002X\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002Y\002i\000\000\002z\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\002\024\002g\002k\000\200\002l\005&\0035\000\000\000\000\000\000\000\000\000\000\002x\000\000\001\132\002n\000\000\000\000\000\000\000\000\002l\000\000\003:\000\000\000\000\000\000\000\000\000\000\002x\000\000\001\132\002n\002o\000\000\000\000\002z\000\000\000\000\005'\002\020\002\021\001e\000\000\000\000\000\000\000\000\000\000\005(\000\000\005)\000\000\002z\000\000\000\000\002X\000\000\000\000\000\000\000\000\002l\002i\003<\002Y\002\020\002\021\001e\000\000\002x\000\000\001\132\002n\002\024\005e\002k\000\200\002g\000\000\000\000\002X\002\020\002\021\001e\000\000\000\000\001\031\000\000\002Y\001 \000\000\000\000\002z\002\020\002\021\001e\002X\005+\006\201\001d\001e\002g\005-\0057\002Y\002o\000\000\000\000\002X\000\000\000\000\000\000\005a\001\"\000\000\000\000\002Y\002g\000\000\001f\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\005b\002g\000\000\000\000\002l\000\000\003?\000\000\002i\000\000\000\000\000\000\002x\000\000\001\132\002n\002\020\002\021\001e\002\024\000\000\002k\000\200\000\000\000\000\000\000\006\021\000\000\001*\000\000\000\000\002X\002i\000\000\001w\002z\001x\0024\000\000\002Y\000\000\007\020\000\000\002\024\007\021\002k\000\200\006\024\002i\000\000\000\000\002o\002g\000\000\000\000\000\000\006\025\001\016\000\000\002\024\002i\002k\000\200\001\023\001$\001\127\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\002o\001n\000\000\002l\000\200\003F\000\000\000\000\000\000\000\000\006\026\002x\003\129\001\132\002n\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002l\002o\003K\000\000\000\000\000\000\006\139\002z\002x\002i\001\132\002n\000\000\001%\000\000\000\000\002l\006\027\003P\000\000\002\024\000\000\002k\000\200\002x\006\028\001\132\002n\002l\000\000\003S\002z\000\000\001\129\002\171\001e\002x\000\000\001\132\002n\001.\001\130\000\000\001\132\001l\007\026\000\000\002z\002\020\002\021\001e\000\000\002o\000\000\002\225\001v\000\000\001h\001i\002z\000\000\000\000\000\000\002X\006\030\000\000\000\000\000\000\000\000\000\000\000\000\002Y\000\000\006\031\000\000\000\000\000\000\000\000\006!\002l\000\000\003\133\002\171\001e\002g\000\000\000\000\002x\006#\001\132\002n\000\000\000\000\000\000\000\000\000\000\002\230\002\246\002\247\002\171\001e\000\000\002\225\001v\006$\001h\001i\000\000\000\000\000\000\002z\002\171\001e\000\000\000\000\000\000\000\000\001d\001e\002\225\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\001\127\000\000\000\000\002\225\001v\000\000\001h\001i\000\000\001f\001v\001n\001h\001i\000\200\002i\002\230\002\246\002\247\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\024\000\000\002k\000\200\002\020\002\021\001e\002\230\002\246\002\247\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\144\002\230\002\246\002\247\001\127\000\000\000\000\000\000\001w\002\022\001x\006\245\000\000\006\247\002o\001n\000\000\000\000\000\200\000\000\000\000\001\127\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\001n\001\127\001\130\000\200\001\132\001l\000\000\001\127\000\000\002l\000\000\003\135\001n\000\000\000\000\000\200\004\r\002x\001n\001\132\002n\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\005\195\001d\001e\000\000\000\000\000\000\000\000\002z\000\000\001\129\000\000\000\000\005\229\000\000\000\000\000\000\002\023\001\130\000\000\001\132\001l\001f\001v\000\000\001h\001i\001\129\002\024\000\000\002k\000\200\000\000\000\000\000\000\001\130\000\000\001\132\001l\001\129\000\000\000\000\000\000\000\000\000\000\001\129\000\000\001\130\001\031\001\132\001l\001 \000\000\001\130\0012\001\132\001l\001\031\000\000\000\000\001 \000\000\000\000\0012\000\000\001w\000\000\001x\006:\000\000\000\000\000\000\000\000\000\000\0013\001\"\000\000\000\000\000\000\000\000\000\000\0014\000\000\0013\001\"\001d\001e\002l\000\000\000\000\001M\000\000\001d\001e\000\000\002m\001\127\001\132\002n\000\000\000\000\000\000\000\000\000\000\000\000\001f\001v\001n\001h\001i\000\200\000\000\001f\001v\000\000\001h\001i\000\000\001*\001d\001e\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0018\000\000\000\000\000\000\001f\001v\000\000\001h\001i\0018\000\000\000\000\001\016\001w\000\000\001x\001\158\000\000\001\023\001$\001w\001\016\001x\001\136\000\000\000\000\000\000\001\023\001$\000\000\000\000\001\129\000\000\001d\001e\000\000\000\000\000\000\000\000\001\130\000\000\001\132\001l\000\000\001\127\000\000\000\000\001w\000\000\001x\001\133\001\127\000\000\001f\001v\001n\001h\001i\000\200\000\000\000\000\000\000\001n\001>\000\000\000\200\000\000\000\000\000\000\000\000\001%\000\000\001>\000\000\001F\000\000\000\000\000\000\001\127\001%\000\000\001d\001e\001F\000\000\000\000\000\000\001d\001e\001n\000\000\000\000\000\200\000\000\000\000\000\000\001w\001.\001x\001z\001H\001f\001v\000\000\001h\001i\001.\001f\001v\001H\001h\001i\000\000\000\000\001\129\000\000\000\000\000\000\000\000\001d\001e\001\129\001\130\000\000\001\132\001l\000\000\001\127\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\001n\001f\001v\000\200\001h\001i\001w\000\000\001x\001}\001\129\000\000\001w\000\000\001x\001\128\000\000\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\001\127\000\000\000\000\000\000\000\000\000\000\001\127\001w\000\000\001x\001\131\001n\000\000\000\000\000\200\001f\001v\001n\001h\001i\000\200\000\000\001\129\000\000\000\000\000\000\000\000\001d\001e\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\001\127\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\001f\001v\001n\001h\001i\000\200\000\000\000\000\000\000\000\000\000\000\001w\000\000\001x\001\141\000\000\000\000\001f\001v\000\000\001h\001i\000\000\001\129\000\000\000\000\000\000\001d\001e\001\129\000\000\001\130\000\000\001\132\001l\000\000\002\221\001\130\000\000\001\132\001l\000\000\001\127\001w\002\224\001x\001\144\001f\002\192\000\000\001h\001i\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\001w\001\129\001x\002N\000\000\000\000\000\000\000\000\000\000\001\130\000\000\001\132\001l\000\000\001\127\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\001\127\000\000\000\000\000\000\000\000\001f\001v\000\000\001h\001i\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\000\000\001d\001e\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\001m\001\132\001l\000\000\000\000\000\000\001d\001e\000\000\001f\001v\001n\001h\001i\000\200\000\000\000\000\000\000\001w\000\000\001x\002\235\000\000\001\129\000\000\000\000\001f\001v\000\000\001h\001i\001\130\000\000\001\132\001l\000\000\000\000\000\000\001d\001e\001\129\000\000\000\000\000\000\000\000\002\193\000\000\000\000\001\130\001\127\001\132\001l\001w\000\000\001x\002\238\000\000\000\000\001f\001v\001n\001h\001i\000\200\000\000\002\020\002\021\001e\000\000\001w\001\129\001x\002\241\000\000\000\000\000\000\000\000\000\000\001\157\000\000\001\132\001l\000\000\001\127\000\000\001d\001e\000\000\002S\001\031\000\000\000\000\001 \000\000\001n\001I\000\000\000\200\000\000\000\000\001\127\001w\000\000\001x\002\249\001f\001v\000\000\001h\001i\000\000\001n\000\000\000\000\000\200\001K\001\"\000\000\000\000\001\129\000\000\004\213\000\000\000\000\000\000\000\000\000\000\001\130\001\031\001\132\001l\001 \001\127\000\000\001I\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\001w\000\000\001x\004H\000\000\001\129\001K\001\"\000\000\000\000\000\000\001*\002\023\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\001\129\002\024\000\000\002k\000\200\000\000\0018\000\000\001\130\001\127\001\132\001l\000\000\000\000\000\000\001d\001e\000\000\001\016\000\000\001n\000\000\000\000\000\200\001\023\001$\000\000\001\031\001*\000\000\001 \000\000\001\129\0012\000\000\001f\002\192\000\000\001h\001i\001\130\000\000\001\132\001l\000\000\0018\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0017\001\"\000\000\000\000\001\016\000\000\000\000\002l\001d\001e\001\023\001$\000\000\000\000\000\000\002m\001>\001\132\002n\000\000\000\000\000\000\000\000\001%\000\000\000\000\001\129\005\011\001f\002\192\000\000\001h\001i\000\000\001\130\000\000\001\132\001l\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\001d\001e\001.\000\000\000\000\001H\000\000\001>\001m\000\000\000\000\000\000\000\000\0018\001%\001d\001e\000\000\001F\001n\001f\002\192\000\200\001h\001i\001\016\000\000\000\000\001d\001e\000\000\001\023\001$\000\000\000\000\001f\002\192\000\000\001h\001i\000\000\001.\000\000\000\000\001H\005\157\000\000\000\000\001f\002\192\000\000\001h\001i\003r\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\003t\000\000\000\000\000\000\001>\000\000\001\129\000\000\000\000\000\000\000\000\001%\000\000\000\000\001\157\001F\001\132\001l\000\000\000\000\000\000\000\000\001m\000\000\000\000\000\000\000\000\003r\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\001m\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\003s\000\000\001n\000\000\001m\000\200\001\129\001d\001e\000\000\000\000\000\000\000\000\000\000\001\157\001n\001\132\001l\000\200\000\000\000\000\003r\000\000\000\000\005\181\000\000\000\000\001f\002\192\000\000\001h\001i\000\000\000\000\000\000\000\000\006\b\000\000\000\000\000\000\003w\000\000\000\000\000\000\001d\001e\001\129\000\000\000\000\002\193\000\000\000\000\000\000\000\000\001\157\000\000\001\132\001l\000\000\000\000\000\000\001\129\000\000\000\000\001f\002\192\000\000\001h\001i\001\157\000\000\001\132\001l\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\157\006\n\001\132\001l\001d\001e\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\000\000\001d\001e\000\000\001m\000\000\000\000\000\000\000\000\001f\002\192\000\000\001h\001i\000\000\001n\001f\002\192\000\200\001h\001i\001f\002\192\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\001e\001m\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\193\000\000\005#\001n\000\000\000\000\000\200\000\000\000\000\000\000\001f\002\192\000\000\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\005$\006\181\005%\001\157\001m\001\132\001l\005\208\000\000\000\000\001\031\001m\000\000\001 \000\000\001n\001m\000\000\000\200\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\001n\000\000\000\000\000\200\005&\001\129\000\000\000\000\000\000\000\000\001\"\000\000\000\000\001\157\000\000\001\132\001l\000\000\000\000\000\000\004\198\000\000\005\208\000\000\000\000\000\000\005\221\001m\000\000\006\b\000\000\000\000\000\000\000\000\006\b\005\154\001\031\005'\001n\001 \000\000\000\200\000\000\000\000\000\000\000\000\005(\001\129\005)\000\000\000\000\000\000\000\000\001*\001\129\001\157\000\000\001\132\001l\001\129\000\000\000\000\001\157\001\"\001\132\001l\000\000\001\157\005\220\001\132\001l\005e\003v\003\237\000\000\001\031\006\t\001\031\001 \000\000\001 \006\017\001\016\000\000\000\000\000\000\000\000\006}\001\023\001$\000\000\000\000\000\000\000\000\005+\000\000\000\000\001\129\000\000\005-\0057\006\021\001\"\000\000\001\"\001\157\001*\001\132\001l\005a\000\000\000\000\004\198\000\000\004\198\000\000\007\020\000\000\000\000\007\021\000\000\000\000\006\024\000\000\000\000\005b\000\000\005\168\000\000\005\178\000\000\006\025\000\000\001>\000\000\001\016\000\000\000\000\000\000\000\000\001%\001\023\001$\000\000\004\203\001*\000\000\001*\001d\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\026\000\000\002\020\002\021\001e\000\000\000\000\001.\001f\002\177\001H\001h\001i\000\000\001\016\000\000\001\016\000\000\000\000\000\000\001\023\001$\001\023\001$\001\031\003T\001>\001 \000\000\000\000\000\000\000\000\000\000\001%\006\027\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006\028\001\031\000\000\000\000\001 \000\000\000\000\000\000\000\000\001\"\001\031\000\000\000\000\001 \000\000\000\000\000\000\000\000\001.\002\214\007\031\003\244\000\000\001>\000\000\001>\000\000\000\000\001\"\000\000\001%\000\000\001%\000\000\004\203\000\000\004\203\001\"\000\000\006\030\001m\000\000\000\000\000\000\000\000\000\000\005#\003\237\006\031\000\000\000\000\001n\001*\006!\000\200\002\023\000\000\001.\000\000\001.\001H\003\240\001H\006#\000\000\000\000\002\024\000\000\002k\000\200\000\000\001*\001\031\000\000\005$\001 \005%\000\000\000\000\006$\001*\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\"\001\016\003V\000\000\000\000\005\203\005&\001\023\001$\000\000\001\016\001\129\000\000\000\000\000\000\001\031\001\023\001$\001 \001\157\000\000\001\132\001l\000\000\000\000\000\000\002l\001\031\000\000\000\000\001 \000\000\000\000\001>\002m\000\000\001\132\002n\000\000\005'\001%\000\000\001\"\001*\002\185\000\000\000\000\000\000\005(\000\000\005)\000\000\001>\000\000\001\"\000\000\000\000\000\000\000\000\001%\000\000\001>\000\000\004\231\000\000\000\000\004\234\001.\001%\006\021\001H\000\000\001\016\005*\000\000\000\000\000\000\000\000\001\023\001$\000\000\001\031\000\000\000\000\001 \001*\001.\007\011\000\000\001H\006\024\001\031\000\000\006\225\001 \001.\005+\001*\003\244\006\025\000\000\005-\0057\000\000\000\000\000\000\000\000\000\000\001\"\000\000\000\000\005a\000\000\000\000\001\016\000\000\000\000\000\000\001\"\000\000\001\023\001$\001\031\001>\000\000\001 \001\016\005b\006\026\000\000\001%\000\000\001\023\001$\004\218\000\000\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\001\"\000\000\001*\000\000\000\000\000\000\001\031\000\000\001.\001 \000\000\001H\001*\006\027\000\000\000\000\001>\000\000\001\"\000\000\000\000\006\028\000\000\001%\000\000\000\000\001<\004\231\001>\000\000\005\249\001\016\000\000\001\"\000\000\001%\000\000\001\023\001$\006\226\000\000\001\016\007\012\001*\000\000\000\000\000\000\001\023\001$\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\000\000\006\030\001*\001.\000\000\000\000\001H\000\000\001\031\000\000\006\031\001 \000\000\001\016\000\000\006!\000\000\001*\001\031\001\023\001$\001 \000\000\001>\000\000\006#\000\000\000\000\000\000\000\000\001%\001\016\000\000\001>\006\186\001\"\001\031\001\023\001$\001 \001%\006$\000\000\000\000\001X\001\"\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\002\020\002\021\001e\001.\000\000\000\000\001H\000\000\000\000\001\"\001>\000\000\000\000\001.\000\000\000\000\001H\001%\002\020\002\021\001e\001\174\000\000\002U\001*\002\020\002\021\001e\001>\000\000\000\000\000\000\000\000\000\000\001*\001%\000\000\000\000\000\000\000\000\000\000\002_\000\000\001>\001.\000\000\000\000\001H\002j\000\000\001%\000\000\001*\001\016\001\212\002\020\002\021\001e\000\000\001\023\001$\000\000\001.\001\016\000\000\001D\000\000\000\000\000\000\001\023\001$\000\000\001\031\000\000\000\000\001 \000\000\001.\002y\000\000\001H\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\001\031\000\000\000\000\001 \000\000\002\023\000\000\000\000\000\000\001\"\000\000\000\000\000\000\000\000\001>\000\000\002\024\000\000\002k\000\200\000\000\001%\000\000\002\023\001>\001\214\000\000\001\"\000\000\000\000\002\023\001%\000\000\000\000\002\024\002+\002k\000\200\000\000\000\000\000\000\002\024\001>\002k\000\200\000\000\000\000\000\000\001.\001%\000\000\001H\001*\002>\000\000\000\000\000\000\000\000\001.\000\000\002\023\001H\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\001*\002\024\000\000\002k\000\200\002l\001.\000\000\000\000\001H\000\000\001\016\000\000\002m\000\000\001\132\002n\001\023\001$\000\000\000\000\000\000\001\"\002l\000\000\000\000\000\000\000\000\000\000\001\016\002l\002m\000\000\001\132\002n\001\023\001$\000\000\002m\000\000\001\132\002n\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\002l\000\000\001>\001\031\000\000\001*\001 \000\000\002m\001%\001\132\002n\001\"\002\182\000\000\000\000\000\000\000\000\000\000\000\000\001>\001\"\000\000\002\020\002\021\001e\000\000\001%\000\000\000\000\001\"\002\187\000\000\000\000\001\016\000\000\001.\000\000\000\000\001H\001\023\001$\000\000\000\000\001\031\000\000\003\027\001 \000\000\000\000\000\000\000\000\000\000\001\031\001.\001*\001 \001H\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\001\"\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\001\"\000\000\000\000\000\000\001\016\001>\001\031\000\000\000\000\001 \001\023\001$\001%\001\016\000\000\000\000\002\204\000\000\000\000\001\023\001$\001\031\001\016\001\031\001 \000\000\001 \000\000\001\023\001$\000\000\000\000\000\000\001\"\001*\000\000\000\000\000\000\002\023\001.\000\000\000\000\001H\001*\000\000\000\000\000\000\000\000\001\"\002\024\001\"\002k\000\200\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\001\016\001>\000\000\002\211\000\000\000\000\001\023\001$\001%\001\016\001>\000\000\002\218\001*\000\000\001\023\001$\001%\000\000\001\031\000\000\002\227\001 \000\000\000\000\000\000\001.\000\000\001*\001H\001*\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\001\016\000\000\001.\002l\001\"\001H\001\023\001$\000\000\001>\000\000\002m\000\000\001\132\002n\001\016\001%\001\016\001>\000\000\004W\001\023\001$\001\023\001$\001%\000\000\001\031\000\000\004\175\005\012\000\000\000\000\000\000\000\000\000\000\001\031\000\000\001\031\005\012\000\000\001 \000\000\001.\000\000\000\000\001H\001*\000\000\000\000\000\000\001>\001.\001\031\001\"\001H\001 \000\000\001%\000\000\000\000\000\000\004\187\001\"\000\000\001\"\001>\000\000\001>\001\031\000\000\000\000\001 \001%\000\000\001%\001\016\004\200\000\000\004\217\001\"\000\000\001\023\001$\001\031\001.\001\031\001 \001H\005\012\000\000\000\000\000\000\000\000\000\000\000\000\001\"\005\014\000\000\000\000\001.\000\000\001.\001H\000\000\001H\005\014\000\000\001*\000\000\000\000\001\"\000\000\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\001\016\001>\000\000\000\000\000\000\000\000\001\023\005\017\001%\001\016\000\000\001\016\004\233\001*\000\000\001\023\005\017\001\023\001$\001\031\000\000\000\000\005\012\000\000\000\000\000\000\001\016\000\000\001*\000\000\005\014\000\000\001\023\001$\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\001\016\000\000\000\000\000\000\001\"\000\000\001\023\001$\000\000\001\031\000\000\000\000\001 \000\000\000\000\001\016\005\018\001\016\000\000\000\000\001>\001\023\001$\001\023\005\017\005\018\001\031\001%\004\220\001 \005\019\005\133\005\020\000\000\000\000\001>\001\"\004\220\000\000\005\031\000\000\005\020\001%\001.\000\000\000\000\005\151\005\014\000\000\000\000\000\000\001>\001.\001\"\001.\000\000\000\000\001H\001%\000\000\000\000\000\000\005\175\000\000\000\000\000\000\001>\000\000\001\031\001.\000\000\001 \001H\001%\000\000\005\018\001\016\006=\000\000\001*\000\000\000\000\001\023\005\017\000\000\001.\000\000\004\220\001H\005\235\000\000\005\020\000\000\000\000\000\000\001\"\001*\000\000\000\000\000\000\001.\001\031\001.\001H\001 \000\000\000\000\000\000\001\016\001\031\000\000\000\000\001 \000\000\001\023\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\001\"\000\000\000\000\001\023\001$\000\000\005\018\000\000\001\"\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\220\000\000\006\005\000\000\005\020\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\000\000\001.\000\000\000\000\000\000\000\000\001%\001\016\000\000\000\000\006\146\001*\000\000\001\023\001$\000\000\001>\000\000\000\000\001*\000\000\000\000\000\000\001%\000\000\000\000\000\000\006\150\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\001\016\000\000\001.\000\000\000\000\001H\001\023\001$\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\001.\000\000\000\000\001\207\000\000\000\000\001%\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001\209\000\000\000\000\000\000\000\000\001.\000\000\000\000\003\239")) + ((16, "\000%\001k\000O\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\000\000\000\000\000\245\000\208\000&\001K\000\241\000!\000\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\195\000\000\000\000\000\000\000\000\000\000\000\187\000\000\000\000\000\000\000\155\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000=\192\000\000\000\000\000\000\000\139\000\000\000\000\000\000\000\000\000\000\000\000\000\000;(\0001\000&\000\217\000\000\000\234\002\132\000 \000\250\000\025\000\000\000\000\000\000\000|\000\000\000\000\002\132\000\000\000\000\000\000\000\000\001\234\000\000\000\238\000\000\000\000\000\000\000\000\000\000\000H\000\000\002\234\002$\b\"\000\000\000\000\n\226;(\000\000\000\000\000)\000\000\002P\000\000\031V\001\014\000\000\000\250\001~\000\000\000\000\000\254\001B\002\188\003\158\004\200\002$\002\000\000\139\002\188\001\200\001L\002p\011\160\000\000>(\001\222\003\234\000\161\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\132\000\000\t\022>(\011\208\000\000\000\000\002 \004\252\002\0141\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000#h\000\000\002F\005\012\002\210\000\000\000\000\000\000\000\000\0068\000\000\000\000\005\016\000#\005@\006d\b\006\000\000\002\144\003\000\005\146\001\128\002\224\005\226\001H\000\000\000\000\003$\006f\012\006\000\000\002\234\012\144#\242$&\000\000\000u\000\000\000\000\000\000\000\000\003\226>$\004J\000\000\007\020\004f\000\000!>7\016\000\129\000\000\000\213\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0001R\004\014\000\000\000\000\000\000\011\028\000\000\000\234\000\000\000\000\004\218\002(\000\000\000\000\007\158\000\000\015\224\000\000\004\218\000\254\004\218\000\000\000\000\000\000\000\000\000\0007$\000\000\006\188\0050\000\000\0216\007.\027V\000\000\000\000\000\000\004\218\000\000\000\000\000\000\000\000\004\158\000\000\000\000\000\000\000\000\000\0001\206\000\000\000\000\000\000\000\000\000\000\000\000\000@\005v\000\000\000\000\000\000\004\158\005\1542*\005\028\0074;\138\000\000\005T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\000\000\000\000\000\000\000\000\006\1362<\000\000\000\000\005\142\007\2302J\000\000\000\000\000\0003\000\005~32\000\000\005~\000\0003<\005~\000\0003\162#h\006j\006\178\000\000\000\000;\196\000\000\000\000\000\000\000\000\000\000\000\000\005~\000\000\000\0003\234\000\000\005~>\\\000\000\004\158\000\000\000\0004\160\000\000\005~\000>\000\000\000\000\005~\005~\000\000\000\000\005~\000\000\000\000$&\000\000\000\000\000\000\000\000\005~$\176\000\000\000\000\005~\000\000\001P\006\244\000\000\000\000\000\000\000\000\000\000\000\000\000\0007v\000\000\006\136\000\000>\134\004\158\000\000\000\000\000\000\000\000\006\200\007^\012\132\006\190\006\218\006\222\b\218\004\246\b\230\000\015\007\186\000\000\000\000\t \tl\tZ\000&\007R\n\198\000\000\004\200\004\174\003\254\000\222\b\198\000\000\000\000.\204\000\000DL\b\142\000\000>\192\004\158>\216\004\158\000\000\000\188\003>\000\000\012f\004\200\000\000\000\000\007\198\000\000\000\000\000\000\000\000\000\000\014\246\004\200\016^\004\200\000\000\002\230\000\000\000\000\003\148\000\000\000\000\000\000\t\024\000\000\000\000\000\000\004\200\000\000\000\000\004\200\000\000\007R\0060\000\000\000>\002\224\000\000\000>\000\000\000\000\0174\004\200\000\000\000\000\000\000\000\000\000\000\000\000\000>\012\206\rx\t\022\b\206\004\1404\170\000\000\b>\n\000\r\194\bz\n\002?\024?N\000\000\000\000\000\000\000\000\000\000\004\014\t\192\000\000\000\000\000\000\b\166\nD\006\198\000>\017\198\000\000\004\200\000\000\000\000\000\000\012\144\000\000?\170\004\158\r\204\b\190\np\014\022\b\228\nv\014<$l\005~\0154\t:\n\200:\024\n:\000\000$\144\005~?\180\004\158\n>\000\000\000\000\000\000\000\000#h\n&\000\0007\172\015<\t\186\n\2024\224\005~\015~\t\208\n\212?V\000\000?~\000\000\000\000\015\164\006.\007F\000\000\000\000\000\000\000\000@>\000\000\000\000\000\000\000\252\015\254\000\000\000\000\000\000\000\000%\n@\146\000\000\000\000\000\000\000\000\000\000\t\166\016n\000\000\t\208%`\t\208%\180\t\208\000\000@\208\000\000%\190\t\208\017\012\004T\017h\000\000\000\000&\"\t\208&~\t\208&\162\t\208'D\t\208'd\t\208'\150\t\208(0\t\208(b\t\208(\130\t\208(\252\t\208),\t\208)N\t\208)\248\t\208*\026\t\208*:\t\208*\220\t\208*\228\t\208+&\t\208+\200\t\208+\208\t\208\n\218\017t5j#h\n\176\000\000,\148;\246\000\000\018\006\000\000@\012\000\000\004\158\000\0007\246\002\160\004\218\026^\000\0008\000\000\000\000\000\000\0008D\000\000\000\000\026\244\000\000\027P\000\000\000\000\000\000\000\0000.\000\000\000\000\000\000/\170\t\2080n\t\208\000\000\n\026\027Z\000\000\000\000\027\180\000\0000\158\000\000\000\000?N\000\000\000\000\000\000\028\026\000\000\000\000\000\000\000\000\028J\000\000\000\000\000\000\000\000\011\204\000\000\000\000\000\0006\178\000\000\001\216\000\000\004F\000\000\011\150\000\000\002(\000\000\000\000\000\000\000\000\000\000\000\000\004\014\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t\208\000\000\012\006\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\n\224\006\250\000>\028\196\000\000\011\024\n\228\011\194\004\180\007\182\000>\017\208\004\200\007\214\000>\000\000\029\026\000\000\006~\000\000\011\142\n\240\006\184\000\000\000\000\000\000\000\000\000\000\011\188\000\025\001\178\000\000\000\000\000\000<\154\000\000D\174\000\000\011$\000\000\011(\000\000\000\000\000\000\000\000\006\014\000\000\000\000\000\000\004\150\004\218\000\000\004\218\000\016\000\000\006j\004\218\004\218\011J\000\000\029\132\000\000\000\000\011T\012\142\000\000\029\180\b,\000\000\000\000\000\000\000\000\000\000\000\000\t\208\000\000\030\028\000\000\t\208\000\000\000\000\018L\000\000\004\200\000\000\018~\000\000\004\200\000\000\019>\004\200\000\000\001\b\000\000\011V\bp\001\244\000\000\011\208\011\216\011p\012\n\012\164\019\214\004\200\b\158\000\000\011\128\012\132\012\148\007\012\b\178\012l\011\152\012\176\007r\b\202\012\128\000\000\000\000\007\146\b\248\000\000\004\252\003 6\224\005~\030\128\000\000\006\000\003j\012:\011\154\t\n\003\184\000\000\012D\011\182\b\152\000\000A\206\004\158\012\244\012\248\000\000\t$\000\000\012h\011\196\bn\012\198\006\248\000\000\000\000\000\000\000\000\011\214\tn\000\000\011\244\t\146\000\000\bH3>\012\206\012\236\012\b\004\248\t\178\000\000\012\"\005\238\t\206\000\000\012\242\r\b\0126\r2\012\164\022\144\004\200\000\000\012>\r\164\000\000\b\006\000\000\nX\000\000\r\186\000\000\022\192\005\026\r\142\012J\r\200\000\000\0248\005Z\r\156\000\000\000\000\004\\\003^\n\138\000\000\024d\004\200\n\156\000\000\005\208\000\000\rZ\012~\024\140\005\168\000\000\r\\\012\142\b\194\012\198\r^\rh\012\170\014\196\000\000\r\160\003N\000\000\000\000\000\000\000\000\007\136\012\174\rxA\226\004\158\000\000\000i\012\186\014<\000\000\000\000\000\000\000\000\000\000\000\000A\242\006\026\000\000\012\198\014\144\000\000\000\000\000\000\000\000\000\000\000\000\022\b\000\000B2\004\158\n\160\000\000\004\158\012\214\b\196\000\000\012\246\012\254\t\248\000\000\n\150\026~\000\000\006\n\000\000B\166\004\158\004\158\000\000\000\000\006@\000\000\n \000\000\n\208\006@\006@\000\000\r$\":\004\158B\204\004\158\011x\000\000\000\000\000\000\000\000\011\154\000\000\000\000\0072\000\000\b\190\014\004\r6\015\028\r\214\000\000\000\000\011\166\t\002\014<\000\000\000\000\rH\015Z\014\024\000\000\000\000\012\158\000\000\b\188\000\000\015\2065|\004\158\000\000*\246\n\000\000\0002\226\000\000\000\000\000\000\006@\000\000\000\000\011\156\014~\r^\015\150\014h\000\000\000\0004l\011\180\014\216\000\000\000\000\000\0009\194\000\000\000\000\000\000\000\000\000\000\000\000\000\000\011\222\000\000\014\244\r`\005\014\000\000\015\230\015\162\011\238\015\012\000\000\000\000\015 \rn\005\236\000\000\000\000\tp7\016\006\182\000\000\000\000\000\000\tb\014\238\rv\000\000\015\004\tb\000\000\015\222\012*\015N\000\000\000\000\000\000\004\158\000O\000\208\t\020\000\000\000\000\000\000\000\000\015\018\rx\000\000\tl\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\158\015\000\r\128\016\\\015\022\000\0008\180\000\165\r\130\014\234\003\214\0000\r\138\015\162\000\000\016R\030\178\000\000\000\000\031\026\000\000\012T\000\000\004\246\000\000\000\000\000\000\000\000\000\000\000\000B\230\004\158\000\000\016X\031J\000\000\000\000\031\178\000\000\000\248\r\194\016\004\000\000\000\0009\002:\234\015\186\000\000B\246\004\158 \026\000\000\000\000 L\000\000\000\000\012t\000\000\002\162\000\000\000\000\000\000\000\000\000\000\000\000:\252\000\000\000\0009j;\006\015\188\000\000C\n\004\158 \176\000\000\000\000 \228\000\000\000\000\r\204!\024\012\146\000\000\r\208\r\230\003\136\003\210\r\242\b\154\014\006\016\024!\218\012\250\000\000\0140\014D\n*\000\000\005*<\196\000\000\007\234\000\000\014T9N9\182\005t\015\000\005\224\000\000;Z<\146\000\000\002\154\000\000\000\000\002\154\000\000\000\000\002\154\nZ\000\000\011\002\002\154\0166\"^\r(\000\000\002\154\000\000\000\000C\030\000\000\000\000\000\000\002\154\000\000\000\000\r\180\000\000\012\254\005\184\r\212\000\000\014j<\192\r\232\000\000\000\000\000\000\000\000\014\018\000\000\000\000\006*\000\000\002\154C\178\000\000\014\184\002\1549\194\000\000\014&\015\152\014n\016\178\015h\000\000:\006\014>\015\164\000\000\000\000\000\000\014\148\006\190\000\000\000\000\000\000\000\000\000\000\000\000\t\166\014\212\000\000\015\190\000\000\000\000\000\000\000\000\014\236=D\000\000\000\000\000\000\000\000\t\166\000\000\000\000\015\030=j\000\000\000\000\000\000\000\000\000\000\000>\004\200\000\000\000\000\005~\000\000C\200\004\158\000\000\007\214\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015r\014\176\t\220\000>\000\000\024\240\000\000\004\200\000\000\016\186\000\000\000\000\000\000\000\000\000\000\"\130\000\000\000\000\000\000\000\000\000\000\000\000\016b\004\020\n4\014\238\007v\014\178\000\000\003\246\000\000\000\000\000\000\000\000\000\000\000\000\000\000\015\018\t\170\014\180\000\000\b\014\016\196\016|\015$\000\000\000\000\016t\004Z\004\\\000\000\000\000\000\000\014\186\000\000\014\200\002z\000\000\000\000\004\218\003\014\000\000\000\000\000\000\000\000\000\000\019\174\000\000\000\000\bd\bR\000\000\000\000D\000\004\158\004\158\000\000D\024\004\158\t\242\000\000\000\000\000\000\004\158\000\000\000\000\n\004\016\132\015d\000\000\000\000\016x\004\"\000R\000\000\000\000\000\000\000\000\011H\016\196\n\b\016\136\015l\000\000\000\000\016|\bR\003\b\000\000\000\000\000\000\000\000\004\200\000\000\n\178\000\000\000\000\000\000\"\252\000\000#,\000\000\000\000\000\000\000\000\000\000\000\226\000\000\000\000\000\000\007\016\000\151\000\000\000\000\000\000\000\000\000\000\000\020\000\151\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\t&\000\000\000\000\000\000=\164\000\000\004\158\000\000\n^\000\000\000\000\000\000\002\016\000\000\000\000\000\000\003T\000\000\000\000\000\000\000C\000\000\000\000\000\0000\184\005~\000\000\000\000\000|\000\000\000\000\000\000\000\000\004\014\004\194\015\188\004\150\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000'6\000\000\015\148\000\000\000\000\000\000\000\000\005\012\006\174\000\170\002L\000\000\000\000\015\174\003\238\000\000\000\000\000\000\015\206\005\144\000\000\000\000\000\000\000\000"), (16, "\006(\0007\002,\002-\001e\000q\001e\000;\001\031\003\007\001\216\006\156\000\147\006\203\006\189\001\233\001\031\002n\006)\006\214\001\240\006+\001\019\000?\001\244\002o\001\023\006\209\001\023\000@\006,\0069\006\232\005Y\000m\001\"\001\031\006(\002}\002,\002-\001e\0007\005\142\001k\000\196\004\005\000\196\000\200\000\201\000\200\000\201\001\159\001e\002n\006)\0068\007\004\006+\006-\000\147\002\012\002o\000\156\001\016\001\245\004\005\006,\0069\000\196\001\023\001\026\000\200\001\002\000\\\002}\005\229\006o\000`\001\246\002\014\001\003\007\012\002-\001e\007\005\000\147\001\214\000\157\001\233\000\203\004\254\000\203\006.\000d\001\240\006-\002\127\001T\001\244\006\207\001\023\006/\006(\000y\005\231\001\006\006I\001\016\0020\002\027\002\129\000\200\000\200\001\023\001$\001\016\005\001\007'\003\007\005\232\007(\001\023\001$\006+\005\234\006>\000\202\002\025\006\022\006.\0055\005\003\006,\002\127\001\027\001\016\005`\005a\006/\001\245\006?\001\023\001$\0007\001\031\0020\001W\002\129\000\200\007\014\0062\005\004\005q\006\216\001\031\0064\005j\004\019\0056\006\218\0057\006-\006>\000\128\0007\0066\001%\000\129\002\130\002\028\002\136\002\006\005\144\000:\001%\005Y\002\142\006?\001\139\002\132\004\b\0067\006\233\002,\002-\001e\006\185\0062\007\015\0058\002\129\000\200\0064\001.\001%\006.\001l\002\006\002n\002\144\004\011\004\t\0066\000\134\006/\002\130\002o\002\136\006(\003\007\002,\002-\001e\002\142\0009\001\139\002\132\006\186\0067\002}\001\251\004\014\0059\000\200\007*\002n\006)\0068\002\025\006+\000\203\005:\005;\002o\005<\000\203\002\144\000\196\006,\0069\000\200\001\002\002\026\0061\001\016\006(\002}\002,\002-\001e\001\023\001$\003\020\0062\001\016\000\200\001\002\005x\0064\005\177\001\023\001$\002n\006)\0068\000\132\006+\006-\0066\000\151\002o\006\142\005\179\000\135\001\221\006,\0069\0042\002\127\005`\005a\005>\006\220\002}\0067\003\178\005@\005J\002\014\003%\0020\000\150\002\129\000\200\000\196\005i\005t\000\200\001\002\005j\004\019\006.\000\183\001%\006-\002\127\001\182\000\172\006m\000\179\006/\006(\005u\001%\000\178\0041\000=\0020\002\027\002\129\000\200\000\200\002\133\001\031\000\184\003\184\007'\003\007\000\203\007(\001&\001\006\006+\003\245\006>\000\203\000\203\000\174\006.\0055\0010\006,\002\127\002\026\001\031\000\147\002\025\006/\000\152\006?\002\130\005\184\004#\000\188\0020\006\252\002\129\000\200\002\142\0062\001\139\002\132\000\196\001\031\0064\000\200\001\002\0056\006\200\0057\006-\006>\000\203\000\147\0066\006\132\001\233\002\130\002\028\002\136\000\153\002\144\004\000\004\002\004\004\002\142\006?\001\139\002\132\0007\0067\006\253\002,\002-\001e\0046\0062\001\023\0058\003\179\006\181\0064\000\196\001\016\006.\000\200\001\002\002n\002\144\001\023\001\026\0066\005\188\006/\002\130\002o\002\136\006(\001\031\002,\002-\001e\002\142\001\016\001\139\002\132\000\193\0067\002}\001\023\001$\0059\006\154\007)\002n\006)\0068\006\004\006+\003\179\005:\005;\002o\005<\001\016\002\144\000\147\006,\0069\000\152\001\023\001$\0061\006\149\006(\002}\002,\002-\001e\000\211\000\189\002\026\0062\001\016\002\014\003\007\005x\0064\006R\001\023\001$\002n\006)\0068\001(\006+\006-\0066\000\224\002o\006@\004\185\001%\000\228\006,\0069\000\147\002\127\000\181\001\233\005>\002\018\002}\0067\002\027\005@\005J\000\200\001\253\0020\001\016\002\129\000\200\001%\001\023\005t\001\023\001$\003K\006\150\006.\000\200\001\002\006-\002\127\0043\007\000\006<\001\016\006/\006(\005u\001%\000\203\001\023\001$\0020\006\152\002\129\000\200\006\150\002\133\001\236\006\199\000\147\007'\001\220\001\233\007(\003\192\001e\006+\001\240\006>\005\236\003\\\001\244\006.\001\023\003z\006,\002\127\007\001\003\007\002\028\000\200\006/\004\161\006?\002\130\000\200\004\031\000\186\0020\006\186\002\129\000\200\002\142\0062\001\139\002\132\000\241\002\025\0064\002\255\001e\003\180\001%\000\196\006-\006>\000\200\000\201\0066\003\007\002\000\002\130\001\245\002\136\000\249\002\144\001\023\006x\0007\002\142\006?\001\139\002\132\006\184\0067\001Y\002,\002-\001e\006\150\0062\007\024\002-\001e\005\229\0064\003\007\002\001\006.\001\031\000\196\002n\002\144\000\200\000\201\0066\004\\\006/\002\130\002o\002\136\006(\006\140\002,\002-\001e\002\142\006\014\001\139\002\132\003\007\0067\002}\005\231\006p\007\027\007\028\007-\002n\007\030\003\181\005\229\006+\001)\000\194\005\149\002o\006y\005\232\002\144\001\n\006,\007 \005\234\006\017\002\002\0061\006\001\006(\002}\002,\002-\001e\007/\001\r\000\147\0062\005C\001\233\006\019\005\231\0064\0007\007'\003\t\002n\007(\004\165\006z\006+\006-\0066\002\026\002o\003\007\005\232\001\030\006{\006,\0070\005\234\002\127\006|\006}\005\250\006\020\002}\0067\006\141\006\187\006\188\006~\006\127\0020\001`\002\129\000\200\000\203\007\025\001\016\002\129\000\200\006\128\004\019\006.\001\023\001$\006-\002\127\005j\004\019\000\204\003\228\006/\006(\003\007\002\014\006|\006}\006z\0020\004\167\002\129\000\200\001\016\002\133\006~\006\127\006{\007'\001\023\001$\007(\001\016\007#\006+\005\153\006\128\004\019\001\023\001$\006.\004\138\002\029\006,\002\127\002\027\003\007\004}\000\200\006/\002\148\006?\002\130\001\023\003\201\001;\0020\001%\002\129\000\200\002\142\0062\001\139\002\132\003\231\000\147\0064\005M\001\233\0074\000\212\000\196\006-\000\203\000\200\000\201\0066\001B\000\225\002\130\000\234\002\136\004\150\002\144\004\007\003\007\001G\002\142\006?\001\139\002\132\0007\0067\001\016\002,\002-\001e\001V\0062\001\023\001$\001\177\005\229\0064\000\236\002\028\006.\001\239\000\196\002n\002\144\000\200\000\201\0066\004\156\006/\002\130\002o\002\136\006(\006\b\002,\002-\001e\002\142\001\\\001\139\002\132\003\007\0067\002}\005\231\001\031\000\203\004Q\0072\002n\006)\006F\005\229\006+\000\203\003\007\000\203\002o\000\242\005\232\002\144\001\239\006,\0069\005\234\004\168\004\173\0061\005\241\006(\002}\002,\002-\001e\003\007\000\196\001\175\0062\000\200\000\201\000\203\005\231\0064\004\129\007'\002\014\002n\007(\003\245\001\023\006+\006-\0066\001\239\002o\001t\005\232\001\016\000\245\006,\007+\005\234\002\127\001\023\001\026\005\238\005\229\002}\0067\003\b\001\216\001~\002\015\006J\0020\002\027\002\129\000\200\000\200\004\167\001\240\000\203\006\225\004\206\001\244\006.\001\023\006\021\006-\002\127\001\031\001\135\001\239\001 \006/\005\231\0012\004\003\004\002\004\004\005\236\0020\004\246\002\129\000\200\001\016\002\133\002,\002-\001e\005\232\001\023\001$\003\232\006\017\005\234\0013\001\"\006>\005\235\002\014\000\203\006.\001Q\000\250\001\245\002\127\001\134\004\233\006\019\003_\006/\003\245\006?\002\130\002\028\003c\004W\0020\001\246\002\129\000\200\002\142\0062\001\139\002\132\002\014\0029\0064\001G\002\027\007.\001\181\000\200\003`\006\020\006\226\001\193\0066\001\031\001*\002\130\001+\002\136\001%\002\144\003\231\001E\004\240\002\142\006?\001\139\002\132\003\215\0067\004n\002\027\0018\000\200\000\200\0062\005R\004\002\004\004\004D\0064\001\"\000\203\006\227\001\198\001\016\004\r\002\144\006\234\001\023\0066\001\023\001$\002\130\004\027\002\136\006(\002/\002,\002-\001e\002\142\004\020\001\139\002\132\002\028\0067\003\241\004\019\0020\006\137\002\129\000\200\002n\006)\005\005\003\213\006+\001\203\001C\001\031\002o\001]\001 \002\144\000\203\006,\006B\006\235\0055\004I\002\028\003\231\004n\002}\002\014\000\200\001>\004q\001\031\001\139\005\001\001 \001\016\001%\003b\004N\001\"\001F\001\023\001\026\002\014\006\236\006\163\001\016\006-\005\003\0056\005w\0057\001\023\001$\003\223\001\209\005Y\002\027\001\"\002\005\000\200\002\130\006\237\001.\004`\001e\001H\003\007\005\004\002\131\003\227\001\139\002\132\002\027\000\203\003\231\000\200\000\203\006\198\001\226\0058\006.\001*\000\196\0007\002\127\000\200\000\201\006S\001\031\006/\003\231\005\026\006v\004\237\001\139\006\176\0020\004\144\002\129\000\200\001*\001\016\001u\001\023\001%\004\238\001\228\001\023\001$\005\006\001\243\001\016\0059\006E\006\017\001\"\002\028\001\023\001$\002\014\002\004\005:\005;\003\007\005<\002,\002-\001e\006?\006\019\001\016\001.\002\028\003\007\004\025\001\016\001\023\001$\0062\003\007\002n\001\023\001\026\0064\001\016\003\007\0045\005x\002o\002\027\001\023\001$\000\200\0066\006d\006\020\002\130\003\206\002\136\005`\005a\002}\005\224\001>\002\142\000\203\001\139\002\132\003\007\0067\001%\005>\003\202\003\007\005b\005r\005@\005J\001\031\005j\004\019\001 \001>\006\187\006\188\002&\005t\002\144\001\016\001%\003\007\004?\001\016\005y\001\023\001$\002\014\001.\001\023\001\026\001H\004E\005u\005j\004\019\001\"\006\162\005\007\006\240\002\028\002,\002-\001e\004J\000m\002)\001.\004k\004\019\001H\002\127\003\245\005Y\004[\001\204\002n\002\027\003\007\001\216\000\200\001\206\002\n\0020\002o\002\129\000\200\004O\0027\001\240\003\158\004n\005\015\001\244\000\200\001\023\003\007\002}\001%\001*\002F\001\031\004\237\001\031\005!\001\031\001 \005\211\001 \004g\004\177\004\019\003\007\005\\\004\238\002\133\003\245\001\216\004\245\002I\002\007\005f\004\002\004\004\004\240\001.\003\007\001\240\001\"\001\016\001\"\001\244\001\"\001\023\001\245\001\023\001$\002\028\000\203\001\213\002,\002-\001e\002\130\000\203\002\136\004s\005Y\001\246\005Y\000m\002\142\002\014\001\139\002\132\002n\002\127\004n\004\240\006\241\000\200\001\139\002O\002o\004v\005n\004\002\004\004\0020\006\248\002\129\000\200\001\245\001*\002\144\001*\002}\005`\005a\006^\004~\001>\002\027\003\245\002[\000\200\001\246\006\178\001%\006\192\005V\004\019\005b\005r\004\130\003\007\004\228\005j\004\019\000\200\002\133\001\016\000\203\001\016\002X\001\016\002^\001\023\001$\001\023\001$\001\023\001$\006\250\001\031\001.\004\242\001 \001H\000\200\003\007\005\219\002'\002*\000\200\006\130\002b\001\139\002\130\003\007\002\136\003\007\006\171\004\002\004\004\002\127\002\142\002g\001\139\002\132\003\007\001\"\002\028\001\031\003\n\005\243\001 \0020\000\200\002\129\000\200\005`\005a\005`\005a\001>\0028\001>\005Y\002\144\001%\002\141\001%\004\145\001%\006\195\005b\005r\005b\005r\001\"\005j\004\019\005j\004\019\002\196\001\016\002\220\002G\002\133\002\227\002J\001\023\001\026\001*\000\203\000\203\001.\004\162\001.\001\216\001.\001H\001\217\001H\006t\004\019\004\166\003\000\004\220\001\240\002,\002-\001e\001\244\001\016\001\023\002\130\006\206\002\136\003o\001\023\001\026\001*\001\016\002\142\002n\001\139\002\132\000\203\001\023\001$\002P\002c\002o\002,\002-\001e\002h\000\196\006i\002\192\000\200\000\201\003\214\004\237\003\220\002}\002\144\003\007\002n\000\203\003\235\001\016\000\203\001\245\003w\004\238\002o\001\023\001$\004\239\002,\002-\001e\003\172\003\007\003\007\006W\001\246\005\229\002}\005`\005a\004\237\001\016\001>\002n\003\252\003\007\003\254\001\023\001$\001%\001G\002o\004\238\006\174\006\175\003\182\004\244\004 \005j\004\019\003\204\000\203\000\203\004\016\002}\005\231\003\007\000\203\004\021\0044\000\203\0011\002\127\000\203\003\007\000\203\001.\003\219\001%\001H\005\232\000\203\004:\004\253\0020\005\234\002\129\000\200\001\016\005\245\004A\002,\002-\001e\001\023\001\026\002\127\003\221\001\187\001e\005\002\005*\004G\004Z\003\007\001.\002n\000\203\0020\000\203\002\129\000\200\001\031\0052\002o\005\030\002\133\004_\001f\002A\004\026\001h\001i\002\127\004j\003\007\000\203\002}\002,\002-\001e\000\203\000\203\004r\005?\0020\003\234\002\129\000\200\001\"\002\133\003\007\005G\002n\002\130\000\203\002\136\004\237\004u\004\015\004\023\002o\002\142\000\203\001\139\002\132\003\007\003\212\004|\004\238\003\148\003\001\003\002\005\014\002}\000\203\000\203\002\133\002\130\004@\003\026\004\128\005^\0049\001\216\002\144\002\142\001\238\001\139\002\132\000\203\004\134\005 \004;\001\240\004\140\002\127\000\203\001\244\004>\001\023\004\152\001\127\005\143\004M\002\130\000\203\002\136\0020\002\144\002\129\000\200\004C\002\142\001n\001\139\002\132\000\200\003\007\005\178\004L\000\203\001\016\002,\002-\001e\004H\004\171\001\023\005#\004K\000\203\004Y\002\127\005\204\004\176\002\144\004^\002n\001\245\002\133\003\007\003\151\003\156\000\203\0020\002o\002\129\000\200\004\181\004f\004\191\004e\001\246\000\203\004i\003\209\004\197\000\203\002}\002,\002-\001e\004\208\000\203\002,\002-\001e\002\130\000\196\002\136\004\223\000\200\000\201\001\129\002n\002\142\002\133\001\139\002\132\002n\005$\001\130\002o\001\139\001l\005\215\004\241\002o\003\195\000\203\004\227\004t\004\238\003\147\005)\002}\005&\000\203\002\144\005\229\002}\002,\002-\001e\002\130\004\127\002\136\001.\005\249\004\248\003\007\000\203\002\142\000\203\001\139\002\132\002n\002\127\005\t\000\203\004{\001d\001e\004\139\002o\000\203\003\007\005\019\005\231\0020\003\142\002\129\000\200\000\203\004\133\002\144\003\007\002}\005,\005B\004\135\001f\001v\005\232\001h\001i\005L\004\159\005\234\000\203\005X\005l\006\007\000\203\002\127\005|\005\130\003\007\004\147\002\127\005\134\002\133\006(\004\158\003\138\004\153\0020\003\007\002\129\000\200\004\157\0020\000\203\002\129\000\200\004\170\004\175\005\018\006\005\003\007\006)\000\203\004\180\006+\001w\004\183\001x\002L\005\162\002\130\000\203\003\026\006,\005\202\006\t\006\006\002\127\002\142\002\133\001\139\002\132\000\203\000\203\002\133\006\r\004\187\005\207\004\195\0020\000\203\002\129\000\200\005\246\000\203\000\203\001\127\004\202\004\213\000\203\000\203\002\144\006-\005\212\000\203\005\017\006\018\002\130\001n\002\136\005\n\000\200\002\130\005\011\002\136\002\142\006\030\001\139\002\132\003\141\002\142\002\133\001\139\002\132\005\242\002,\002-\001e\006%\002,\002-\001e\000\203\005\016\005\218\003\007\006.\000\203\002\144\000\203\002n\005\020\005\226\002\144\002n\006/\005\021\003\007\002o\002\130\000\203\002\136\002o\006\011\003\131\006 \000\203\002\142\003t\001\139\002\132\002}\002,\002-\001e\002}\000\203\0054\001\129\0060\000\196\005-\003\007\000\200\000\201\003\007\001\130\002n\001\139\001l\002\144\002,\002-\001e\0061\002o\005.\000\203\006]\006w\006\131\003l\001\216\006\145\0062\001\248\002n\000\203\002}\0064\006\147\005\229\001\240\0063\002o\000\203\001\244\003\007\001\023\0066\001\031\003\007\0053\005\030\003d\006:\000\203\002}\000\203\001\031\002\127\005I\001 \005E\002\127\0067\002,\002-\001e\005F\005\231\003\007\0020\005H\002\129\000\200\0020\001\"\002\129\000\200\006C\002n\005s\006\136\003\007\005\232\001\"\001\245\005W\002o\005\234\000\203\000\203\000\203\006\026\002z\000\203\002\127\005[\005]\003\007\001\246\002}\000\203\002\133\005_\005k\005{\002\133\0020\005}\002\129\000\200\005~\005\131\006\180\002\127\005\135\005\139\006\194\005 \005\157\002,\002-\001e\005\164\005\168\005\192\0020\001*\002\129\000\200\002\130\005\213\002\136\005\237\002\130\002n\002\136\007!\002\142\002\133\001\139\002\132\002\142\002o\001\139\002\132\005\247\006'\001\016\002\135\007,\006!\006\"\006&\001\023\005#\002}\001\016\002\133\002\127\0065\002\144\006\\\001\023\001$\002\144\0071\002\130\006g\002\136\006r\0020\006\134\002\129\000\200\002\142\006\135\001\139\002\132\006\139\006\179\006\183\006\193\006\197\007\019\000\000\002\130\000\000\003\026\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\002\144\002,\002-\001e\000\000\002\133\000\000\000\000\000\000\005$\000\000\001-\001\216\000\000\000\000\001\250\002n\002\127\001%\002\144\000\000\004\238\001\240\005(\002o\005&\001\244\000\000\001\023\0020\002\150\002\129\000\200\002\130\000\000\002\136\001.\002}\000\000\000\000\000\000\002\142\000\000\001\139\002\132\001.\000\000\002,\002-\001e\000\000\000\000\000\000\000\000\002\193\001e\000\000\000\000\000\000\000\000\000\000\002\133\002n\000\000\002\144\000\000\000\000\001\245\000\000\000\000\002o\000\000\000\000\000\000\002\236\001v\002\149\001h\001i\000\000\000\000\001\246\000\000\002}\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\136\000\000\000\000\000\000\000\000\002\127\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\000\000\000\000\002\241\003\001\003\002\001\216\002\144\000\000\002\022\000\000\000\000\000\000\002,\002-\001e\001\240\000\000\000\000\000\000\001\244\000\000\001\023\000\000\000\000\000\000\000\000\002\133\002n\002\127\000\000\002,\002-\001e\000\000\001\127\002o\000\000\000\000\000\000\000\000\0020\002\201\002\129\000\200\000\000\002n\001n\000\000\002}\000\200\000\000\000\000\000\000\002o\002\130\000\000\002\136\000\000\000\000\002\212\001\245\000\000\002\142\000\000\001\139\002\132\002}\002,\002-\001e\000\000\000\000\002\133\000\000\001\246\000\000\000\000\000\000\001\216\003\005\003\006\002<\002n\001\216\000\000\002\144\003\225\000\000\001\240\000\000\002o\000\000\001\244\001\240\001\023\000\000\002\224\001\244\000\000\001\023\002\130\000\000\002\136\002}\000\000\000\000\001\129\002\127\002\142\000\000\001\139\002\132\000\000\000\000\001\130\000\000\001\139\001l\000\000\0020\000\000\002\129\000\200\000\000\000\000\002\127\000\000\000\000\000\000\000\000\000\000\002\144\000\000\001\245\000\000\000\000\000\000\0020\001\245\002\129\000\200\000\000\002,\002-\001e\001\216\000\000\001\246\004(\000\000\000\000\002\133\001\246\000\000\000\000\001\240\000\000\002n\000\000\001\244\000\000\001\023\002\127\000\000\000\000\002o\000\000\000\000\000\000\002\133\001\216\002\231\000\000\004,\0020\000\000\002\129\000\200\002}\002\130\001\240\002\136\000\000\000\000\001\244\000\000\001\023\002\142\000\000\001\139\002\132\000\000\000\000\000\000\002,\002-\001e\002\130\000\000\002\136\001\245\000\000\000\000\000\000\000\000\002\142\002\133\001\139\002\132\002n\002\144\000\000\000\000\000\000\001\246\000\000\000\000\002o\002,\002-\001e\000\000\000\000\002\234\000\000\001\245\000\000\000\000\002\144\000\000\002}\000\000\001\031\002n\002\130\001 \002\136\002\127\000\000\001\246\000\000\002o\002\142\000\000\001\139\002\132\000\000\002\240\000\000\0020\000\000\002\129\000\200\000\000\002}\002,\002-\001e\000\000\001\"\000\000\000\000\000\000\000\000\000\000\002\144\001\216\000\000\000\000\004/\002n\002,\002-\001e\000\000\000\000\001\240\000\000\002o\000\000\001\244\002\133\001\023\000\000\002\243\000\000\002n\000\000\000\000\002\127\000\000\002}\000\000\000\000\002o\002,\002-\001e\000\000\000\000\003\r\0020\001*\002\129\000\200\000\000\000\000\002}\000\000\002\130\002n\002\136\000\000\002\127\000\000\000\000\000\000\002\142\002o\001\139\002\132\001\245\000\000\000\000\003\017\0020\000\000\002\129\000\200\000\000\000\000\002}\001\016\002\133\000\000\001\246\000\000\000\000\001\023\001$\002\144\000\000\001\216\000\000\000\000\004=\000\000\000\000\000\000\000\000\002\127\000\000\001\240\000\000\000\000\000\000\001\244\002\133\001\023\000\000\000\000\002\130\0020\002\136\002\129\000\200\002\127\000\000\000\000\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\006\158\002\130\000\000\002\136\000\000\000\000\002\127\001%\002\144\002\142\002\133\001\139\002\132\001\245\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\002,\002-\001e\000\000\002\133\001\246\000\000\000\000\000\000\000\000\002\144\000\000\001.\000\000\000\000\002n\002\130\000\000\002\136\000\000\000\000\000\000\001\031\002o\002\142\001 \001\139\002\132\002\133\000\000\000\000\000\000\002\130\003\023\002\136\000\000\002}\002,\002-\001e\002\142\000\000\001\139\002\132\000\000\000\000\000\000\002\144\000\000\001\"\000\000\000\000\002n\002,\002-\001e\002\130\001<\002\136\000\000\002o\000\000\000\000\002\144\002\142\000\000\001\139\002\132\002n\000\000\003\028\000\000\000\000\002}\000\000\000\000\002o\000\000\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\003\030\002\144\000\000\002}\000\000\000\000\001*\002n\000\000\002\127\000\000\000\000\000\000\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\003\"\000\000\000\000\002}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\001\031\001\023\001$\001 \000\000\002\127\000\000\000\000\000\000\000\000\000\000\000\000\002\133\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\002\127\000\000\000\000\000\000\000\000\000\000\001\"\000\000\000\000\002,\002-\001e\0020\000\000\002\129\000\200\004\216\000\000\000\000\002\130\000\000\003\026\000\000\000\000\002n\002\127\001>\002\142\002\133\001\139\002\132\004\219\002o\001%\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\003*\000\000\002\133\002}\000\000\000\000\000\000\001*\002\144\000\000\000\000\000\000\000\000\000\000\002\130\000\000\003\026\000\000\001.\000\000\000\000\001D\002\142\000\000\001\139\002\132\000\000\002\133\000\000\000\000\002\130\000\000\003\026\000\000\000\000\000\000\000\000\001\016\002\142\000\000\001\139\002\132\000\000\001\023\001$\002\144\000\000\000\000\000\000\000\000\000\000\000\000\002,\002-\001e\002\130\000\000\003\026\000\000\000\000\000\000\002\144\002\127\002\142\000\000\001\139\002\132\002n\002,\002-\001e\000\000\000\000\000\000\0020\002o\002\129\000\200\000\000\000\000\000\000\000\000\000\000\002n\000\000\0030\002\144\000\000\002}\001>\000\000\002o\002,\002-\001e\001\216\001%\000\000\004\137\000\000\004\221\0036\000\000\000\000\002}\001\240\002\133\002n\000\000\001\244\000\000\001\023\000\000\000\000\000\000\002o\002,\002-\001e\001\216\000\000\003=\004\149\001.\000\000\000\000\001H\000\000\002}\001\240\000\000\002n\000\000\001\244\002\130\001\023\003\026\000\000\000\000\002o\000\000\000\000\002\142\000\000\001\139\002\132\000\000\002\127\000\000\003N\001\245\000\000\002}\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\002\127\001\246\002\144\000\000\000\000\002n\002,\002-\001e\000\000\000\000\001\245\0020\002o\002\129\000\200\000\000\000\000\000\000\003B\000\000\002n\000\000\000\000\002\127\001\246\002}\000\000\002\133\002o\000\000\000\000\000\000\000\000\000\000\003G\0020\000\000\002\129\000\200\000\000\000\000\002}\000\000\002\133\000\000\000\000\000\000\002\127\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\003\026\000\000\0020\000\000\002\129\000\200\002\142\000\000\001\139\002\132\002\133\000\000\000\000\000\000\002\130\000\000\003\026\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\002\127\000\000\002\144\000\000\000\000\000\000\000\000\002\133\000\000\000\000\000\000\002\130\0020\002\136\002\129\000\200\002\127\000\000\002\144\002\142\000\000\001\139\002\132\000\000\000\000\002,\002-\001e\0020\000\000\002\129\000\200\002,\002-\001e\002\130\000\000\003\026\000\000\000\000\002n\000\000\002\144\002\142\002\133\001\139\002\132\002n\002o\000\000\000\000\000\000\000\000\000\000\000\000\002o\000\000\000\000\003S\001\216\002\133\002}\004\155\000\000\000\000\003X\002\144\000\000\002}\001\240\000\000\000\000\002\130\001\244\002\136\001\023\000\000\002,\002-\001e\002\142\001\216\001\139\002\132\004\164\000\000\000\000\000\000\002\130\000\000\002\136\001\240\002n\000\000\000\000\001\244\002\142\001\023\001\139\002\132\002o\001\216\000\000\002\144\004\172\000\000\000\000\000\000\000\000\000\000\003g\001\240\000\000\002}\001\245\001\244\000\000\001\023\000\000\002\144\002\127\000\000\002,\002-\001e\000\000\000\000\002\127\001\246\000\000\000\000\000\000\0020\000\000\002\129\000\200\001\245\002n\000\000\0020\000\000\002\129\000\200\000\000\000\000\002o\000\000\000\000\000\000\000\000\001\246\001\216\000\000\000\000\006b\003j\001\245\000\000\002}\000\000\000\000\001\240\000\000\000\000\002\133\001\244\000\000\001\023\000\000\000\000\001\246\002\133\002\127\000\000\000\000\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\002n\000\000\002\130\000\000\003\026\000\000\000\000\000\000\002o\002\130\002\142\003\026\001\139\002\132\003p\000\000\001\245\002\142\000\000\001\139\002\132\002}\002,\002-\001e\000\000\002\133\002\127\000\000\000\000\001\246\000\000\000\000\002\144\000\000\000\000\000\000\002n\000\000\0020\002\144\002\129\000\200\000\000\000\000\002o\002,\002-\001e\000\000\000\000\003r\000\000\000\000\002\130\000\000\003\026\000\000\002}\000\000\000\000\002n\002\142\000\000\001\139\002\132\000\000\000\000\000\000\002o\001\031\002\133\000\000\001 \000\000\003|\000\000\000\000\000\000\000\000\002\127\000\000\002}\000\000\000\000\002\144\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\001\"\000\000\002\130\000\000\003\026\004\231\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\000\000\002\127\000\000\000\000\000\000\002,\002-\001e\002\133\000\000\000\000\000\000\000\000\0020\002\144\002\129\000\200\000\000\000\000\000\000\002n\000\000\000\000\000\000\001*\002\127\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\003\133\000\000\002\130\0020\002\136\002\129\000\200\002}\000\000\000\000\002\142\002\133\001\139\002\132\000\000\000\000\000\000\002,\002-\001e\001\016\000\000\002,\002-\001e\000\000\001\023\001$\001\031\000\000\000\000\001 \002n\002\144\000\000\002\133\000\000\002n\000\000\002\130\002o\002\136\000\000\000\000\000\000\002o\003\136\002\142\000\000\001\139\002\132\003\150\000\000\002}\000\000\001\"\000\000\000\000\002}\000\000\000\000\000\000\000\000\002\130\000\000\002\136\002\127\002,\002-\001e\002\144\002\142\001>\001\139\002\132\000\000\000\000\000\000\0020\001%\002\129\000\200\002n\004\236\000\000\000\000\000\000\000\000\000\000\000\000\002o\000\000\000\000\000\000\002\144\000\000\003\153\000\000\001*\000\000\000\000\000\000\000\000\002}\000\000\000\000\001.\000\000\000\000\001H\002\133\000\000\002\127\000\000\000\000\000\000\000\000\002\127\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\001\016\0020\000\000\002\129\000\200\002n\001\023\001$\000\000\000\000\002\130\000\000\002\136\002o\002,\002-\001e\000\000\002\142\000\000\001\139\002\132\000\000\003\163\000\000\000\000\002}\000\000\002\133\002n\000\000\000\000\000\000\002\133\002\127\000\000\000\000\002o\000\000\000\000\000\000\002\144\000\000\000\000\000\000\000\000\0020\003\168\002\129\000\200\002}\000\000\001>\000\000\000\000\000\000\002\130\000\000\002\136\001%\000\000\002\130\000\000\002\136\002\142\000\000\001\139\002\132\000\000\002\142\000\000\001\139\002\132\000\000\000\000\002,\002-\001e\002\133\000\000\000\000\000\000\000\000\000\000\000\000\002\127\001.\002\144\000\000\001?\002n\000\000\002\144\000\000\000\000\000\000\000\000\0020\002o\002\129\000\200\000\000\000\000\000\000\003\217\000\000\002\130\000\000\002\136\002\127\000\000\002}\000\000\000\000\002\142\000\000\001\139\002\132\002,\002-\001e\0020\000\000\002\129\000\200\000\000\000\000\000\000\000\000\002\133\000\000\000\000\000\000\002n\000\000\000\000\000\000\002\144\000\000\000\000\000\000\002o\000\000\000\000\000\000\000\000\000\000\003\230\000\000\000\000\000\000\000\000\000\000\002\133\002}\000\000\000\000\002\130\000\000\003\026\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\002\127\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\0020\003\026\002\129\000\200\002n\000\000\002\144\002\142\000\000\001\139\002\132\000\000\002o\000\000\002\193\001e\000\000\000\000\004\018\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\000\000\000\000\002\144\002\127\002\133\000\000\002\236\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\136\000\000\000\000\000\000\001d\001e\002\142\000\000\001\139\002\132\000\000\000\000\000\000\002\133\002\241\003\001\003\002\000\000\000\000\000\000\000\000\000\000\002\127\000\000\001f\001v\000\000\001h\001i\002\144\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\000\000\002\130\000\000\002\136\000\000\000\000\001\127\004\"\000\000\002\142\000\000\001\139\002\132\002,\002-\001e\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\000\000\002\133\001w\002n\001x\002L\000\000\002\144\000\000\000\000\000\000\002o\000\000\002,\002-\001e\000\000\004U\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\003\005\004\024\002n\002\130\000\000\002\136\000\000\001\127\000\000\000\000\002o\002\142\000\000\001\139\002\132\000\000\005\138\000\000\000\000\001n\000\000\000\000\000\200\002}\000\000\000\000\000\000\001\129\000\000\000\000\003\141\000\000\000\000\000\000\002\144\001\130\000\000\001\139\001l\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002n\000\000\000\000\002\127\000\000\000\000\000\000\000\000\002o\002,\002-\001e\000\000\000\000\005\141\0020\000\000\002\129\000\200\000\000\000\000\002}\000\000\001\031\002n\001\129\001 \000\000\002\127\000\000\000\000\000\000\002o\001\130\000\000\001\139\001l\000\000\005\156\000\000\0020\000\000\002\129\000\200\000\000\002}\000\000\002\133\000\000\000\000\001\"\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\248\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\133\000\000\006\144\002\130\002n\002\136\000\000\000\000\002\127\000\000\000\000\002\142\002o\001\139\002\132\000\000\000\000\000\000\005\159\000\000\0020\001*\002\129\000\200\000\000\002}\000\000\000\000\002\130\000\000\002\136\000\000\002\127\000\000\002\144\000\000\002\142\000\000\001\139\002\132\000\000\002,\002-\001e\0020\000\000\002\129\000\200\000\000\000\000\000\000\001\016\002\133\000\000\000\000\000\000\002n\001\023\001$\002\144\000\000\000\000\000\000\000\000\002o\000\000\002,\002-\001e\000\000\005\172\000\000\000\000\000\000\000\000\000\000\002\133\002}\000\000\000\000\002\130\002n\002\136\000\000\002\127\000\000\000\000\000\000\002\142\002o\001\139\002\132\000\000\000\000\000\000\005\175\0020\000\000\002\129\000\200\000\000\000\000\002}\001>\002\130\000\000\002\136\000\000\000\000\000\000\001%\002\144\002\142\000\000\001\139\002\132\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\133\000\000\000\000\002n\000\000\000\000\000\000\002\144\002\127\001.\000\000\002o\003\255\000\000\002,\002-\001e\005\196\000\000\000\000\0020\000\000\002\129\000\200\002}\000\000\000\000\000\000\002\130\002n\002\136\000\000\000\000\002\127\000\000\000\000\002\142\002o\001\139\002\132\002,\002-\001e\005\199\000\000\0020\000\000\002\129\000\200\000\000\002}\000\000\002\133\000\000\000\000\002n\000\000\000\000\000\000\002\144\000\000\000\000\000\000\002o\000\000\000\000\000\000\001\031\000\000\005\203\001 \000\000\000\000\0012\000\000\000\000\002}\002\133\000\000\000\000\002\130\000\000\002\136\002\127\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\0013\001\"\0020\000\000\002\129\000\200\000\000\001O\000\000\000\000\000\000\000\000\002\130\000\000\002\136\000\000\002\127\000\000\002\144\000\000\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\002\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\127\002\144\001*\002\193\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\002\133\0018\002\130\000\000\002\136\002\236\001v\000\000\001h\001i\002\142\000\000\001\139\002\132\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\002\133\000\000\002\130\000\000\002\136\000\000\000\000\002\144\000\000\000\000\002\142\000\000\001\139\002\132\001\031\000\000\000\000\001 \000\000\000\000\000\000\002\241\003\001\003\002\000\000\002\193\001e\000\000\002\130\000\000\002\136\000\000\000\000\002\144\000\000\000\000\002\142\000\000\001\139\002\132\001>\001\"\000\000\001d\001e\002\236\001v\001%\001h\001i\000\000\001F\000\000\001\127\000\000\000\000\000\000\000\000\000\000\002\144\000\000\000\000\000\000\001f\001v\001n\001h\001i\000\200\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\006l\002\241\003\001\003\002\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\003\005\005\214\000\000\000\000\000\000\002,\002-\001e\001w\000\000\001x\002L\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\002n\001\127\001\023\001$\000\000\000\000\000\000\001\129\002o\002,\002-\001e\000\000\001n\006\210\001\130\000\200\001\139\001l\001\127\000\000\002}\000\000\000\000\002n\000\000\000\000\000\000\000\000\000\000\000\000\001n\002o\000\000\000\200\000\000\000\000\000\000\006\212\000\000\001d\001e\003\141\000\000\000\000\002}\003\005\005\248\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\004\249\001f\001v\004\252\001h\001i\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\002\127\001\130\001.\001\139\001l\001H\000\000\000\000\000\000\000\000\000\000\001\129\0020\000\000\002\129\000\200\000\000\000\000\000\000\001\130\000\000\001\139\001l\001w\002\127\001x\001\143\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\000\000\000\000\002\133\000\000\000\000\000\000\000m\001f\001v\000\000\001h\001i\001\127\001d\001e\000\000\000\000\001\184\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\002\133\000\200\000\000\000\000\002\130\000\000\002\136\001f\001v\000\000\001h\001i\002\142\000\000\001\139\002\132\000\000\001\169\000\000\000\000\000\000\000\000\001d\001e\001w\000\000\001x\001\172\002\130\000\000\002\136\000\000\000\000\000\000\000\000\002\144\002\142\000\000\001\139\002\132\001d\001e\001f\001v\000\000\001h\001i\000\000\000\000\000\000\001w\000\000\001x\001\172\000\000\001\127\001d\001e\001\129\002\144\001f\001v\000\000\001h\001i\000\000\001\130\001n\001\139\001l\000\200\000\000\000\000\000\000\000\000\000\000\001f\001v\000\000\001h\001i\001\127\000\000\000\000\000\000\001w\001\174\001x\002L\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\002,\002-\001e\001w\000\000\001x\002T\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002n\001\127\000\000\000\000\001w\000\000\001x\001\172\002o\000\000\000\000\000\000\001\129\001n\000\000\000\000\000\200\000\000\000\000\001\127\001\130\002}\001\139\001l\003\137\000\000\000\000\000\000\002,\002-\001e\001n\000\000\000\000\000\200\001\127\000\000\000\000\001\129\000\000\000\000\000\000\000\000\002n\000\000\000\000\001\130\001n\001\139\001l\000\200\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002W\000\000\000\000\002}\000\000\000\000\000\000\000\000\000\000\002,\002-\001e\001\129\000\000\002,\002-\001e\000\000\000\000\002\127\001\130\000\000\001\139\001l\002n\000\000\000\000\000\000\000\000\002n\001\129\0020\002o\002\129\000\200\000\000\000\000\002o\001\130\000\000\001\139\001l\000\000\000\000\000\000\002}\001\129\000\000\000\000\000\000\002}\000\000\000\000\000\000\001\130\000\000\001\139\001l\000\000\000\000\000\000\000\000\002\127\002\133\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\002n\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002o\000\000\000\000\000\000\002\130\000\000\003\011\000\000\000\000\000\000\000\000\000\000\002\142\002}\001\139\002\132\000\000\002\127\000\000\002\133\000\000\000\000\002\127\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\0020\002\144\002\129\000\200\002n\000\000\000\000\002,\002-\001e\000\000\000\000\002o\002\130\000\000\002\138\000\000\000\000\000\000\000\000\000\000\002\142\002n\001\139\002\132\002}\000\000\002\133\000\000\000\000\002o\000\000\002\133\000\000\000\000\000\000\000\000\000\000\002\127\000\000\000\000\000\000\000\000\002}\002\144\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\002\130\000\000\002\140\000\000\000\000\002\130\000\000\002\145\002\142\000\000\001\139\002\132\000\000\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\006(\000\000\000\000\002\133\000\000\002\127\000\000\002\144\000\000\002,\002-\001e\002\144\000\000\000\000\000\000\000\000\0020\007\030\002\129\000\200\006+\000\000\002\127\002n\002,\002-\001e\000\000\000\000\006,\002\130\002o\002\152\000\000\0020\000\000\002\129\000\200\002\142\002n\001\139\002\132\000\000\000\000\002}\000\000\000\000\002o\002\133\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\006-\000\000\002}\002\144\000\000\000\000\002n\000\000\002\133\000\000\000\000\000\000\000\000\000\000\002o\000\000\000\000\000\000\002\130\000\000\002\154\000\000\000\000\000\000\000\000\000\000\002\142\002}\001\139\002\132\000\000\000\000\000\000\000\000\006.\000\000\002\130\000\000\002\156\000\000\000\000\000\000\000\000\006/\002\142\002\127\001\139\002\132\000\000\002\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\002\127\000\000\000\000\007\031\000\000\000\000\002\144\002,\002-\001e\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\000\000\000\000\000\000\0061\002n\000\000\000\000\002\127\000\000\000\000\002\133\000\000\002o\0062\002,\002-\001e\000\000\0064\0020\000\000\002\129\000\200\000\000\000\000\002}\002\133\000\000\0066\002n\002,\002-\001e\000\000\000\000\000\000\000\000\002o\002\130\000\000\002\158\000\000\000\000\000\000\0067\002n\002\142\000\000\001\139\002\132\002}\002\133\000\000\002o\002\130\000\000\002\160\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\002}\000\000\000\000\002\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\162\000\000\000\000\002\127\002\144\000\000\002\142\000\000\001\139\002\132\002,\002-\001e\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002n\000\000\000\000\002\127\002\144\000\000\000\000\000\000\002o\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\002\127\000\000\002}\002\133\000\000\002n\000\000\002,\002-\001e\000\000\000\000\0020\002o\002\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002n\000\000\000\000\000\000\002}\000\000\002\133\000\000\002o\002\130\000\000\002\164\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\002}\002\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\166\000\000\000\000\002\127\002\144\000\000\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\002\130\0020\002\168\002\129\000\200\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\002\127\000\000\002\144\000\000\000\000\000\000\000\000\002,\002-\001e\000\000\000\000\0020\000\000\002\129\000\200\000\000\002\127\002\144\000\000\002\133\000\000\002n\000\000\002,\002-\001e\000\000\000\000\0020\002o\002\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002n\002,\002-\001e\002}\002\133\000\000\000\000\002o\002\130\000\000\002\170\000\000\000\000\000\000\000\000\002n\002\142\000\000\001\139\002\132\002}\002\133\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\172\000\000\002}\000\000\000\000\002\144\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\174\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\002\127\002\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\002\127\002\144\002,\002-\001e\000\000\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\002\127\002n\000\000\000\000\000\000\002n\000\000\001\031\000\000\002o\005\030\002\133\0020\002o\002\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002}\002,\002-\001e\002}\000\000\002\133\000\000\000\000\000\000\000\000\000\000\001\"\000\000\000\000\000\000\002n\002\130\000\000\002\176\000\000\000\000\002\133\000\000\002o\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\178\002}\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\000\000\002\144\000\000\002\130\000\000\002\180\000\000\000\000\005 \000\000\000\000\002\142\002\127\001\139\002\132\000\000\002\127\000\000\002\144\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\0020\000\000\002\129\000\200\000\000\000\000\002\144\002,\002-\001e\001\016\002,\002-\001e\000\000\000\000\001\023\005#\000\000\000\000\000\000\002\127\002n\000\000\000\000\000\000\002n\000\000\002\133\000\000\002o\000\000\002\133\0020\002o\002\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\000\000\002}\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002\182\000\000\002\130\000\000\002\184\000\000\002\142\002\133\001\139\002\132\002\142\005$\001\139\002\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\238\000\000\005'\000\000\005&\000\000\002\144\000\000\000\000\000\000\002\144\000\000\002\130\000\000\002\186\001.\000\000\000\000\000\000\000\000\002\142\002\127\001\139\002\132\000\000\002\127\000\000\000\000\000\000\001d\001e\000\000\000\000\0020\000\000\002\129\000\200\0020\002\210\002\129\000\200\000\000\000\000\002\144\000\000\000\000\002\213\001d\001e\001f\002\214\000\000\001h\001i\000\000\000\000\002\210\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\213\002\133\000\000\001f\002\214\002\133\001h\001i\000\000\002,\002-\001e\000\000\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002n\000\000\000\000\000\000\002n\002\130\000\000\002\188\002o\002\130\000\000\002\190\002o\002\142\000\000\001\139\002\132\002\142\000\000\001\139\002\132\002}\000\000\000\000\000\000\002}\000\000\000\000\000\000\000\000\000\000\002,\002-\001e\000\000\001m\002\144\000\000\000\000\000\000\002\144\000\000\000\000\000\000\000\000\000\000\002n\001n\000\000\000\000\000\200\000\000\000\000\001m\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\002}\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\127\000\000\002\215\000\000\002\127\000\000\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\0020\000\000\002\129\000\200\002\215\002n\002\217\000\000\000\000\000\000\000\000\001\129\000\000\002o\000\000\000\000\000\000\000\000\000\000\001\138\000\000\001\139\001l\000\000\002\216\000\000\002}\000\000\002\133\001\129\002\127\000\000\002\133\000\000\000\000\000\000\000\000\001\138\000\000\001\139\001l\000\000\0020\000\000\002\129\000\200\002,\002-\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\003.\000\000\002\130\002n\0034\000\000\002\142\000\000\001\139\002\132\002\142\002o\001\139\002\132\000\000\000\000\002\133\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\002\127\000\000\002\144\002,\002-\001e\002\144\002,\002-\001e\000\000\000\000\0020\000\000\002\129\000\200\000\000\002\130\002n\003:\000\000\000\000\002n\000\000\000\000\002\142\002o\001\139\002\132\000\000\002o\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\002,\002-\001e\002}\002\133\000\000\000\000\000\000\002\144\000\000\000\000\001\031\000\000\000\000\001 \002n\002\127\000\000\002,\002-\001e\000\000\000\000\002o\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\002\130\002n\003@\000\000\002}\000\000\001\"\000\000\002\142\002o\001\139\002\132\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\002}\000\000\000\000\000\000\002\127\000\000\002\133\000\000\002\127\002\144\002,\002-\001e\000\000\000\000\000\000\0020\000\000\002\129\000\200\0020\000\000\002\129\000\200\000\000\002n\000\000\001*\000\000\000\000\000\000\000\000\000\000\002o\002\130\000\000\003E\000\000\000\000\000\000\000\000\002\127\002\142\000\000\001\139\002\132\002}\000\000\002\133\000\000\000\000\000\000\002\133\0020\000\000\002\129\000\200\001\016\000\000\002\127\002,\002-\001e\001\023\001$\002\144\000\000\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\002n\002\130\000\000\003J\000\000\002\130\000\000\003Q\002o\002\142\002\133\001\139\002\132\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\002}\000\000\000\000\000\000\000\000\000\000\000\000\002\133\000\000\002\127\000\000\002\144\000\000\001>\000\000\002\144\000\000\002\130\000\000\003V\001%\0020\000\000\002\129\000\200\002\142\000\000\001\139\002\132\000\000\000\000\001d\001e\000\000\000\000\002\130\000\000\003[\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\001.\002\144\000\000\001\225\001f\001v\002\133\001h\001i\000\000\000\000\000\000\002\127\000\000\000\000\002,\002-\001e\000\000\002\144\000\000\000\000\000\000\000\000\0020\000\000\002\129\000\200\000\000\000\000\002n\000\000\000\000\000\000\002\130\000\000\003^\000\000\002o\000\000\001\187\001e\002\142\000\000\001\139\002\132\000\000\001w\000\000\001x\002L\002}\000\000\001d\001e\000\000\002\133\000\000\000\000\000\000\001f\002A\000\000\001h\001i\002\144\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001f\001v\000\000\001h\001i\001\127\000\000\000\000\000\000\000\000\000\000\002\130\000\000\003\144\000\000\000\000\000\000\001n\000\000\002\142\000\200\001\139\002\132\000\000\000\000\000\000\000\000\000\000\003\140\003\148\003\001\003\002\000\000\001d\001e\000\000\000\000\002\127\000\000\000\000\000\000\000\000\002\144\001w\000\000\001x\007\b\000\000\007\n\0020\000\000\002\129\000\200\001f\001v\000\000\001h\001i\000\000\000\000\000\000\001\127\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\0012\000\000\000\000\001n\001\127\000\000\000\200\001\129\000\000\000\000\000\000\002\133\000\000\000\000\000\000\001\130\001n\001\139\001l\000\200\0013\001\"\000\000\000\000\000\000\000\000\001w\0014\001x\006M\000\000\000\000\003\155\000\000\000\000\000\000\000\000\000\000\000\000\002\130\000\000\003\146\000\000\000\000\000\000\000\000\000\000\002\142\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\001\031\001\127\000\000\001 \000\000\000\000\0012\001\129\001*\000\000\000\000\000\000\000\000\001n\002\144\001\130\000\200\001\139\001l\000\000\001\129\000\000\000\000\000\000\000\000\0018\0013\001\"\001\130\000\000\001\139\001l\000\000\001M\000\000\000\000\000\000\000\000\001\016\001d\001e\000\000\000\000\000\000\001\023\001$\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\000\000\001f\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\001f\001v\001*\001h\001i\001\129\000\000\001f\001v\000\000\001h\001i\000\000\001\130\000\000\001\139\001l\000\000\000\000\0018\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\001\016\001F\001w\000\000\001x\001\176\001\023\001$\000\000\000\000\000\000\001w\000\000\001x\001\164\000\000\000\000\000\000\001w\000\000\001x\001\161\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\001\127\000\000\000\000\000\000\000\000\001\031\000\000\000\000\005\030\001\127\000\000\000\000\001n\001d\001e\000\200\001\127\000\000\000\000\001>\000\000\001n\000\000\000\000\000\200\000\000\001%\000\000\001n\000\000\001F\000\200\001\"\001f\001v\000\000\001h\001i\001d\001e\000\000\0055\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\001f\001v\000\000\001h\001i\001f\001v\000\000\001h\001i\000\000\0056\000\000\0057\001\129\000\000\000\000\005 \001w\000\000\001x\001z\001\130\001\129\001\139\001l\000\000\000\000\000\000\000\000\001\129\001\130\000\000\001\139\001l\000\000\001d\001e\001\130\000\000\001\139\001l\0058\001w\000\000\001x\001}\001\016\001w\001\127\001x\001\128\000\000\001\023\005#\000\000\001f\001v\000\000\001h\001i\001n\000\000\000\000\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\001e\001\127\0059\000\000\000\000\000\000\001\127\000\000\000\000\000\000\000\000\005:\005;\001n\005<\000\000\000\200\000\000\001n\001f\001v\000\200\001h\001i\000\000\000\000\001w\000\000\001x\001\160\000\000\000\000\000\000\005$\000\000\000\000\000\000\005v\000\000\000\000\000\000\000\000\000\000\000\000\000\000\004\238\000\000\005%\001\129\005&\000\000\000\000\000\000\000\000\000\000\000\000\001\130\001\127\001\139\001l\001.\005>\001w\000\000\001x\001\148\005@\005J\000\000\001n\000\000\001\031\000\200\001\129\005\030\000\000\005t\000\000\001\129\000\000\000\000\001\130\000\000\001\139\001l\000\000\001\130\000\000\001\139\001l\001d\001e\005u\001\127\002,\002-\001e\000\000\001\"\000\000\000\000\000\000\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\001f\001v\000\000\001h\001i\000\000\000\000\003\176\000\000\000\000\000\000\000\000\001d\001e\003\185\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\130\000\000\001\139\001l\005 \001f\001v\000\000\001h\001i\003\198\000\000\000\000\000\000\000\000\000\000\001w\000\000\001x\001\156\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\001\016\000\000\001\130\000\000\001\139\001l\001\023\005#\001f\001v\000\000\001h\001i\001\127\001w\000\000\001x\002d\002/\000\000\001d\001e\000\000\000\000\000\000\001n\001d\001e\000\200\002\232\003\189\000\000\002\129\000\200\001\002\000\000\001\031\002\235\000\000\001 \001f\002\214\001I\001h\001i\001\127\001f\001v\000\000\001h\001i\001w\000\000\001x\002\246\000\000\000\000\001n\000\000\005$\000\200\000\000\001K\001\"\000\000\000\000\000\000\003\179\004\231\000\000\000\000\004\238\000\000\0051\000\000\005&\000\000\000\000\000\000\000\000\000\000\000\000\001\127\000\000\000\000\001\129\001.\000\000\000\000\001w\002\130\001x\002\249\001\130\001n\001\139\001l\000\200\002\131\000\000\001\139\002\132\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\001d\001e\000\000\000\000\001m\000\000\000\000\001\129\000\000\000\000\001\127\000\000\000\000\0018\000\000\001\130\001n\001\139\001l\000\200\001f\001v\001n\001h\001i\000\200\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\001d\001e\000\000\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\002\215\001\130\000\000\001\139\001l\001f\001v\000\000\001h\001i\000\000\000\000\001w\000\000\001x\002\252\000\000\000\000\000\000\000\000\000\000\000\000\002,\002-\001e\001\129\000\000\001>\000\000\000\000\000\000\001\129\000\000\001\138\001%\001\139\001l\000\000\005\029\001\130\000\000\001\139\001l\001\127\000\000\003\176\001d\001e\001w\000\000\001x\003\004\003\185\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\001.\000\000\000\000\001H\000\000\001f\001v\000\000\001h\001i\000\000\000\000\000\000\000\000\003\186\000\000\001\031\000\000\001\127\001 \000\000\000\000\001I\000\000\000\000\000\000\001\031\000\000\000\000\001 \001n\000\000\0012\000\200\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001K\001\"\000\000\000\000\000\000\000\000\001w\000\000\001x\004S\0017\001\"\001\129\000\000\002/\000\000\000\000\000\000\001d\001e\001\130\000\000\001\139\001l\000\000\000\000\003\189\000\000\002\129\000\200\001\002\000\000\000\000\000\000\000\000\004\030\000\000\001\127\001f\002\214\000\000\001h\001i\000\000\001*\001d\001e\000\000\001\129\001n\000\000\000\000\000\200\000\000\001*\000\000\001\130\000\000\001\139\001l\000\000\0018\000\000\003\179\000\000\001f\002\214\000\000\001h\001i\000\000\0018\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\001d\001e\001\016\000\000\002\130\001d\001e\000\000\001\023\001$\000\000\000\000\002\131\000\000\001\139\002\132\000\000\000\000\000\000\000\000\001f\002\214\000\000\001h\001i\001f\002\214\001\129\001h\001i\001m\000\000\000\000\000\000\000\000\001\130\000\000\001\139\001l\001d\001e\000\000\001n\000\000\001>\000\200\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\001>\001F\000\000\001m\000\000\001f\002\214\001%\001h\001i\000\000\001F\000\000\000\000\000\000\001n\000\000\000\000\000\200\000\000\000\000\000\000\000\000\002\215\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\001m\001d\001e\000\000\000\000\001m\000\000\000\000\001\129\000\000\003}\000\000\001n\000\000\000\000\000\200\001\138\001n\001\139\001l\000\200\001f\002\214\000\000\001h\001i\000\000\000\000\000\000\003\128\000\000\000\000\000\000\000\000\000\000\001\129\000\000\000\000\000\000\001m\001d\001e\000\000\001\138\000\000\001\139\001l\003}\000\000\000\000\000\000\001n\003}\000\000\000\200\000\000\000\000\005\176\000\000\000\000\001f\002\214\000\000\001h\001i\000\000\003\127\000\000\000\000\000\000\000\000\003~\001\129\000\000\000\000\000\000\000\000\001\129\001d\001e\001\138\000\000\001\139\001l\000\000\001\138\003}\001\139\001l\000\000\000\000\000\000\001d\001e\000\000\001m\000\000\000\000\001f\002\214\000\000\001h\001i\000\000\000\000\003\130\000\000\001n\000\000\005\200\000\200\001\129\001f\002\214\000\000\001h\001i\000\000\000\000\001\138\000\000\001\139\001l\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001d\001e\000\000\0055\001m\000\000\001d\001e\000\000\000\000\000\000\000\000\006\027\000\000\000\000\000\000\001n\000\000\000\000\000\200\001f\002\214\000\000\001h\001i\000\000\001f\002\214\000\000\001h\001i\0056\000\000\0057\000\000\000\000\000\000\001\129\000\000\000\000\001d\001e\001m\000\000\000\000\001\138\000\000\001\139\001l\001d\001e\002\215\000\000\000\000\001n\000\000\001m\000\200\000\000\006\029\001f\002\214\0058\001h\001i\000\000\000\000\000\000\001n\001f\002\214\000\200\001h\001i\000\000\000\000\001\129\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\001\139\001l\000\000\005\227\000\000\000\000\000\000\000\000\001m\0059\000\000\000\000\000\000\000\000\001m\000\000\000\000\002\215\005:\005;\001n\005<\000\000\000\200\000\000\000\000\001n\000\000\001\129\000\200\000\000\000\000\000\000\000\000\000\000\000\000\001\138\000\000\001\139\001l\000\000\000\000\001\129\000\000\005=\000\000\000\000\000\000\001m\005\240\001\138\000\000\001\139\001l\000\000\005\227\000\000\001m\000\000\000\000\001n\006\027\000\000\000\200\000\000\000\000\000\000\000\000\005>\001n\000\000\000\000\000\200\005@\005J\001\031\000\000\000\000\001 \000\000\001\129\000\000\000\000\005t\001\031\000\000\001\129\001 \001\138\001\031\001\139\001l\001 \000\000\001\138\006\027\001\139\001l\000\000\005u\000\000\005\239\001\"\000\000\003\129\000\000\001\031\000\000\006\028\001 \000\000\001\"\004\216\000\000\000\000\000\000\001\"\000\000\000\000\000\000\001\129\004\216\000\000\002,\002-\001e\004\216\005\173\001\138\001\129\001\139\001l\000\000\001\"\000\000\006\159\005\187\001\138\000\000\001\139\001l\005\197\006$\000\000\000\000\001*\003_\000\000\001d\001e\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001f\001g\005\233\001h\001i\000\000\000\000\001\016\001*\001d\001e\000\000\000\000\001\023\001$\000\000\001\016\000\000\000\000\000\000\000\000\001\016\001\023\001$\000\000\000\000\000\000\001\023\001$\001f\001\137\000\000\001h\001i\001d\001e\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\002/\000\000\000\000\000\000\001f\002\199\000\000\001h\001i\001>\000\000\000\000\0020\000\000\002\129\000\200\001%\000\000\001>\000\000\004\221\000\000\000\000\001>\001m\001%\000\000\000\000\000\000\004\221\001%\000\000\001\031\000\000\004\221\001 \001n\000\000\000\000\000\200\001>\000\000\000\000\001.\000\000\000\000\001H\001%\003b\000\000\000\000\006\166\001.\001m\000\000\001H\000\000\001.\000\000\001\"\001H\002,\002-\001e\000\000\001n\000\000\000\000\000\200\002\225\000\000\000\000\002\130\001\031\001.\000\000\001 \001H\001m\000\000\002\131\000\000\001\139\002\132\003_\000\000\000\000\000\000\000\000\000\000\001n\000\000\001\031\000\200\001\031\001 \001\129\001 \000\000\000\000\001\"\000\000\001*\000\000\001\138\000\000\001\139\001l\000\000\000\000\003\248\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\"\000\000\001\"\000\000\000\000\003\251\001\129\005\222\000\000\000\000\000\000\000\000\000\000\001\016\001\138\000\000\001\139\001l\000\000\001\023\001$\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\006(\000\000\001\129\000\000\000\000\000\000\000\000\000\000\002/\000\000\001\138\000\000\001\139\001l\001*\000\000\001*\000\000\006)\006(\0020\006+\002\129\000\200\000\000\001\016\000\000\000\000\000\000\000\000\006,\001\023\001$\000\000\000\000\000\000\001>\006)\000\000\000\000\006+\000\000\000\000\001%\001\016\000\000\001\016\002\207\000\000\006,\001\023\001$\001\023\001$\000\000\000\000\003a\000\000\001\031\006-\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\001\031\001H\000\000\001 \000\000\001>\006-\000\000\002\130\000\000\000\000\000\000\001%\001\"\000\000\000\000\002\131\000\000\001\139\002\132\000\000\006.\000\000\000\000\001>\000\000\001>\001\"\000\000\000\000\006/\001%\000\000\001%\000\000\004\249\000\000\004\236\006\012\001.\006.\000\000\003\255\000\000\002,\002-\001e\000\000\000\000\006/\001\031\000\000\006\244\001 \006;\000\000\001*\000\000\001.\000\000\001.\001H\000\000\001H\000\000\000\000\000\000\006Z\000\000\0061\001*\000\000\000\000\006D\000\000\000\000\000\000\001\"\001\031\0062\000\000\001 \000\000\000\000\0064\000\000\001\016\000\000\0061\000\000\000\000\000\000\001\023\001$\0066\000\000\000\000\000\000\0062\001\031\001\016\000\000\001 \0064\000\000\001\"\001\023\001$\000\000\000\000\0067\000\000\000\000\0066\000\000\000\000\000\000\000\000\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\001\"\000\000\001\031\0067\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\001>\002/\001\031\000\000\000\000\001 \000\000\001%\000\000\000\000\001*\006\245\001\016\0020\001>\002\129\000\200\001\"\001\023\001$\000\000\001%\000\000\000\000\000\000\006\205\002,\002-\001e\001\"\000\000\001*\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\001.\003\193\000\000\001H\000\000\002,\002-\001e\000\000\002,\002-\001e\001*\001\016\000\000\000\000\001>\000\000\000\000\001\023\001$\000\000\000\000\001%\001*\002\130\000\000\001X\002.\002,\002-\001e\002i\002\131\000\000\001\139\002\132\000\000\000\000\000\000\000\000\000\000\001\016\000\000\001>\000\000\000\000\000\000\001\023\001$\001.\001%\002k\001H\001\016\001\151\000\000\000\000\000\000\001\031\001\023\001$\001 \000\000\001\031\001>\000\000\001 \000\000\000\000\000\000\000\000\001%\002/\000\000\000\000\001\192\000\000\001.\000\000\000\000\001H\000\000\000\000\000\000\0020\001\"\002\129\000\200\000\000\000\000\001\"\000\000\000\000\001>\000\000\000\000\000\000\000\000\001.\002/\001%\001H\000\000\002/\001\230\001>\000\000\001\031\000\000\000\000\001 \0020\001%\002\129\000\200\0020\001\232\002\129\000\200\000\000\000\000\000\000\000\000\002/\002,\002-\001e\001.\001*\000\000\001H\000\000\000\000\001*\001\"\0020\000\000\002\129\000\200\001.\000\000\000\000\001H\000\000\002\130\000\000\000\000\002u\000\000\000\000\000\000\000\000\002\131\000\000\001\139\002\132\000\000\000\000\001\016\000\000\000\000\000\000\000\000\001\016\001\023\001$\002,\002-\001e\001\023\001$\002\130\000\000\000\000\000\000\002\130\000\000\001*\000\000\002\131\000\000\001\139\002\132\002\131\000\000\001\139\002\132\000\000\000\000\002\128\000\000\000\000\000\000\000\000\000\000\002\130\000\000\002,\002-\001e\000\000\000\000\000\000\002\131\000\000\001\139\002\132\001\016\001\031\000\000\001>\001 \000\000\001\023\001$\001>\000\000\001%\000\000\002/\002\143\002C\001%\000\000\001\031\000\000\002V\001 \000\000\000\000\000\000\0020\000\000\002\129\000\200\001\"\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \001.\000\000\000\000\001H\000\000\001.\000\000\001\"\001H\000\000\000\000\001\031\000\000\000\000\001 \001>\000\000\002/\000\000\000\000\000\000\000\000\001%\001\"\000\000\000\000\002\204\000\000\000\000\0020\000\000\002\129\000\200\000\000\001*\000\000\000\000\000\000\001\"\000\000\000\000\000\000\002,\002-\001e\000\000\000\000\002\130\002/\001.\001*\000\000\001H\000\000\000\000\002\131\000\000\001\139\002\132\000\000\0020\000\000\002\129\000\200\001\016\003'\001*\000\000\000\000\000\000\001\023\001$\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\001*\000\000\000\000\000\000\000\000\001\023\001$\001\031\002\130\000\000\001 \000\000\000\000\000\000\000\000\001\016\002\131\001\031\001\139\002\132\001 \001\023\001$\000\000\000\000\001\031\000\000\000\000\001 \000\000\001\016\000\000\000\000\000\000\001\"\001>\001\023\001$\000\000\002\130\000\000\000\000\001%\000\000\001\"\000\000\002\209\002\131\000\000\001\139\002\132\001>\001\"\000\000\000\000\000\000\002/\001\031\001%\000\000\001 \000\000\002\222\000\000\000\000\000\000\000\000\001>\0020\001.\002\129\000\200\001H\000\000\001%\000\000\000\000\001*\002\229\000\000\000\000\000\000\001>\000\000\001\"\001.\000\000\001*\001H\001%\000\000\000\000\000\000\002\238\000\000\001*\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\001\031\001.\001\016\001 \001H\000\000\000\000\000\000\001\023\001$\001\016\000\000\001*\002\130\000\000\000\000\001\023\001$\000\000\001\031\000\000\002\131\001 \001\139\002\132\000\000\000\000\001\"\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\000\000\000\000\001\031\000\000\001\016\001 \001>\000\000\001\"\000\000\001\023\001$\001\031\001%\000\000\001 \001>\004b\000\000\000\000\000\000\001\"\001\031\001%\001>\005\030\000\000\004\193\000\000\001\"\000\000\001%\001*\000\000\000\000\004\205\000\000\000\000\000\000\001\"\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\001\"\001.\001*\000\000\001H\000\000\000\000\001>\000\000\001.\000\000\000\000\001H\001\016\001%\001*\000\000\000\000\004\218\001\023\001$\000\000\000\000\001*\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\001*\000\000\000\000\000\000\000\000\001\023\001$\000\000\001.\000\000\005 \001H\001\016\000\000\001\031\000\000\000\000\005\030\001\023\001$\001\016\000\000\000\000\000\000\000\000\001\031\001\023\001$\001 \000\000\001\016\000\000\001>\000\000\000\000\000\000\001\023\001$\000\000\001%\001\016\001\"\000\000\004\235\000\000\000\000\001\023\005#\000\000\000\000\000\000\001>\001\"\001\031\000\000\000\000\001 \000\000\001%\000\000\000\000\000\000\004\251\000\000\001>\001\031\001.\000\000\001 \001H\000\000\001%\001>\000\000\000\000\005\152\000\000\000\000\000\000\001%\001\"\000\000\001>\005\170\005 \001.\000\000\000\000\001H\001%\000\000\001\031\001\"\005\194\001 \001*\000\000\000\000\001.\005$\000\000\001H\000\000\000\000\000\000\000\000\001.\000\000\000\000\001H\000\000\004\238\000\000\005\254\001\016\005&\001.\000\000\001\"\001H\001\023\005#\000\000\001*\000\000\001\016\001.\000\000\000\000\000\000\000\000\001\023\001$\000\000\000\000\001*\000\000\000\000\000\000\000\000\001\031\000\000\000\000\001 \000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\001*\000\000\000\000\000\000\001\016\000\000\001\"\000\000\000\000\000\000\001\023\001$\005$\000\000\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\004\238\000\000\006\024\006P\005&\000\000\001\016\000\000\000\000\000\000\000\000\000\000\001\023\001$\000\000\001.\000\000\000\000\000\000\000\000\001>\000\000\000\000\000\000\000\000\001*\001.\001%\000\000\001H\000\000\006\165\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\006\169\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\001\016\000\000\001H\001>\000\000\000\000\001\023\001$\000\000\000\000\001%\001.\000\000\000\000\001H\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\001\227\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001>\000\000\000\000\000\000\000\000\000\000\000\000\001%\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\000\001.\000\000\000\000\003\250")) and semantic_action = [| @@ -1336,9 +1374,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3657 "parsing/parser.mly" +# 3745 "parsing/parser.mly" ( "+" ) -# 1342 "parsing/parser.ml" +# 1380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1361,9 +1399,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3658 "parsing/parser.mly" +# 3746 "parsing/parser.mly" ( "+." ) -# 1367 "parsing/parser.ml" +# 1405 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1386,9 +1424,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3214 "parsing/parser.mly" +# 3298 "parsing/parser.mly" ( _1 ) -# 1392 "parsing/parser.ml" +# 1430 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1433,24 +1471,24 @@ module Tables = struct let _endpos = _endpos_tyvar_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3217 "parsing/parser.mly" +# 3301 "parsing/parser.mly" ( Ptyp_alias(ty, tyvar) ) -# 1439 "parsing/parser.ml" +# 1477 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_tyvar_, _startpos_ty_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1448 "parsing/parser.ml" +# 1486 "parsing/parser.ml" in -# 3219 "parsing/parser.mly" +# 3303 "parsing/parser.mly" ( _1 ) -# 1454 "parsing/parser.ml" +# 1492 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1487,7 +1525,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let body : (Parsetree.pattern * Parsetree.expression * bool) = Obj.magic body in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -1496,30 +1534,30 @@ module Tables = struct let _v : (let_binding) = let attrs2 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 1502 "parsing/parser.ml" +# 1540 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 1511 "parsing/parser.ml" +# 1549 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2480 "parsing/parser.mly" +# 2554 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in mklb ~loc:_sloc false body attrs ) -# 1523 "parsing/parser.ml" +# 1561 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1542,9 +1580,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3544 "parsing/parser.mly" +# 3629 "parsing/parser.mly" ( _1 ) -# 1548 "parsing/parser.ml" +# 1586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1567,9 +1605,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3545 "parsing/parser.mly" +# 3630 "parsing/parser.mly" ( Lident _1 ) -# 1573 "parsing/parser.ml" +# 1611 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1606,9 +1644,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 3275 "parsing/parser.mly" +# 3359 "parsing/parser.mly" ( _2 ) -# 1612 "parsing/parser.ml" +# 1650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1671,11 +1709,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 1679 "parsing/parser.ml" +# 1717 "parsing/parser.ml" in let _3 = @@ -1683,24 +1721,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 1689 "parsing/parser.ml" +# 1727 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 1695 "parsing/parser.ml" +# 1733 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3277 "parsing/parser.mly" +# 3361 "parsing/parser.mly" ( wrap_typ_attrs ~loc:_sloc (reloc_typ ~loc:_sloc _4) _3 ) -# 1704 "parsing/parser.ml" +# 1742 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1731,24 +1769,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3280 "parsing/parser.mly" +# 3364 "parsing/parser.mly" ( Ptyp_var _2 ) -# 1737 "parsing/parser.ml" +# 1775 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1746 "parsing/parser.ml" +# 1784 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 1752 "parsing/parser.ml" +# 1790 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1772,23 +1810,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3282 "parsing/parser.mly" +# 3366 "parsing/parser.mly" ( Ptyp_any ) -# 1778 "parsing/parser.ml" +# 1816 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1786 "parsing/parser.ml" +# 1824 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 1792 "parsing/parser.ml" +# 1830 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1817,35 +1855,35 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1823 "parsing/parser.ml" +# 1861 "parsing/parser.ml" in let tys = -# 3327 "parsing/parser.mly" +# 3411 "parsing/parser.mly" ( [] ) -# 1829 "parsing/parser.ml" +# 1867 "parsing/parser.ml" in -# 3285 "parsing/parser.mly" +# 3369 "parsing/parser.mly" ( Ptyp_constr(tid, tys) ) -# 1834 "parsing/parser.ml" +# 1872 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1843 "parsing/parser.ml" +# 1881 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 1849 "parsing/parser.ml" +# 1887 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1881,20 +1919,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1887 "parsing/parser.ml" +# 1925 "parsing/parser.ml" in let tys = -# 3329 "parsing/parser.mly" +# 3413 "parsing/parser.mly" ( [ty] ) -# 1893 "parsing/parser.ml" +# 1931 "parsing/parser.ml" in -# 3285 "parsing/parser.mly" +# 3369 "parsing/parser.mly" ( Ptyp_constr(tid, tys) ) -# 1898 "parsing/parser.ml" +# 1936 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -1902,15 +1940,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 1908 "parsing/parser.ml" +# 1946 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 1914 "parsing/parser.ml" +# 1952 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -1961,9 +1999,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 1967 "parsing/parser.ml" +# 2005 "parsing/parser.ml" in let tys = @@ -1971,24 +2009,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 1975 "parsing/parser.ml" +# 2013 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1045 "parsing/parser.mly" ( xs ) -# 1980 "parsing/parser.ml" +# 2018 "parsing/parser.ml" in -# 3331 "parsing/parser.mly" +# 3415 "parsing/parser.mly" ( tys ) -# 1986 "parsing/parser.ml" +# 2024 "parsing/parser.ml" in -# 3285 "parsing/parser.mly" +# 3369 "parsing/parser.mly" ( Ptyp_constr(tid, tys) ) -# 1992 "parsing/parser.ml" +# 2030 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -1996,15 +2034,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2002 "parsing/parser.ml" +# 2040 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2008 "parsing/parser.ml" +# 2046 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2042,24 +2080,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3287 "parsing/parser.mly" +# 3371 "parsing/parser.mly" ( let (f, c) = _2 in Ptyp_object (f, c) ) -# 2048 "parsing/parser.ml" +# 2086 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2057 "parsing/parser.ml" +# 2095 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2063 "parsing/parser.ml" +# 2101 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2090,24 +2128,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3289 "parsing/parser.mly" +# 3373 "parsing/parser.mly" ( Ptyp_object ([], Closed) ) -# 2096 "parsing/parser.ml" +# 2134 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2105 "parsing/parser.ml" +# 2143 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2111 "parsing/parser.ml" +# 2149 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2143,20 +2181,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2149 "parsing/parser.ml" +# 2187 "parsing/parser.ml" in let tys = -# 3327 "parsing/parser.mly" +# 3411 "parsing/parser.mly" ( [] ) -# 2155 "parsing/parser.ml" +# 2193 "parsing/parser.ml" in -# 3293 "parsing/parser.mly" +# 3377 "parsing/parser.mly" ( Ptyp_class(cid, tys) ) -# 2160 "parsing/parser.ml" +# 2198 "parsing/parser.ml" in let _startpos__1_ = _startpos__2_ in @@ -2164,15 +2202,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2170 "parsing/parser.ml" +# 2208 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2176 "parsing/parser.ml" +# 2214 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2215,20 +2253,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2221 "parsing/parser.ml" +# 2259 "parsing/parser.ml" in let tys = -# 3329 "parsing/parser.mly" +# 3413 "parsing/parser.mly" ( [ty] ) -# 2227 "parsing/parser.ml" +# 2265 "parsing/parser.ml" in -# 3293 "parsing/parser.mly" +# 3377 "parsing/parser.mly" ( Ptyp_class(cid, tys) ) -# 2232 "parsing/parser.ml" +# 2270 "parsing/parser.ml" in let _startpos__1_ = _startpos_ty_ in @@ -2236,15 +2274,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2242 "parsing/parser.ml" +# 2280 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2248 "parsing/parser.ml" +# 2286 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2302,9 +2340,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 2308 "parsing/parser.ml" +# 2346 "parsing/parser.ml" in let tys = @@ -2312,24 +2350,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2316 "parsing/parser.ml" +# 2354 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1045 "parsing/parser.mly" ( xs ) -# 2321 "parsing/parser.ml" +# 2359 "parsing/parser.ml" in -# 3331 "parsing/parser.mly" +# 3415 "parsing/parser.mly" ( tys ) -# 2327 "parsing/parser.ml" +# 2365 "parsing/parser.ml" in -# 3293 "parsing/parser.mly" +# 3377 "parsing/parser.mly" ( Ptyp_class(cid, tys) ) -# 2333 "parsing/parser.ml" +# 2371 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -2337,15 +2375,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2343 "parsing/parser.ml" +# 2381 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2349 "parsing/parser.ml" +# 2387 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2383,24 +2421,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3296 "parsing/parser.mly" +# 3380 "parsing/parser.mly" ( Ptyp_variant([_2], Closed, None) ) -# 2389 "parsing/parser.ml" +# 2427 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2398 "parsing/parser.ml" +# 2436 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2404 "parsing/parser.ml" +# 2442 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2450,24 +2488,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2454 "parsing/parser.ml" +# 2492 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 2459 "parsing/parser.ml" +# 2497 "parsing/parser.ml" in -# 3341 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( _1 ) -# 2465 "parsing/parser.ml" +# 2503 "parsing/parser.ml" in -# 3298 "parsing/parser.mly" +# 3382 "parsing/parser.mly" ( Ptyp_variant(_3, Closed, None) ) -# 2471 "parsing/parser.ml" +# 2509 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -2475,15 +2513,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2481 "parsing/parser.ml" +# 2519 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2487 "parsing/parser.ml" +# 2525 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2540,24 +2578,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2544 "parsing/parser.ml" +# 2582 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 2549 "parsing/parser.ml" +# 2587 "parsing/parser.ml" in -# 3341 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( _1 ) -# 2555 "parsing/parser.ml" +# 2593 "parsing/parser.ml" in -# 3300 "parsing/parser.mly" +# 3384 "parsing/parser.mly" ( Ptyp_variant(_2 :: _4, Closed, None) ) -# 2561 "parsing/parser.ml" +# 2599 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -2565,15 +2603,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2571 "parsing/parser.ml" +# 2609 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2577 "parsing/parser.ml" +# 2615 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2623,24 +2661,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2627 "parsing/parser.ml" +# 2665 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 2632 "parsing/parser.ml" +# 2670 "parsing/parser.ml" in -# 3341 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( _1 ) -# 2638 "parsing/parser.ml" +# 2676 "parsing/parser.ml" in -# 3302 "parsing/parser.mly" +# 3386 "parsing/parser.mly" ( Ptyp_variant(_3, Open, None) ) -# 2644 "parsing/parser.ml" +# 2682 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -2648,15 +2686,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2654 "parsing/parser.ml" +# 2692 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2660 "parsing/parser.ml" +# 2698 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2687,24 +2725,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3304 "parsing/parser.mly" +# 3388 "parsing/parser.mly" ( Ptyp_variant([], Open, None) ) -# 2693 "parsing/parser.ml" +# 2731 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2702 "parsing/parser.ml" +# 2740 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2708 "parsing/parser.ml" +# 2746 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2754,24 +2792,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2758 "parsing/parser.ml" +# 2796 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 2763 "parsing/parser.ml" +# 2801 "parsing/parser.ml" in -# 3341 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( _1 ) -# 2769 "parsing/parser.ml" +# 2807 "parsing/parser.ml" in -# 3306 "parsing/parser.mly" +# 3390 "parsing/parser.mly" ( Ptyp_variant(_3, Closed, Some []) ) -# 2775 "parsing/parser.ml" +# 2813 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -2779,15 +2817,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2785 "parsing/parser.ml" +# 2823 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2791 "parsing/parser.ml" +# 2829 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2852,18 +2890,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2856 "parsing/parser.ml" +# 2894 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 985 "parsing/parser.mly" ( xs ) -# 2861 "parsing/parser.ml" +# 2899 "parsing/parser.ml" in -# 3369 "parsing/parser.mly" +# 3453 "parsing/parser.mly" ( _1 ) -# 2867 "parsing/parser.ml" +# 2905 "parsing/parser.ml" in let _3 = @@ -2871,24 +2909,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 2875 "parsing/parser.ml" +# 2913 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 2880 "parsing/parser.ml" +# 2918 "parsing/parser.ml" in -# 3341 "parsing/parser.mly" +# 3425 "parsing/parser.mly" ( _1 ) -# 2886 "parsing/parser.ml" +# 2924 "parsing/parser.ml" in -# 3308 "parsing/parser.mly" +# 3392 "parsing/parser.mly" ( Ptyp_variant(_3, Closed, Some _5) ) -# 2892 "parsing/parser.ml" +# 2930 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -2896,15 +2934,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2902 "parsing/parser.ml" +# 2940 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2908 "parsing/parser.ml" +# 2946 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2928,23 +2966,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 3310 "parsing/parser.mly" +# 3394 "parsing/parser.mly" ( Ptyp_extension _1 ) -# 2934 "parsing/parser.ml" +# 2972 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 2942 "parsing/parser.ml" +# 2980 "parsing/parser.ml" in -# 3312 "parsing/parser.mly" +# 3396 "parsing/parser.mly" ( _1 ) -# 2948 "parsing/parser.ml" +# 2986 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -2968,23 +3006,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (string Asttypes.loc) = let _1 = let _1 = -# 3724 "parsing/parser.mly" +# 3812 "parsing/parser.mly" ( _1 ) -# 2974 "parsing/parser.ml" +# 3012 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 847 "parsing/parser.mly" +# 913 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 2982 "parsing/parser.ml" +# 3020 "parsing/parser.ml" in -# 3726 "parsing/parser.mly" +# 3814 "parsing/parser.mly" ( _1 ) -# 2988 "parsing/parser.ml" +# 3026 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3022,24 +3060,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (string Asttypes.loc) = let _1 = let _1 = -# 3725 "parsing/parser.mly" +# 3813 "parsing/parser.mly" ( _1 ^ "." ^ _3.txt ) -# 3028 "parsing/parser.ml" +# 3066 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 847 "parsing/parser.mly" +# 913 "parsing/parser.mly" ( mkloc _1 (make_loc _sloc) ) -# 3037 "parsing/parser.ml" +# 3075 "parsing/parser.ml" in -# 3726 "parsing/parser.mly" +# 3814 "parsing/parser.mly" ( _1 ) -# 3043 "parsing/parser.ml" +# 3081 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3086,9 +3124,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3730 "parsing/parser.mly" +# 3818 "parsing/parser.mly" ( Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 3092 "parsing/parser.ml" +# 3130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3111,9 +3149,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = -# 1768 "parsing/parser.mly" +# 1858 "parsing/parser.mly" ( _1 ) -# 3117 "parsing/parser.ml" +# 3155 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3152,18 +3190,18 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3158 "parsing/parser.ml" +# 3196 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1770 "parsing/parser.mly" +# 1860 "parsing/parser.mly" ( wrap_class_attrs ~loc:_sloc _3 _2 ) -# 3167 "parsing/parser.ml" +# 3205 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3203,9 +3241,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1772 "parsing/parser.mly" +# 1862 "parsing/parser.mly" ( class_of_let_bindings ~loc:_sloc _1 _3 ) -# 3209 "parsing/parser.ml" +# 3247 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3268,34 +3306,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3274 "parsing/parser.ml" +# 3312 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3283 "parsing/parser.ml" +# 3321 "parsing/parser.ml" in let _3 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 3289 "parsing/parser.ml" +# 3327 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1774 "parsing/parser.mly" +# 1864 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 3299 "parsing/parser.ml" +# 3337 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3365,37 +3403,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 3371 "parsing/parser.ml" +# 3409 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3380 "parsing/parser.ml" +# 3418 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 3388 "parsing/parser.ml" +# 3426 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1774 "parsing/parser.mly" +# 1864 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkclass ~loc:_sloc ~attrs:_4 (Pcl_open(od, _7)) ) -# 3399 "parsing/parser.ml" +# 3437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3425,9 +3463,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1778 "parsing/parser.mly" +# 1868 "parsing/parser.mly" ( Cl.attr _1 _2 ) -# 3431 "parsing/parser.ml" +# 3469 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3462,18 +3500,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 3466 "parsing/parser.ml" +# 3504 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 985 "parsing/parser.mly" ( xs ) -# 3471 "parsing/parser.ml" +# 3509 "parsing/parser.ml" in -# 1781 "parsing/parser.mly" +# 1871 "parsing/parser.mly" ( Pcl_apply(_1, _2) ) -# 3477 "parsing/parser.ml" +# 3515 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -3481,15 +3519,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3487 "parsing/parser.ml" +# 3525 "parsing/parser.ml" in -# 1784 "parsing/parser.mly" +# 1874 "parsing/parser.mly" ( _1 ) -# 3493 "parsing/parser.ml" +# 3531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3513,23 +3551,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1783 "parsing/parser.mly" +# 1873 "parsing/parser.mly" ( Pcl_extension _1 ) -# 3519 "parsing/parser.ml" +# 3557 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 3527 "parsing/parser.ml" +# 3565 "parsing/parser.ml" in -# 1784 "parsing/parser.mly" +# 1874 "parsing/parser.mly" ( _1 ) -# 3533 "parsing/parser.ml" +# 3571 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3582,33 +3620,33 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3588 "parsing/parser.ml" +# 3626 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3597 "parsing/parser.ml" +# 3635 "parsing/parser.ml" in let _2 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 3603 "parsing/parser.ml" +# 3641 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1833 "parsing/parser.mly" +# 1923 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3612 "parsing/parser.ml" +# 3650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3668,36 +3706,36 @@ module Tables = struct let _v : (Parsetree.class_field) = let _6 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3674 "parsing/parser.ml" +# 3712 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _3 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3683 "parsing/parser.ml" +# 3721 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 3691 "parsing/parser.ml" +# 3729 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1833 "parsing/parser.mly" +# 1923 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_inherit (_2, _4, self)) ~attrs:(_3@_6) ~docs ) -# 3701 "parsing/parser.ml" +# 3739 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3738,9 +3776,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3744 "parsing/parser.ml" +# 3782 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3748,11 +3786,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1836 "parsing/parser.mly" +# 1926 "parsing/parser.mly" ( let v, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_val v) ~attrs:(attrs@_3) ~docs ) -# 3756 "parsing/parser.ml" +# 3794 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3793,9 +3831,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _3 = let _1 = _1_inlined1 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3799 "parsing/parser.ml" +# 3837 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -3803,11 +3841,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1840 "parsing/parser.mly" +# 1930 "parsing/parser.mly" ( let meth, attrs = _2 in let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_method meth) ~attrs:(attrs@_3) ~docs ) -# 3811 "parsing/parser.ml" +# 3849 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3853,28 +3891,28 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3859 "parsing/parser.ml" +# 3897 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3868 "parsing/parser.ml" +# 3906 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1844 "parsing/parser.mly" +# 1934 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 3878 "parsing/parser.ml" +# 3916 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3920,28 +3958,28 @@ module Tables = struct let _v : (Parsetree.class_field) = let _4 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3926 "parsing/parser.ml" +# 3964 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 3935 "parsing/parser.ml" +# 3973 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1847 "parsing/parser.mly" +# 1937 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_initializer _3) ~attrs:(_2@_4) ~docs ) -# 3945 "parsing/parser.ml" +# 3983 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -3973,9 +4011,9 @@ module Tables = struct let _v : (Parsetree.class_field) = let _2 = let _1 = _1_inlined1 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 3979 "parsing/parser.ml" +# 4017 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -3983,10 +4021,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1850 "parsing/parser.mly" +# 1940 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkcf ~loc:_sloc (Pcf_extension _1) ~attrs:_2 ~docs ) -# 3990 "parsing/parser.ml" +# 4028 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4010,23 +4048,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_field) = let _1 = let _1 = -# 1853 "parsing/parser.mly" +# 1943 "parsing/parser.mly" ( Pcf_attribute _1 ) -# 4016 "parsing/parser.ml" +# 4054 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 868 "parsing/parser.mly" +# 934 "parsing/parser.mly" ( mkcf ~loc:_sloc _1 ) -# 4024 "parsing/parser.ml" +# 4062 "parsing/parser.ml" in -# 1854 "parsing/parser.mly" +# 1944 "parsing/parser.mly" ( _1 ) -# 4030 "parsing/parser.ml" +# 4068 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4056,9 +4094,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = -# 1748 "parsing/parser.mly" +# 1838 "parsing/parser.mly" ( _2 ) -# 4062 "parsing/parser.ml" +# 4100 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4103,24 +4141,24 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1751 "parsing/parser.mly" +# 1841 "parsing/parser.mly" ( Pcl_constraint(_4, _2) ) -# 4109 "parsing/parser.ml" +# 4147 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4118 "parsing/parser.ml" +# 4156 "parsing/parser.ml" in -# 1754 "parsing/parser.mly" +# 1844 "parsing/parser.mly" ( _1 ) -# 4124 "parsing/parser.ml" +# 4162 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4151,24 +4189,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1753 "parsing/parser.mly" +# 1843 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, _2) ) -# 4157 "parsing/parser.ml" +# 4195 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4166 "parsing/parser.ml" +# 4204 "parsing/parser.ml" in -# 1754 "parsing/parser.mly" +# 1844 "parsing/parser.mly" ( _1 ) -# 4172 "parsing/parser.ml" +# 4210 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4206,24 +4244,24 @@ module Tables = struct let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1809 "parsing/parser.mly" +# 1899 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 4212 "parsing/parser.ml" +# 4250 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4221 "parsing/parser.ml" +# 4259 "parsing/parser.ml" in -# 1810 "parsing/parser.mly" +# 1900 "parsing/parser.mly" ( _1 ) -# 4227 "parsing/parser.ml" +# 4265 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4254,24 +4292,24 @@ module Tables = struct let _endpos = _endpos_e_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1809 "parsing/parser.mly" +# 1899 "parsing/parser.mly" ( let (l,o,p) = _1 in Pcl_fun(l, o, p, e) ) -# 4260 "parsing/parser.ml" +# 4298 "parsing/parser.ml" in let _endpos__1_ = _endpos_e_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 4269 "parsing/parser.ml" +# 4307 "parsing/parser.ml" in -# 1810 "parsing/parser.mly" +# 1900 "parsing/parser.mly" ( _1 ) -# 4275 "parsing/parser.ml" +# 4313 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4294,9 +4332,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3535 "parsing/parser.mly" +# 3619 "parsing/parser.mly" ( _1 ) -# 4300 "parsing/parser.ml" +# 4338 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4336,9 +4374,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1818 "parsing/parser.mly" +# 1908 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 4342 "parsing/parser.ml" +# 4380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4390,24 +4428,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 1820 "parsing/parser.mly" +# 1910 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 4396 "parsing/parser.ml" +# 4434 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 4405 "parsing/parser.ml" +# 4443 "parsing/parser.ml" in -# 1821 "parsing/parser.mly" +# 1911 "parsing/parser.mly" ( _1 ) -# 4411 "parsing/parser.ml" +# 4449 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4426,9 +4464,9 @@ module Tables = struct let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 1823 "parsing/parser.mly" +# 1913 "parsing/parser.mly" ( ghpat ~loc:_sloc Ppat_any ) -# 4432 "parsing/parser.ml" +# 4470 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4465,9 +4503,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type) = -# 1948 "parsing/parser.mly" +# 2038 "parsing/parser.mly" ( _2 ) -# 4471 "parsing/parser.ml" +# 4509 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4484,24 +4522,24 @@ module Tables = struct let _endpos = _startpos in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 1949 "parsing/parser.mly" +# 2039 "parsing/parser.mly" ( Ptyp_any ) -# 4490 "parsing/parser.ml" +# 4528 "parsing/parser.ml" in let _endpos__1_ = _endpos__0_ in let _endpos = _endpos__1_ in let _symbolstartpos = _endpos in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 4499 "parsing/parser.ml" +# 4537 "parsing/parser.ml" in -# 1950 "parsing/parser.mly" +# 2040 "parsing/parser.mly" ( _1 ) -# 4505 "parsing/parser.ml" +# 4543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4547,28 +4585,28 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 4553 "parsing/parser.ml" +# 4591 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 4562 "parsing/parser.ml" +# 4600 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1958 "parsing/parser.mly" +# 2048 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_inherit _3) ~attrs:(_2@_4) ~docs ) -# 4572 "parsing/parser.ml" +# 4610 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4626,9 +4664,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _3 : unit = Obj.magic _3 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 4632 "parsing/parser.ml" +# 4670 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let flags : (Asttypes.mutable_flag * Asttypes.virtual_flag) = Obj.magic flags in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4639,9 +4677,9 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 4645 "parsing/parser.ml" +# 4683 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined3_ in @@ -4649,44 +4687,44 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let label = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 4655 "parsing/parser.ml" +# 4693 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4663 "parsing/parser.ml" +# 4701 "parsing/parser.ml" in -# 1983 "parsing/parser.mly" +# 2073 "parsing/parser.mly" ( let mut, virt = flags in label, mut, virt, ty ) -# 4672 "parsing/parser.ml" +# 4710 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 4680 "parsing/parser.ml" +# 4718 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1961 "parsing/parser.mly" +# 2051 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_val _3) ~attrs:(_2@_4) ~docs ) -# 4690 "parsing/parser.ml" +# 4728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4744,9 +4782,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 4750 "parsing/parser.ml" +# 4788 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag * Asttypes.virtual_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -4757,53 +4795,53 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _7 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 4763 "parsing/parser.ml" +# 4801 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _6 = let _1 = _1_inlined3 in -# 3180 "parsing/parser.mly" +# 3264 "parsing/parser.mly" ( _1 ) -# 4772 "parsing/parser.ml" +# 4810 "parsing/parser.ml" in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 4780 "parsing/parser.ml" +# 4818 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4788 "parsing/parser.ml" +# 4826 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 4796 "parsing/parser.ml" +# 4834 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1965 "parsing/parser.mly" +# 2055 "parsing/parser.mly" ( let (p, v) = _3 in let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_method (_4, p, v, _6)) ~attrs:(_2@_7) ~docs ) -# 4807 "parsing/parser.ml" +# 4845 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4849,28 +4887,28 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _4 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 4855 "parsing/parser.ml" +# 4893 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 4864 "parsing/parser.ml" +# 4902 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1969 "parsing/parser.mly" +# 2059 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_constraint _3) ~attrs:(_2@_4) ~docs ) -# 4874 "parsing/parser.ml" +# 4912 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4902,9 +4940,9 @@ module Tables = struct let _v : (Parsetree.class_type_field) = let _2 = let _1 = _1_inlined1 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 4908 "parsing/parser.ml" +# 4946 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -4912,10 +4950,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1972 "parsing/parser.mly" +# 2062 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mkctf ~loc:_sloc (Pctf_extension _1) ~attrs:_2 ~docs ) -# 4919 "parsing/parser.ml" +# 4957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4939,23 +4977,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type_field) = let _1 = let _1 = -# 1975 "parsing/parser.mly" +# 2065 "parsing/parser.mly" ( Pctf_attribute _1 ) -# 4945 "parsing/parser.ml" +# 4983 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 866 "parsing/parser.mly" +# 932 "parsing/parser.mly" ( mkctf ~loc:_sloc _1 ) -# 4953 "parsing/parser.ml" +# 4991 "parsing/parser.ml" in -# 1976 "parsing/parser.mly" +# 2066 "parsing/parser.mly" ( _1 ) -# 4959 "parsing/parser.ml" +# 4997 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -4984,42 +5022,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 4990 "parsing/parser.ml" +# 5028 "parsing/parser.ml" in let tys = let tys = -# 1934 "parsing/parser.mly" +# 2024 "parsing/parser.mly" ( [] ) -# 4997 "parsing/parser.ml" +# 5035 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2030 "parsing/parser.mly" ( tys ) -# 5002 "parsing/parser.ml" +# 5040 "parsing/parser.ml" in -# 1917 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 5008 "parsing/parser.ml" +# 5046 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5017 "parsing/parser.ml" +# 5055 "parsing/parser.ml" in -# 1920 "parsing/parser.mly" +# 2010 "parsing/parser.mly" ( _1 ) -# 5023 "parsing/parser.ml" +# 5061 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5070,9 +5108,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5076 "parsing/parser.ml" +# 5114 "parsing/parser.ml" in let tys = @@ -5081,30 +5119,30 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 5085 "parsing/parser.ml" +# 5123 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 5090 "parsing/parser.ml" +# 5128 "parsing/parser.ml" in -# 1936 "parsing/parser.mly" +# 2026 "parsing/parser.mly" ( params ) -# 5096 "parsing/parser.ml" +# 5134 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2030 "parsing/parser.mly" ( tys ) -# 5102 "parsing/parser.ml" +# 5140 "parsing/parser.ml" in -# 1917 "parsing/parser.mly" +# 2007 "parsing/parser.mly" ( Pcty_constr (cid, tys) ) -# 5108 "parsing/parser.ml" +# 5146 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -5112,15 +5150,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5118 "parsing/parser.ml" +# 5156 "parsing/parser.ml" in -# 1920 "parsing/parser.mly" +# 2010 "parsing/parser.mly" ( _1 ) -# 5124 "parsing/parser.ml" +# 5162 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5144,23 +5182,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = let _1 = let _1 = -# 1919 "parsing/parser.mly" +# 2009 "parsing/parser.mly" ( Pcty_extension _1 ) -# 5150 "parsing/parser.ml" +# 5188 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 5158 "parsing/parser.ml" +# 5196 "parsing/parser.ml" in -# 1920 "parsing/parser.mly" +# 2010 "parsing/parser.mly" ( _1 ) -# 5164 "parsing/parser.ml" +# 5202 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5217,44 +5255,44 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5221 "parsing/parser.ml" +# 5259 "parsing/parser.ml" in -# 1954 "parsing/parser.mly" +# 2044 "parsing/parser.mly" ( _1 ) -# 5226 "parsing/parser.ml" +# 5264 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 812 "parsing/parser.mly" +# 878 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 5235 "parsing/parser.ml" +# 5273 "parsing/parser.ml" in -# 1944 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 5241 "parsing/parser.ml" +# 5279 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 5249 "parsing/parser.ml" +# 5287 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1922 "parsing/parser.mly" +# 2012 "parsing/parser.mly" ( mkcty ~loc:_sloc ~attrs:_2 (Pcty_signature _3) ) -# 5258 "parsing/parser.ml" +# 5296 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5311,43 +5349,43 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5315 "parsing/parser.ml" +# 5353 "parsing/parser.ml" in -# 1954 "parsing/parser.mly" +# 2044 "parsing/parser.mly" ( _1 ) -# 5320 "parsing/parser.ml" +# 5358 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 812 "parsing/parser.mly" +# 878 "parsing/parser.mly" ( extra_csig _startpos _endpos _1 ) -# 5329 "parsing/parser.ml" +# 5367 "parsing/parser.ml" in -# 1944 "parsing/parser.mly" +# 2034 "parsing/parser.mly" ( Csig.mk _1 _2 ) -# 5335 "parsing/parser.ml" +# 5373 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 5343 "parsing/parser.ml" +# 5381 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1924 "parsing/parser.mly" +# 2014 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 5351 "parsing/parser.ml" +# 5389 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5377,9 +5415,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.class_type) = -# 1926 "parsing/parser.mly" +# 2016 "parsing/parser.mly" ( Cty.attr _1 _2 ) -# 5383 "parsing/parser.ml" +# 5421 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5442,34 +5480,34 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5448 "parsing/parser.ml" +# 5486 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in let _4 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 5457 "parsing/parser.ml" +# 5495 "parsing/parser.ml" in let _3 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 5463 "parsing/parser.ml" +# 5501 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1928 "parsing/parser.mly" +# 2018 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 5473 "parsing/parser.ml" +# 5511 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5539,37 +5577,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5545 "parsing/parser.ml" +# 5583 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 5554 "parsing/parser.ml" +# 5592 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 5562 "parsing/parser.ml" +# 5600 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1928 "parsing/parser.mly" +# 2018 "parsing/parser.mly" ( let loc = (_startpos__2_, _endpos__5_) in let od = Opn.mk ~override:_3 ~loc:(make_loc loc) _5 in mkcty ~loc:_sloc ~attrs:_4 (Pcty_open(od, _7)) ) -# 5573 "parsing/parser.ml" +# 5611 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5606,9 +5644,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.class_expr) = -# 1788 "parsing/parser.mly" +# 1878 "parsing/parser.mly" ( _2 ) -# 5612 "parsing/parser.ml" +# 5650 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5647,9 +5685,9 @@ module Tables = struct let _v : (Parsetree.class_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1790 "parsing/parser.mly" +# 1880 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 5653 "parsing/parser.ml" +# 5691 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5678,42 +5716,42 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5684 "parsing/parser.ml" +# 5722 "parsing/parser.ml" in let tys = let tys = -# 1934 "parsing/parser.mly" +# 2024 "parsing/parser.mly" ( [] ) -# 5691 "parsing/parser.ml" +# 5729 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2030 "parsing/parser.mly" ( tys ) -# 5696 "parsing/parser.ml" +# 5734 "parsing/parser.ml" in -# 1793 "parsing/parser.mly" +# 1883 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5702 "parsing/parser.ml" +# 5740 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5711 "parsing/parser.ml" +# 5749 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 5717 "parsing/parser.ml" +# 5755 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5764,9 +5802,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 5770 "parsing/parser.ml" +# 5808 "parsing/parser.ml" in let tys = @@ -5775,30 +5813,30 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 5779 "parsing/parser.ml" +# 5817 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 5784 "parsing/parser.ml" +# 5822 "parsing/parser.ml" in -# 1936 "parsing/parser.mly" +# 2026 "parsing/parser.mly" ( params ) -# 5790 "parsing/parser.ml" +# 5828 "parsing/parser.ml" in -# 1940 "parsing/parser.mly" +# 2030 "parsing/parser.mly" ( tys ) -# 5796 "parsing/parser.ml" +# 5834 "parsing/parser.ml" in -# 1793 "parsing/parser.mly" +# 1883 "parsing/parser.mly" ( Pcl_constr(cid, tys) ) -# 5802 "parsing/parser.ml" +# 5840 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -5806,15 +5844,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5812 "parsing/parser.ml" +# 5850 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 5818 "parsing/parser.ml" +# 5856 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5873,43 +5911,43 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 5877 "parsing/parser.ml" +# 5915 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1917 "parsing/parser.mly" ( _1 ) -# 5882 "parsing/parser.ml" +# 5920 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 877 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 5891 "parsing/parser.ml" +# 5929 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1904 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 5897 "parsing/parser.ml" +# 5935 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 5905 "parsing/parser.ml" +# 5943 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1795 "parsing/parser.mly" +# 1885 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 5913 "parsing/parser.ml" +# 5951 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -5917,15 +5955,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5923 "parsing/parser.ml" +# 5961 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 5929 "parsing/parser.ml" +# 5967 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -5977,24 +6015,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.class_expr) = let _1 = let _1 = -# 1797 "parsing/parser.mly" +# 1887 "parsing/parser.mly" ( Pcl_constraint(_2, _4) ) -# 5983 "parsing/parser.ml" +# 6021 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 5992 "parsing/parser.ml" +# 6030 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 5998 "parsing/parser.ml" +# 6036 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6049,9 +6087,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1799 "parsing/parser.mly" +# 1889 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 6055 "parsing/parser.ml" +# 6093 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -6059,15 +6097,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 870 "parsing/parser.mly" +# 936 "parsing/parser.mly" ( mkclass ~loc:_sloc _1 ) -# 6065 "parsing/parser.ml" +# 6103 "parsing/parser.ml" in -# 1800 "parsing/parser.mly" +# 1890 "parsing/parser.mly" ( _1 ) -# 6071 "parsing/parser.ml" +# 6109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6124,44 +6162,44 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 6128 "parsing/parser.ml" +# 6166 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1917 "parsing/parser.mly" ( _1 ) -# 6133 "parsing/parser.ml" +# 6171 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 877 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 6142 "parsing/parser.ml" +# 6180 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1904 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 6148 "parsing/parser.ml" +# 6186 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 6156 "parsing/parser.ml" +# 6194 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1802 "parsing/parser.mly" +# 1892 "parsing/parser.mly" ( mkclass ~loc:_sloc ~attrs:_2 (Pcl_structure _3) ) -# 6165 "parsing/parser.ml" +# 6203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6184,9 +6222,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.class_type) = -# 1905 "parsing/parser.mly" +# 1995 "parsing/parser.mly" ( _1 ) -# 6190 "parsing/parser.ml" +# 6228 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6232,14 +6270,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3243 "parsing/parser.mly" +# 3327 "parsing/parser.mly" ( Optional label ) -# 6238 "parsing/parser.ml" +# 6276 "parsing/parser.ml" in -# 1911 "parsing/parser.mly" +# 2001 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 6243 "parsing/parser.ml" +# 6281 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -6247,15 +6285,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6253 "parsing/parser.ml" +# 6291 "parsing/parser.ml" in -# 1912 "parsing/parser.mly" +# 2002 "parsing/parser.mly" ( _1 ) -# 6259 "parsing/parser.ml" +# 6297 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6302,9 +6340,9 @@ module Tables = struct let domain : (Parsetree.core_type) = Obj.magic domain in let _2 : unit = Obj.magic _2 in let label : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 6308 "parsing/parser.ml" +# 6346 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -6312,14 +6350,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3245 "parsing/parser.mly" +# 3329 "parsing/parser.mly" ( Labelled label ) -# 6318 "parsing/parser.ml" +# 6356 "parsing/parser.ml" in -# 1911 "parsing/parser.mly" +# 2001 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 6323 "parsing/parser.ml" +# 6361 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -6327,15 +6365,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6333 "parsing/parser.ml" +# 6371 "parsing/parser.ml" in -# 1912 "parsing/parser.mly" +# 2002 "parsing/parser.mly" ( _1 ) -# 6339 "parsing/parser.ml" +# 6377 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6374,14 +6412,14 @@ module Tables = struct let _v : (Parsetree.class_type) = let _1 = let _1 = let label = -# 3247 "parsing/parser.mly" +# 3331 "parsing/parser.mly" ( Nolabel ) -# 6380 "parsing/parser.ml" +# 6418 "parsing/parser.ml" in -# 1911 "parsing/parser.mly" +# 2001 "parsing/parser.mly" ( Pcty_arrow(label, domain, codomain) ) -# 6385 "parsing/parser.ml" +# 6423 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_domain_) in @@ -6389,15 +6427,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 864 "parsing/parser.mly" +# 930 "parsing/parser.mly" ( mkcty ~loc:_sloc _1 ) -# 6395 "parsing/parser.ml" +# 6433 "parsing/parser.ml" in -# 1912 "parsing/parser.mly" +# 2002 "parsing/parser.mly" ( _1 ) -# 6401 "parsing/parser.ml" +# 6439 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6480,9 +6518,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _8 : unit = Obj.magic _8 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 6486 "parsing/parser.ml" +# 6524 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -6498,9 +6536,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 6504 "parsing/parser.ml" +# 6542 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -6510,24 +6548,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 6516 "parsing/parser.ml" +# 6554 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 6524 "parsing/parser.ml" +# 6562 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2050 "parsing/parser.mly" +# 2140 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -6535,19 +6573,19 @@ module Tables = struct ext, Ci.mk id csig ~virt ~params ~attrs ~loc ~docs ) -# 6539 "parsing/parser.ml" +# 6577 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 6545 "parsing/parser.ml" +# 6583 "parsing/parser.ml" in -# 2038 "parsing/parser.mly" +# 2128 "parsing/parser.mly" ( _1 ) -# 6551 "parsing/parser.ml" +# 6589 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6570,9 +6608,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3532 "parsing/parser.mly" +# 3616 "parsing/parser.mly" ( _1 ) -# 6576 "parsing/parser.ml" +# 6614 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6591,17 +6629,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 637 "parsing/parser.mly" +# 691 "parsing/parser.mly" (string * char option) -# 6597 "parsing/parser.ml" +# 6635 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3415 "parsing/parser.mly" +# 3499 "parsing/parser.mly" ( let (n, m) = _1 in Pconst_integer (n, m) ) -# 6605 "parsing/parser.ml" +# 6643 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6620,17 +6658,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 596 "parsing/parser.mly" +# 650 "parsing/parser.mly" (char) -# 6626 "parsing/parser.ml" +# 6664 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3416 "parsing/parser.mly" +# 3500 "parsing/parser.mly" ( Pconst_char _1 ) -# 6634 "parsing/parser.ml" +# 6672 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6649,17 +6687,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 689 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * Location.t * string option) -# 6655 "parsing/parser.ml" +# 6693 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3417 "parsing/parser.mly" +# 3501 "parsing/parser.mly" ( let (s, strloc, d) = _1 in Pconst_string (s, strloc, d) ) -# 6663 "parsing/parser.ml" +# 6701 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6678,17 +6716,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 616 "parsing/parser.mly" +# 670 "parsing/parser.mly" (string * char option) -# 6684 "parsing/parser.ml" +# 6722 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3418 "parsing/parser.mly" +# 3502 "parsing/parser.mly" ( let (f, m) = _1 in Pconst_float (f, m) ) -# 6692 "parsing/parser.ml" +# 6730 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6718,9 +6756,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3489 "parsing/parser.mly" +# 3573 "parsing/parser.mly" ( "[]" ) -# 6724 "parsing/parser.ml" +# 6762 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6750,9 +6788,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3490 "parsing/parser.mly" +# 3574 "parsing/parser.mly" ( "()" ) -# 6756 "parsing/parser.ml" +# 6794 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6775,9 +6813,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3491 "parsing/parser.mly" +# 3575 "parsing/parser.mly" ( "false" ) -# 6781 "parsing/parser.ml" +# 6819 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6800,9 +6838,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3492 "parsing/parser.mly" +# 3576 "parsing/parser.mly" ( "true" ) -# 6806 "parsing/parser.ml" +# 6844 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6821,17 +6859,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 6827 "parsing/parser.ml" +# 6865 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3495 "parsing/parser.mly" +# 3579 "parsing/parser.mly" ( _1 ) -# 6835 "parsing/parser.ml" +# 6873 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6868,14 +6906,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = let _1 = -# 3486 "parsing/parser.mly" +# 3570 "parsing/parser.mly" ( "::" ) -# 6874 "parsing/parser.ml" +# 6912 "parsing/parser.ml" in -# 3496 "parsing/parser.mly" +# 3580 "parsing/parser.mly" ( _1 ) -# 6879 "parsing/parser.ml" +# 6917 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6898,9 +6936,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3497 "parsing/parser.mly" +# 3581 "parsing/parser.mly" ( _1 ) -# 6904 "parsing/parser.ml" +# 6942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6923,9 +6961,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3500 "parsing/parser.mly" +# 3584 "parsing/parser.mly" ( _1 ) -# 6929 "parsing/parser.ml" +# 6967 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -6978,15 +7016,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let (_2, _1) = (_2_inlined1, _1_inlined1) in -# 3486 "parsing/parser.mly" +# 3570 "parsing/parser.mly" ( "::" ) -# 6984 "parsing/parser.ml" +# 7022 "parsing/parser.ml" in -# 3501 "parsing/parser.mly" +# 3585 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 6990 "parsing/parser.ml" +# 7028 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7023,14 +7061,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = -# 3486 "parsing/parser.mly" +# 3570 "parsing/parser.mly" ( "::" ) -# 7029 "parsing/parser.ml" +# 7067 "parsing/parser.ml" in -# 3502 "parsing/parser.mly" +# 3586 "parsing/parser.mly" ( Lident _1 ) -# 7034 "parsing/parser.ml" +# 7072 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7053,9 +7091,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3503 "parsing/parser.mly" +# 3587 "parsing/parser.mly" ( Lident _1 ) -# 7059 "parsing/parser.ml" +# 7097 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7092,9 +7130,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.core_type * Parsetree.core_type) = -# 1994 "parsing/parser.mly" +# 2084 "parsing/parser.mly" ( _1, _3 ) -# 7098 "parsing/parser.ml" +# 7136 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7119,26 +7157,26 @@ module Tables = struct let _v : (Parsetree.constructor_arguments) = let tys = let xs = let xs = -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 7125 "parsing/parser.ml" +# 7163 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 7130 "parsing/parser.ml" +# 7168 "parsing/parser.ml" in -# 955 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( xs ) -# 7136 "parsing/parser.ml" +# 7174 "parsing/parser.ml" in -# 3050 "parsing/parser.mly" +# 3130 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 7142 "parsing/parser.ml" +# 7180 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7177,26 +7215,26 @@ module Tables = struct let _v : (Parsetree.constructor_arguments) = let tys = let xs = let xs = -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 7183 "parsing/parser.ml" +# 7221 "parsing/parser.ml" in # 253 "" ( List.rev xs ) -# 7188 "parsing/parser.ml" +# 7226 "parsing/parser.ml" in -# 955 "parsing/parser.mly" +# 1021 "parsing/parser.mly" ( xs ) -# 7194 "parsing/parser.ml" +# 7232 "parsing/parser.ml" in -# 3050 "parsing/parser.mly" +# 3130 "parsing/parser.mly" ( Pcstr_tuple tys ) -# 7200 "parsing/parser.ml" +# 7238 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7233,9 +7271,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.constructor_arguments) = -# 3052 "parsing/parser.mly" +# 3132 "parsing/parser.mly" ( Pcstr_record _2 ) -# 7239 "parsing/parser.ml" +# 7277 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7258,9 +7296,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constructor_declaration list) = -# 2971 "parsing/parser.mly" +# 3051 "parsing/parser.mly" ( [] ) -# 7264 "parsing/parser.ml" +# 7302 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7283,14 +7321,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.constructor_declaration list) = let cs = -# 1040 "parsing/parser.mly" +# 1106 "parsing/parser.mly" ( List.rev xs ) -# 7289 "parsing/parser.ml" +# 7327 "parsing/parser.ml" in -# 2973 "parsing/parser.mly" +# 3053 "parsing/parser.mly" ( cs ) -# 7294 "parsing/parser.ml" +# 7332 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7313,14 +7351,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 7319 "parsing/parser.ml" +# 7357 "parsing/parser.ml" in -# 3195 "parsing/parser.mly" +# 3279 "parsing/parser.mly" ( _1 ) -# 7324 "parsing/parser.ml" +# 7362 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7350,9 +7388,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type) = -# 3197 "parsing/parser.mly" +# 3281 "parsing/parser.mly" ( Typ.attr _1 _2 ) -# 7356 "parsing/parser.ml" +# 7394 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7375,9 +7413,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3594 "parsing/parser.mly" +# 3682 "parsing/parser.mly" ( Upto ) -# 7381 "parsing/parser.ml" +# 7419 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7400,9 +7438,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.direction_flag) = -# 3595 "parsing/parser.mly" +# 3683 "parsing/parser.mly" ( Downto ) -# 7406 "parsing/parser.ml" +# 7444 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7425,9 +7463,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2141 "parsing/parser.mly" +# 2251 "parsing/parser.mly" ( _1 ) -# 7431 "parsing/parser.ml" +# 7469 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7505,9 +7543,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7511 "parsing/parser.ml" +# 7549 "parsing/parser.ml" in let _3 = @@ -7515,21 +7553,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 7521 "parsing/parser.ml" +# 7559 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 7527 "parsing/parser.ml" +# 7565 "parsing/parser.ml" in -# 2189 "parsing/parser.mly" +# 2284 "parsing/parser.mly" ( Pexp_letmodule(_4, _5, _7), _3 ) -# 7533 "parsing/parser.ml" +# 7571 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -7537,10 +7575,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 7544 "parsing/parser.ml" +# 7582 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7624,9 +7662,9 @@ module Tables = struct let _3 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 7630 "parsing/parser.ml" +# 7668 "parsing/parser.ml" in let _endpos__3_ = _endpos__1_inlined1_ in @@ -7635,19 +7673,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 7641 "parsing/parser.ml" +# 7679 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3035 "parsing/parser.mly" +# 3115 "parsing/parser.mly" ( let args, res = _2 in Te.decl _1 ~args ?res ~attrs:_3 ~loc:(make_loc _sloc) ) -# 7651 "parsing/parser.ml" +# 7689 "parsing/parser.ml" in let _3 = @@ -7655,21 +7693,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 7661 "parsing/parser.ml" +# 7699 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 7667 "parsing/parser.ml" +# 7705 "parsing/parser.ml" in -# 2191 "parsing/parser.mly" +# 2286 "parsing/parser.mly" ( Pexp_letexception(_4, _6), _3 ) -# 7673 "parsing/parser.ml" +# 7711 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -7677,10 +7715,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 7684 "parsing/parser.ml" +# 7722 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7750,28 +7788,28 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 7756 "parsing/parser.ml" +# 7794 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 7762 "parsing/parser.ml" +# 7800 "parsing/parser.ml" in let _3 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 7768 "parsing/parser.ml" +# 7806 "parsing/parser.ml" in -# 2193 "parsing/parser.mly" +# 2288 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 7775 "parsing/parser.ml" +# 7813 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -7779,10 +7817,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 7786 "parsing/parser.ml" +# 7824 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7859,31 +7897,31 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 7865 "parsing/parser.ml" +# 7903 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 7871 "parsing/parser.ml" +# 7909 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 7879 "parsing/parser.ml" +# 7917 "parsing/parser.ml" in -# 2193 "parsing/parser.mly" +# 2288 "parsing/parser.mly" ( let open_loc = make_loc (_startpos__2_, _endpos__5_) in let od = Opn.mk _5 ~override:_3 ~loc:open_loc in Pexp_open(od, _7), _4 ) -# 7887 "parsing/parser.ml" +# 7925 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -7891,10 +7929,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 7898 "parsing/parser.ml" +# 7936 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -7943,18 +7981,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 7947 "parsing/parser.ml" +# 7985 "parsing/parser.ml" in -# 1012 "parsing/parser.mly" +# 1078 "parsing/parser.mly" ( xs ) -# 7952 "parsing/parser.ml" +# 7990 "parsing/parser.ml" in -# 2521 "parsing/parser.mly" +# 2598 "parsing/parser.mly" ( xs ) -# 7958 "parsing/parser.ml" +# 7996 "parsing/parser.ml" in let _2 = @@ -7962,21 +8000,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 7968 "parsing/parser.ml" +# 8006 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 7974 "parsing/parser.ml" +# 8012 "parsing/parser.ml" in -# 2197 "parsing/parser.mly" +# 2292 "parsing/parser.mly" ( Pexp_function _3, _2 ) -# 7980 "parsing/parser.ml" +# 8018 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -7984,10 +8022,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 7991 "parsing/parser.ml" +# 8029 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8043,22 +8081,22 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8049 "parsing/parser.ml" +# 8087 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8055 "parsing/parser.ml" +# 8093 "parsing/parser.ml" in -# 2199 "parsing/parser.mly" +# 2294 "parsing/parser.mly" ( let (l,o,p) = _3 in Pexp_fun(l, o, p, _4), _2 ) -# 8062 "parsing/parser.ml" +# 8100 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -8066,10 +8104,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8073 "parsing/parser.ml" +# 8111 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8142,33 +8180,33 @@ module Tables = struct let _endpos = _endpos__7_ in let _v : (Parsetree.expression) = let _1 = let _5 = -# 2416 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( xs ) -# 8148 "parsing/parser.ml" +# 8186 "parsing/parser.ml" in let _2 = let (_1_inlined1, _1) = (_1_inlined2, _1_inlined1) in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8157 "parsing/parser.ml" +# 8195 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8163 "parsing/parser.ml" +# 8201 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2202 "parsing/parser.mly" +# 2297 "parsing/parser.mly" ( (mk_newtypes ~loc:_sloc _5 _7).pexp_desc, _2 ) -# 8172 "parsing/parser.ml" +# 8210 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8176,10 +8214,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8183 "parsing/parser.ml" +# 8221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8242,18 +8280,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8246 "parsing/parser.ml" +# 8284 "parsing/parser.ml" in -# 1012 "parsing/parser.mly" +# 1078 "parsing/parser.mly" ( xs ) -# 8251 "parsing/parser.ml" +# 8289 "parsing/parser.ml" in -# 2521 "parsing/parser.mly" +# 2598 "parsing/parser.mly" ( xs ) -# 8257 "parsing/parser.ml" +# 8295 "parsing/parser.ml" in let _2 = @@ -8261,21 +8299,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8267 "parsing/parser.ml" +# 8305 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8273 "parsing/parser.ml" +# 8311 "parsing/parser.ml" in -# 2204 "parsing/parser.mly" +# 2299 "parsing/parser.mly" ( Pexp_match(_3, _5), _2 ) -# 8279 "parsing/parser.ml" +# 8317 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8283,10 +8321,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8290 "parsing/parser.ml" +# 8328 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8349,18 +8387,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 8353 "parsing/parser.ml" +# 8391 "parsing/parser.ml" in -# 1012 "parsing/parser.mly" +# 1078 "parsing/parser.mly" ( xs ) -# 8358 "parsing/parser.ml" +# 8396 "parsing/parser.ml" in -# 2521 "parsing/parser.mly" +# 2598 "parsing/parser.mly" ( xs ) -# 8364 "parsing/parser.ml" +# 8402 "parsing/parser.ml" in let _2 = @@ -8368,21 +8406,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8374 "parsing/parser.ml" +# 8412 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8380 "parsing/parser.ml" +# 8418 "parsing/parser.ml" in -# 2206 "parsing/parser.mly" +# 2301 "parsing/parser.mly" ( Pexp_try(_3, _5), _2 ) -# 8386 "parsing/parser.ml" +# 8424 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -8390,10 +8428,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8397 "parsing/parser.ml" +# 8435 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8456,21 +8494,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8462 "parsing/parser.ml" +# 8500 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8468 "parsing/parser.ml" +# 8506 "parsing/parser.ml" in -# 2208 "parsing/parser.mly" +# 2303 "parsing/parser.mly" ( syntax_error() ) -# 8474 "parsing/parser.ml" +# 8512 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -8478,10 +8516,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8485 "parsing/parser.ml" +# 8523 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8558,21 +8596,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8564 "parsing/parser.ml" +# 8602 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8570 "parsing/parser.ml" +# 8608 "parsing/parser.ml" in -# 2210 "parsing/parser.mly" +# 2305 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, Some _7), _2 ) -# 8576 "parsing/parser.ml" +# 8614 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -8580,10 +8618,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8587 "parsing/parser.ml" +# 8625 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8646,21 +8684,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8652 "parsing/parser.ml" +# 8690 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8658 "parsing/parser.ml" +# 8696 "parsing/parser.ml" in -# 2212 "parsing/parser.mly" +# 2307 "parsing/parser.mly" ( Pexp_ifthenelse(_3, _5, None), _2 ) -# 8664 "parsing/parser.ml" +# 8702 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -8668,10 +8706,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8675 "parsing/parser.ml" +# 8713 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8741,21 +8779,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8747 "parsing/parser.ml" +# 8785 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8753 "parsing/parser.ml" +# 8791 "parsing/parser.ml" in -# 2214 "parsing/parser.mly" +# 2309 "parsing/parser.mly" ( Pexp_while(_3, _5), _2 ) -# 8759 "parsing/parser.ml" +# 8797 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -8763,10 +8801,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8770 "parsing/parser.ml" +# 8808 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8864,21 +8902,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8870 "parsing/parser.ml" +# 8908 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8876 "parsing/parser.ml" +# 8914 "parsing/parser.ml" in -# 2217 "parsing/parser.mly" +# 2312 "parsing/parser.mly" ( Pexp_for(_3, _5, _7, _6, _9), _2 ) -# 8882 "parsing/parser.ml" +# 8920 "parsing/parser.ml" in let _endpos__1_ = _endpos__10_ in @@ -8886,10 +8924,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8893 "parsing/parser.ml" +# 8931 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -8938,21 +8976,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 8944 "parsing/parser.ml" +# 8982 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 8950 "parsing/parser.ml" +# 8988 "parsing/parser.ml" in -# 2219 "parsing/parser.mly" +# 2314 "parsing/parser.mly" ( Pexp_assert _3, _2 ) -# 8956 "parsing/parser.ml" +# 8994 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -8960,10 +8998,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 8967 "parsing/parser.ml" +# 9005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9012,21 +9050,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 9018 "parsing/parser.ml" +# 9056 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 9024 "parsing/parser.ml" +# 9062 "parsing/parser.ml" in -# 2221 "parsing/parser.mly" +# 2316 "parsing/parser.mly" ( Pexp_lazy _3, _2 ) -# 9030 "parsing/parser.ml" +# 9068 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -9034,10 +9072,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9041 "parsing/parser.ml" +# 9079 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9102,27 +9140,27 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 9106 "parsing/parser.ml" +# 9144 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1917 "parsing/parser.mly" ( _1 ) -# 9111 "parsing/parser.ml" +# 9149 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 877 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 9120 "parsing/parser.ml" +# 9158 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1904 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 9126 "parsing/parser.ml" +# 9164 "parsing/parser.ml" in let _2 = @@ -9130,21 +9168,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 9136 "parsing/parser.ml" +# 9174 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 9142 "parsing/parser.ml" +# 9180 "parsing/parser.ml" in -# 2223 "parsing/parser.mly" +# 2318 "parsing/parser.mly" ( Pexp_object _3, _2 ) -# 9148 "parsing/parser.ml" +# 9186 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -9152,10 +9190,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9159 "parsing/parser.ml" +# 9197 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9220,27 +9258,27 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 9224 "parsing/parser.ml" +# 9262 "parsing/parser.ml" in -# 1827 "parsing/parser.mly" +# 1917 "parsing/parser.mly" ( _1 ) -# 9229 "parsing/parser.ml" +# 9267 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 811 "parsing/parser.mly" +# 877 "parsing/parser.mly" ( extra_cstr _startpos _endpos _1 ) -# 9238 "parsing/parser.ml" +# 9276 "parsing/parser.ml" in -# 1814 "parsing/parser.mly" +# 1904 "parsing/parser.mly" ( Cstr.mk _1 _2 ) -# 9244 "parsing/parser.ml" +# 9282 "parsing/parser.ml" in let _2 = @@ -9248,23 +9286,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 9254 "parsing/parser.ml" +# 9292 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 9260 "parsing/parser.ml" +# 9298 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2225 "parsing/parser.mly" +# 2320 "parsing/parser.mly" ( unclosed "object" _loc__1_ "end" _loc__4_ ) -# 9268 "parsing/parser.ml" +# 9306 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -9272,10 +9310,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2143 "parsing/parser.mly" +# 2253 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 9279 "parsing/parser.ml" +# 9317 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9310,18 +9348,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9314 "parsing/parser.ml" +# 9352 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 985 "parsing/parser.mly" ( xs ) -# 9319 "parsing/parser.ml" +# 9357 "parsing/parser.ml" in -# 2229 "parsing/parser.mly" +# 2324 "parsing/parser.mly" ( Pexp_apply(_1, _2) ) -# 9325 "parsing/parser.ml" +# 9363 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -9329,15 +9367,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9335 "parsing/parser.ml" +# 9373 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9341 "parsing/parser.ml" +# 9379 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9366,24 +9404,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 9370 "parsing/parser.ml" +# 9408 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1045 "parsing/parser.mly" ( xs ) -# 9375 "parsing/parser.ml" +# 9413 "parsing/parser.ml" in -# 2548 "parsing/parser.mly" +# 2625 "parsing/parser.mly" ( es ) -# 9381 "parsing/parser.ml" +# 9419 "parsing/parser.ml" in -# 2231 "parsing/parser.mly" +# 2326 "parsing/parser.mly" ( Pexp_tuple(_1) ) -# 9387 "parsing/parser.ml" +# 9425 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -9391,15 +9429,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9397 "parsing/parser.ml" +# 9435 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9403 "parsing/parser.ml" +# 9441 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9435,15 +9473,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 9441 "parsing/parser.ml" +# 9479 "parsing/parser.ml" in -# 2233 "parsing/parser.mly" +# 2328 "parsing/parser.mly" ( Pexp_construct(_1, Some _2) ) -# 9447 "parsing/parser.ml" +# 9485 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -9451,15 +9489,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9457 "parsing/parser.ml" +# 9495 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9463 "parsing/parser.ml" +# 9501 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9490,24 +9528,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2235 "parsing/parser.mly" +# 2330 "parsing/parser.mly" ( Pexp_variant(_1, Some _2) ) -# 9496 "parsing/parser.ml" +# 9534 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9505 "parsing/parser.ml" +# 9543 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9511 "parsing/parser.ml" +# 9549 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9539,9 +9577,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 627 "parsing/parser.mly" +# 681 "parsing/parser.mly" (string) -# 9545 "parsing/parser.ml" +# 9583 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -9551,24 +9589,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3459 "parsing/parser.mly" +# 3543 "parsing/parser.mly" ( op ) -# 9557 "parsing/parser.ml" +# 9595 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 9566 "parsing/parser.ml" +# 9604 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 9572 "parsing/parser.ml" +# 9610 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -9576,15 +9614,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9582 "parsing/parser.ml" +# 9620 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9588 "parsing/parser.ml" +# 9626 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9616,9 +9654,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 628 "parsing/parser.mly" +# 682 "parsing/parser.mly" (string) -# 9622 "parsing/parser.ml" +# 9660 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -9628,24 +9666,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3460 "parsing/parser.mly" +# 3544 "parsing/parser.mly" ( op ) -# 9634 "parsing/parser.ml" +# 9672 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 9643 "parsing/parser.ml" +# 9681 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 9649 "parsing/parser.ml" +# 9687 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -9653,15 +9691,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9659 "parsing/parser.ml" +# 9697 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9665 "parsing/parser.ml" +# 9703 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9693,9 +9731,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 629 "parsing/parser.mly" +# 683 "parsing/parser.mly" (string) -# 9699 "parsing/parser.ml" +# 9737 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -9705,24 +9743,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3461 "parsing/parser.mly" +# 3545 "parsing/parser.mly" ( op ) -# 9711 "parsing/parser.ml" +# 9749 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 9720 "parsing/parser.ml" +# 9758 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 9726 "parsing/parser.ml" +# 9764 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -9730,15 +9768,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9736 "parsing/parser.ml" +# 9774 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9742 "parsing/parser.ml" +# 9780 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9770,9 +9808,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 630 "parsing/parser.mly" +# 684 "parsing/parser.mly" (string) -# 9776 "parsing/parser.ml" +# 9814 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -9782,24 +9820,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3462 "parsing/parser.mly" +# 3546 "parsing/parser.mly" ( op ) -# 9788 "parsing/parser.ml" +# 9826 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 9797 "parsing/parser.ml" +# 9835 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 9803 "parsing/parser.ml" +# 9841 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -9807,15 +9845,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9813 "parsing/parser.ml" +# 9851 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9819 "parsing/parser.ml" +# 9857 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9847,9 +9885,9 @@ module Tables = struct } = _menhir_stack in let e2 : (Parsetree.expression) = Obj.magic e2 in let op : ( -# 631 "parsing/parser.mly" +# 685 "parsing/parser.mly" (string) -# 9853 "parsing/parser.ml" +# 9891 "parsing/parser.ml" ) = Obj.magic op in let e1 : (Parsetree.expression) = Obj.magic e1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -9859,24 +9897,24 @@ module Tables = struct let _1 = let op = let _1 = -# 3463 "parsing/parser.mly" +# 3547 "parsing/parser.mly" ( op ) -# 9865 "parsing/parser.ml" +# 9903 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_op_, _startpos_op_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 9874 "parsing/parser.ml" +# 9912 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 9880 "parsing/parser.ml" +# 9918 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -9884,15 +9922,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9890 "parsing/parser.ml" +# 9928 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9896 "parsing/parser.ml" +# 9934 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -9932,23 +9970,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3464 "parsing/parser.mly" +# 3548 "parsing/parser.mly" ("+") -# 9938 "parsing/parser.ml" +# 9976 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 9946 "parsing/parser.ml" +# 9984 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 9952 "parsing/parser.ml" +# 9990 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -9956,15 +9994,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 9962 "parsing/parser.ml" +# 10000 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 9968 "parsing/parser.ml" +# 10006 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10004,23 +10042,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3465 "parsing/parser.mly" +# 3549 "parsing/parser.mly" ("+.") -# 10010 "parsing/parser.ml" +# 10048 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10018 "parsing/parser.ml" +# 10056 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10024 "parsing/parser.ml" +# 10062 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10028,15 +10066,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10034 "parsing/parser.ml" +# 10072 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10040 "parsing/parser.ml" +# 10078 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10076,23 +10114,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3466 "parsing/parser.mly" +# 3550 "parsing/parser.mly" ("+=") -# 10082 "parsing/parser.ml" +# 10120 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10090 "parsing/parser.ml" +# 10128 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10096 "parsing/parser.ml" +# 10134 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10100,15 +10138,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10106 "parsing/parser.ml" +# 10144 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10112 "parsing/parser.ml" +# 10150 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10148,23 +10186,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3467 "parsing/parser.mly" +# 3551 "parsing/parser.mly" ("-") -# 10154 "parsing/parser.ml" +# 10192 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10162 "parsing/parser.ml" +# 10200 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10168 "parsing/parser.ml" +# 10206 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10172,15 +10210,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10178 "parsing/parser.ml" +# 10216 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10184 "parsing/parser.ml" +# 10222 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10220,23 +10258,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3468 "parsing/parser.mly" +# 3552 "parsing/parser.mly" ("-.") -# 10226 "parsing/parser.ml" +# 10264 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10234 "parsing/parser.ml" +# 10272 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10240 "parsing/parser.ml" +# 10278 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10244,15 +10282,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10250 "parsing/parser.ml" +# 10288 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10256 "parsing/parser.ml" +# 10294 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10292,23 +10330,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3469 "parsing/parser.mly" +# 3553 "parsing/parser.mly" ("*") -# 10298 "parsing/parser.ml" +# 10336 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10306 "parsing/parser.ml" +# 10344 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10312 "parsing/parser.ml" +# 10350 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10316,15 +10354,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10322 "parsing/parser.ml" +# 10360 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10328 "parsing/parser.ml" +# 10366 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10364,23 +10402,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3470 "parsing/parser.mly" +# 3554 "parsing/parser.mly" ("%") -# 10370 "parsing/parser.ml" +# 10408 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10378 "parsing/parser.ml" +# 10416 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10384 "parsing/parser.ml" +# 10422 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10388,15 +10426,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10394 "parsing/parser.ml" +# 10432 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10400 "parsing/parser.ml" +# 10438 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10436,23 +10474,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3471 "parsing/parser.mly" +# 3555 "parsing/parser.mly" ("=") -# 10442 "parsing/parser.ml" +# 10480 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10450 "parsing/parser.ml" +# 10488 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10456 "parsing/parser.ml" +# 10494 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10460,15 +10498,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10466 "parsing/parser.ml" +# 10504 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10472 "parsing/parser.ml" +# 10510 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10508,23 +10546,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3472 "parsing/parser.mly" +# 3556 "parsing/parser.mly" ("<") -# 10514 "parsing/parser.ml" +# 10552 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10522 "parsing/parser.ml" +# 10560 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10528 "parsing/parser.ml" +# 10566 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10532,15 +10570,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10538 "parsing/parser.ml" +# 10576 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10544 "parsing/parser.ml" +# 10582 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10580,23 +10618,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3473 "parsing/parser.mly" +# 3557 "parsing/parser.mly" (">") -# 10586 "parsing/parser.ml" +# 10624 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10594 "parsing/parser.ml" +# 10632 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10600 "parsing/parser.ml" +# 10638 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10604,15 +10642,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10610 "parsing/parser.ml" +# 10648 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10616 "parsing/parser.ml" +# 10654 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10652,23 +10690,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3474 "parsing/parser.mly" +# 3558 "parsing/parser.mly" ("or") -# 10658 "parsing/parser.ml" +# 10696 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10666 "parsing/parser.ml" +# 10704 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10672 "parsing/parser.ml" +# 10710 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10676,15 +10714,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10682 "parsing/parser.ml" +# 10720 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10688 "parsing/parser.ml" +# 10726 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10724,23 +10762,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3475 "parsing/parser.mly" +# 3559 "parsing/parser.mly" ("||") -# 10730 "parsing/parser.ml" +# 10768 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10738 "parsing/parser.ml" +# 10776 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10744 "parsing/parser.ml" +# 10782 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10748,15 +10786,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10754 "parsing/parser.ml" +# 10792 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10760 "parsing/parser.ml" +# 10798 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10796,23 +10834,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3476 "parsing/parser.mly" +# 3560 "parsing/parser.mly" ("&") -# 10802 "parsing/parser.ml" +# 10840 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10810 "parsing/parser.ml" +# 10848 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10816 "parsing/parser.ml" +# 10854 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10820,15 +10858,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10826 "parsing/parser.ml" +# 10864 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10832 "parsing/parser.ml" +# 10870 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10868,23 +10906,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3477 "parsing/parser.mly" +# 3561 "parsing/parser.mly" ("&&") -# 10874 "parsing/parser.ml" +# 10912 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10882 "parsing/parser.ml" +# 10920 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10888 "parsing/parser.ml" +# 10926 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10892,15 +10930,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10898 "parsing/parser.ml" +# 10936 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10904 "parsing/parser.ml" +# 10942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -10940,23 +10978,23 @@ module Tables = struct let _1 = let op = let _1 = -# 3478 "parsing/parser.mly" +# 3562 "parsing/parser.mly" (":=") -# 10946 "parsing/parser.ml" +# 10984 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 10954 "parsing/parser.ml" +# 10992 "parsing/parser.ml" in -# 2237 "parsing/parser.mly" +# 2332 "parsing/parser.mly" ( mkinfix e1 op e2 ) -# 10960 "parsing/parser.ml" +# 10998 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_e2_, _startpos_e1_) in @@ -10964,15 +11002,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 10970 "parsing/parser.ml" +# 11008 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 10976 "parsing/parser.ml" +# 11014 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11005,9 +11043,9 @@ module Tables = struct let _1 = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2239 "parsing/parser.mly" +# 2334 "parsing/parser.mly" ( mkuminus ~oploc:_loc__1_ _1 _2 ) -# 11011 "parsing/parser.ml" +# 11049 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -11015,15 +11053,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11021 "parsing/parser.ml" +# 11059 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 11027 "parsing/parser.ml" +# 11065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11056,9 +11094,9 @@ module Tables = struct let _1 = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2241 "parsing/parser.mly" +# 2336 "parsing/parser.mly" ( mkuplus ~oploc:_loc__1_ _1 _2 ) -# 11062 "parsing/parser.ml" +# 11100 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -11066,15 +11104,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 11072 "parsing/parser.ml" +# 11110 "parsing/parser.ml" in -# 2146 "parsing/parser.mly" +# 2256 "parsing/parser.mly" ( _1 ) -# 11078 "parsing/parser.ml" +# 11116 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11114,9 +11152,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2148 "parsing/parser.mly" +# 2258 "parsing/parser.mly" ( expr_of_let_bindings ~loc:_sloc _1 _3 ) -# 11120 "parsing/parser.ml" +# 11158 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11156,9 +11194,9 @@ module Tables = struct let _3 : unit = Obj.magic _3 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _1 : ( -# 633 "parsing/parser.mly" +# 687 "parsing/parser.mly" (string) -# 11162 "parsing/parser.ml" +# 11200 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -11168,9 +11206,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11174 "parsing/parser.ml" +# 11212 "parsing/parser.ml" in let _startpos_pbop_op_ = _startpos__1_ in @@ -11178,13 +11216,13 @@ module Tables = struct let _symbolstartpos = _startpos_pbop_op_ in let _sloc = (_symbolstartpos, _endpos) in -# 2150 "parsing/parser.mly" +# 2260 "parsing/parser.mly" ( let (pbop_pat, pbop_exp, rev_ands) = bindings in let ands = List.rev rev_ands in let pbop_loc = make_loc _sloc in let let_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in mkexp ~loc:_sloc (Pexp_letop{ let_; ands; body}) ) -# 11188 "parsing/parser.ml" +# 11226 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11225,9 +11263,9 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2156 "parsing/parser.mly" +# 2266 "parsing/parser.mly" ( mkexp_cons ~loc:_sloc _loc__2_ (ghexp ~loc:_sloc (Pexp_tuple[_1;_3])) ) -# 11231 "parsing/parser.ml" +# 11269 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11260,35 +11298,35 @@ module Tables = struct let _3 : (Parsetree.expression) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 11266 "parsing/parser.ml" +# 11304 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 11275 "parsing/parser.ml" +# 11313 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11283 "parsing/parser.ml" +# 11321 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2158 "parsing/parser.mly" +# 2268 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setinstvar(_1, _3)) ) -# 11292 "parsing/parser.ml" +# 11330 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11344,18 +11382,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 11350 "parsing/parser.ml" +# 11388 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2160 "parsing/parser.mly" +# 2270 "parsing/parser.mly" ( mkexp ~loc:_sloc (Pexp_setfield(_1, _3, _5)) ) -# 11359 "parsing/parser.ml" +# 11397 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11368,14 +11406,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -11383,9 +11421,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -11393,14 +11431,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -11409,23 +11447,36 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in + let v : (Parsetree.expression) = Obj.magic v in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__7_ in + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2271 "parsing/parser.mly" + (Some v) +# 11465 "parsing/parser.ml" + in + +# 2231 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 11470 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2162 "parsing/parser.mly" - ( array_set ~loc:_sloc _1 _4 _7 ) -# 11429 "parsing/parser.ml" +# 2272 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 11480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11438,14 +11489,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -11453,9 +11504,175 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let v : (Parsetree.expression) = Obj.magic v in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2271 "parsing/parser.mly" + (Some v) +# 11548 "parsing/parser.ml" + in + +# 2233 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 11553 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2272 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 11563 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let v : (Parsetree.expression) = Obj.magic v in + let _1 : unit = Obj.magic _1 in + let _5 : unit = Obj.magic _5 in + let i : (Parsetree.expression) = Obj.magic i in + let _3 : unit = Obj.magic _3 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2271 "parsing/parser.mly" + (Some v) +# 11631 "parsing/parser.ml" + in + +# 2235 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 11636 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 2272 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 11646 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -11468,9 +11685,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -11479,23 +11696,57 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in + let v : (Parsetree.expression) = Obj.magic v in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _2 : ( +# 686 "parsing/parser.mly" + (string) +# 11708 "parsing/parser.ml" + ) = Obj.magic _2 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__7_ in + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2273 "parsing/parser.mly" + (Some v) +# 11718 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" + ( es ) +# 11723 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 11729 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 11734 "parsing/parser.ml" + + in + +# 2231 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 11740 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2164 "parsing/parser.mly" - ( string_set ~loc:_sloc _1 _4 _7 ) -# 11499 "parsing/parser.ml" +# 2274 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 11750 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11508,14 +11759,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -11523,9 +11774,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -11537,11 +11788,23 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -11549,23 +11812,70 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in + let v : (Parsetree.expression) = Obj.magic v in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _2 : ( +# 686 "parsing/parser.mly" + (string) +# 11824 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__7_ in + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1 = _1_inlined1 in + +# 2273 "parsing/parser.mly" + (Some v) +# 11838 "parsing/parser.ml" + + in + let i = +# 2665 "parsing/parser.mly" + ( es ) +# 11844 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 11852 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 11857 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 11863 "parsing/parser.ml" + + in + +# 2231 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 11869 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2166 "parsing/parser.mly" - ( bigarray_set ~loc:_sloc _1 _4 _7 ) -# 11569 "parsing/parser.ml" +# 2274 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 11879 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11578,14 +11888,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -11608,9 +11918,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -11619,32 +11929,57 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in + let v : (Parsetree.expression) = Obj.magic v in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 11631 "parsing/parser.ml" +# 11941 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2273 "parsing/parser.mly" + (Some v) +# 11951 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 11640 "parsing/parser.ml" - in - let _endpos = _endpos__7_ in +# 11956 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 11962 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 11967 "parsing/parser.ml" + + in + +# 2233 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 11973 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2168 "parsing/parser.mly" - ( dotop_set ~loc:_sloc lident bracket _2 _1 _4 _7 ) -# 11648 "parsing/parser.ml" +# 2274 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 11983 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11657,14 +11992,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -11686,11 +12021,23 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -11698,32 +12045,70 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in + let v : (Parsetree.expression) = Obj.magic v in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _5 : unit = Obj.magic _5 in let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 11710 "parsing/parser.ml" +# 12057 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1 = _1_inlined1 in + +# 2273 "parsing/parser.mly" + (Some v) +# 12071 "parsing/parser.ml" + + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 11719 "parsing/parser.ml" - in - let _endpos = _endpos__7_ in +# 12077 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 12085 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 12090 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 12096 "parsing/parser.ml" + + in + +# 2233 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 12102 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2170 "parsing/parser.mly" - ( dotop_set ~loc:_sloc lident paren _2 _1 _4 _7 ) -# 11727 "parsing/parser.ml" +# 2274 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 12112 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11736,14 +12121,14 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _6; - MenhirLib.EngineTypes.startp = _startpos__6_; - MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _5; @@ -11766,9 +12151,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -11777,125 +12162,57 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : (Parsetree.expression) = Obj.magic _7 in - let _6 : unit = Obj.magic _6 in + let v : (Parsetree.expression) = Obj.magic v in + let _1 : unit = Obj.magic _1 in let _5 : unit = Obj.magic _5 in let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 11789 "parsing/parser.ml" +# 12174 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" - ( es ) -# 11798 "parsing/parser.ml" - in - let _endpos = _endpos__7_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2172 "parsing/parser.mly" - ( dotop_set ~loc:_sloc lident brace _2 _1 _4 _7 ) -# 11806 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _9 : (Parsetree.expression) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" - (string) -# 11880 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__9_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2273 "parsing/parser.mly" + (Some v) +# 12184 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 11891 "parsing/parser.ml" - in - let _endpos = _endpos__9_ in +# 12189 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 12195 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 12200 "parsing/parser.ml" + + in + +# 2235 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 12206 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2175 "parsing/parser.mly" - ( dotop_set ~loc:_sloc (ldot _3) bracket _4 _1 _6 _9 ) -# 11899 "parsing/parser.ml" +# 2274 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 12216 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -11908,19 +12225,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; + MenhirLib.EngineTypes.semv = v; + MenhirLib.EngineTypes.startp = _startpos_v_; + MenhirLib.EngineTypes.endp = _endpos_v_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = es; @@ -11928,29 +12245,29 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -11961,127 +12278,70 @@ module Tables = struct }; }; } = _menhir_stack in - let _9 : (Parsetree.expression) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in - let es : (Parsetree.expression list) = Obj.magic es in + let v : (Parsetree.expression) = Obj.magic v in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" - (string) -# 11973 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__9_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" - ( es ) -# 11984 "parsing/parser.ml" - in - let _endpos = _endpos__9_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in - -# 2178 "parsing/parser.mly" - ( dotop_set ~loc:_sloc (ldot _3) paren _4 _1 _6 _9 ) -# 11992 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _9; - MenhirLib.EngineTypes.startp = _startpos__9_; - MenhirLib.EngineTypes.endp = _endpos__9_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _8; - MenhirLib.EngineTypes.startp = _startpos__8_; - MenhirLib.EngineTypes.endp = _endpos__8_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - }; - }; - }; - }; - } = _menhir_stack in - let _9 : (Parsetree.expression) = Obj.magic _9 in - let _8 : unit = Obj.magic _8 in - let _7 : unit = Obj.magic _7 in let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 686 "parsing/parser.mly" (string) -# 12066 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 12290 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__9_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _startpos = _startpos_array_ in + let _endpos = _endpos_v_ in + let _v : (Parsetree.expression) = let _1 = + let r = + let _1 = _1_inlined1 in + +# 2273 "parsing/parser.mly" + (Some v) +# 12304 "parsing/parser.ml" + + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 12077 "parsing/parser.ml" - in - let _endpos = _endpos__9_ in +# 12310 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 12318 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 12323 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 12329 "parsing/parser.ml" + + in + +# 2235 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 12335 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos_v_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2181 "parsing/parser.mly" - ( dotop_set ~loc:_sloc (ldot _3) brace _4 _1 _6 _9 ) -# 12085 "parsing/parser.ml" +# 2274 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 12345 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12111,9 +12371,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2183 "parsing/parser.mly" +# 2276 "parsing/parser.mly" ( Exp.attr _1 _2 ) -# 12117 "parsing/parser.ml" +# 12377 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12137,9 +12397,9 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2185 "parsing/parser.mly" +# 2279 "parsing/parser.mly" ( not_expecting _loc__1_ "wildcard \"_\"" ) -# 12143 "parsing/parser.ml" +# 12403 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12155,9 +12415,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string Asttypes.loc option) = -# 3750 "parsing/parser.mly" +# 3838 "parsing/parser.mly" ( None ) -# 12161 "parsing/parser.ml" +# 12421 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12187,9 +12447,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string Asttypes.loc option) = -# 3751 "parsing/parser.mly" +# 3839 "parsing/parser.mly" ( Some _2 ) -# 12193 "parsing/parser.ml" +# 12453 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12233,9 +12493,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 3761 "parsing/parser.mly" +# 3851 "parsing/parser.mly" ( (_2, _3) ) -# 12239 "parsing/parser.ml" +# 12499 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12254,9 +12514,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 691 "parsing/parser.mly" - (string * Location.t * string * Location.t * string option) -# 12260 "parsing/parser.ml" +# 745 "parsing/parser.mly" + (string * Location.t * string * Location.t * string option) +# 12520 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -12265,9 +12525,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3763 "parsing/parser.mly" +# 3853 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 12271 "parsing/parser.ml" +# 12531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12320,9 +12580,9 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined3 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 12326 "parsing/parser.ml" +# 12586 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined3_ in @@ -12332,9 +12592,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 12338 "parsing/parser.ml" +# 12598 "parsing/parser.ml" in let cid = @@ -12343,19 +12603,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 12349 "parsing/parser.ml" +# 12609 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3119 "parsing/parser.mly" +# 3199 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 12359 "parsing/parser.ml" +# 12619 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12401,9 +12661,9 @@ module Tables = struct let _v : (Parsetree.extension_constructor) = let attrs = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 12407 "parsing/parser.ml" +# 12667 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -12413,9 +12673,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 12419 "parsing/parser.ml" +# 12679 "parsing/parser.ml" in let cid = @@ -12423,25 +12683,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 12429 "parsing/parser.ml" +# 12689 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3570 "parsing/parser.mly" +# 3656 "parsing/parser.mly" ( () ) -# 12436 "parsing/parser.ml" +# 12696 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 3119 "parsing/parser.mly" +# 3199 "parsing/parser.mly" ( let info = symbol_info _endpos in Te.rebind cid lid ~attrs ~loc:(make_loc _sloc) ~info ) -# 12445 "parsing/parser.ml" +# 12705 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12488,10 +12748,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3738 "parsing/parser.mly" +# 3826 "parsing/parser.mly" ( mark_symbol_docs _sloc; Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 12495 "parsing/parser.ml" +# 12755 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12507,14 +12767,14 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let params = -# 1934 "parsing/parser.mly" +# 2024 "parsing/parser.mly" ( [] ) -# 12513 "parsing/parser.ml" +# 12773 "parsing/parser.ml" in -# 1759 "parsing/parser.mly" +# 1849 "parsing/parser.mly" ( params ) -# 12518 "parsing/parser.ml" +# 12778 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12555,24 +12815,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 12559 "parsing/parser.ml" +# 12819 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 12564 "parsing/parser.ml" +# 12824 "parsing/parser.ml" in -# 1936 "parsing/parser.mly" +# 2026 "parsing/parser.mly" ( params ) -# 12570 "parsing/parser.ml" +# 12830 "parsing/parser.ml" in -# 1759 "parsing/parser.mly" +# 1849 "parsing/parser.mly" ( params ) -# 12576 "parsing/parser.ml" +# 12836 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12595,9 +12855,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2507 "parsing/parser.mly" +# 2584 "parsing/parser.mly" ( _1 ) -# 12601 "parsing/parser.ml" +# 12861 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12637,9 +12897,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2509 "parsing/parser.mly" +# 2586 "parsing/parser.mly" ( mkexp_constraint ~loc:_sloc _3 _1 ) -# 12643 "parsing/parser.ml" +# 12903 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12669,9 +12929,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2533 "parsing/parser.mly" +# 2610 "parsing/parser.mly" ( _2 ) -# 12675 "parsing/parser.ml" +# 12935 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12716,24 +12976,24 @@ module Tables = struct let _endpos = _endpos__4_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2535 "parsing/parser.mly" +# 2612 "parsing/parser.mly" ( Pexp_constraint (_4, _2) ) -# 12722 "parsing/parser.ml" +# 12982 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 12731 "parsing/parser.ml" +# 12991 "parsing/parser.ml" in -# 2536 "parsing/parser.mly" +# 2613 "parsing/parser.mly" ( _1 ) -# 12737 "parsing/parser.ml" +# 12997 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12766,12 +13026,12 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2539 "parsing/parser.mly" +# 2616 "parsing/parser.mly" ( let (l,o,p) = _1 in ghexp ~loc:_sloc (Pexp_fun(l, o, p, _2)) ) -# 12775 "parsing/parser.ml" +# 13035 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12822,17 +13082,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _3 = -# 2416 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( xs ) -# 12828 "parsing/parser.ml" +# 13088 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2544 "parsing/parser.mly" +# 2621 "parsing/parser.mly" ( mk_newtypes ~loc:_sloc _3 _5 ) -# 12836 "parsing/parser.ml" +# 13096 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12855,9 +13115,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3231 "parsing/parser.mly" +# 3315 "parsing/parser.mly" ( ty ) -# 12861 "parsing/parser.ml" +# 13121 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12903,19 +13163,19 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let domain = -# 815 "parsing/parser.mly" +# 881 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 12909 "parsing/parser.ml" +# 13169 "parsing/parser.ml" in let label = -# 3243 "parsing/parser.mly" +# 3327 "parsing/parser.mly" ( Optional label ) -# 12914 "parsing/parser.ml" +# 13174 "parsing/parser.ml" in -# 3237 "parsing/parser.mly" +# 3321 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 12919 "parsing/parser.ml" +# 13179 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -12923,15 +13183,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 12929 "parsing/parser.ml" +# 13189 "parsing/parser.ml" in -# 3239 "parsing/parser.mly" +# 3323 "parsing/parser.mly" ( _1 ) -# 12935 "parsing/parser.ml" +# 13195 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -12978,9 +13238,9 @@ module Tables = struct let _1 : (Parsetree.core_type) = Obj.magic _1 in let _2 : unit = Obj.magic _2 in let label : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 12984 "parsing/parser.ml" +# 13244 "parsing/parser.ml" ) = Obj.magic label in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_label_ in @@ -12988,19 +13248,19 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let domain = -# 815 "parsing/parser.mly" +# 881 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 12994 "parsing/parser.ml" +# 13254 "parsing/parser.ml" in let label = -# 3245 "parsing/parser.mly" +# 3329 "parsing/parser.mly" ( Labelled label ) -# 12999 "parsing/parser.ml" +# 13259 "parsing/parser.ml" in -# 3237 "parsing/parser.mly" +# 3321 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 13004 "parsing/parser.ml" +# 13264 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_codomain_, _startpos_label_) in @@ -13008,15 +13268,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 13014 "parsing/parser.ml" +# 13274 "parsing/parser.ml" in -# 3239 "parsing/parser.mly" +# 3323 "parsing/parser.mly" ( _1 ) -# 13020 "parsing/parser.ml" +# 13280 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13055,19 +13315,19 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let domain = -# 815 "parsing/parser.mly" +# 881 "parsing/parser.mly" ( extra_rhs_core_type _1 ~pos:_endpos__1_ ) -# 13061 "parsing/parser.ml" +# 13321 "parsing/parser.ml" in let label = -# 3247 "parsing/parser.mly" +# 3331 "parsing/parser.mly" ( Nolabel ) -# 13066 "parsing/parser.ml" +# 13326 "parsing/parser.ml" in -# 3237 "parsing/parser.mly" +# 3321 "parsing/parser.mly" ( Ptyp_arrow(label, domain, codomain) ) -# 13071 "parsing/parser.ml" +# 13331 "parsing/parser.ml" in let _endpos__1_ = _endpos_codomain_ in @@ -13075,15 +13335,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 13081 "parsing/parser.ml" +# 13341 "parsing/parser.ml" in -# 3239 "parsing/parser.mly" +# 3323 "parsing/parser.mly" ( _1 ) -# 13087 "parsing/parser.ml" +# 13347 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13114,9 +13374,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Lexing.position * Parsetree.functor_parameter) = let _startpos = _startpos__1_ in -# 1190 "parsing/parser.mly" +# 1261 "parsing/parser.mly" ( _startpos, Unit ) -# 13120 "parsing/parser.ml" +# 13380 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13172,16 +13432,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13178 "parsing/parser.ml" +# 13438 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 1193 "parsing/parser.mly" +# 1264 "parsing/parser.mly" ( _startpos, Named (x, mty) ) -# 13185 "parsing/parser.ml" +# 13445 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13197,9 +13457,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3039 "parsing/parser.mly" +# 3119 "parsing/parser.mly" ( (Pcstr_tuple [],None) ) -# 13203 "parsing/parser.ml" +# 13463 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13229,9 +13489,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3040 "parsing/parser.mly" +# 3120 "parsing/parser.mly" ( (_2,None) ) -# 13235 "parsing/parser.ml" +# 13495 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13275,9 +13535,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3042 "parsing/parser.mly" +# 3122 "parsing/parser.mly" ( (_2,Some _4) ) -# 13281 "parsing/parser.ml" +# 13541 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13307,9 +13567,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constructor_arguments * Parsetree.core_type option) = -# 3044 "parsing/parser.mly" +# 3124 "parsing/parser.mly" ( (Pcstr_tuple [],Some _2) ) -# 13313 "parsing/parser.ml" +# 13573 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13357,9 +13617,9 @@ module Tables = struct Docstrings.info) = let attrs = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 13363 "parsing/parser.ml" +# 13623 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined2_ in @@ -13369,23 +13629,23 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13375 "parsing/parser.ml" +# 13635 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2987 "parsing/parser.mly" +# 3067 "parsing/parser.mly" ( let args, res = args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, args, res, attrs, loc, info ) -# 13389 "parsing/parser.ml" +# 13649 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13426,9 +13686,9 @@ module Tables = struct Docstrings.info) = let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 13432 "parsing/parser.ml" +# 13692 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined1_ in @@ -13437,29 +13697,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13443 "parsing/parser.ml" +# 13703 "parsing/parser.ml" in let _startpos_cid_ = _startpos__1_ in let _1 = -# 3570 "parsing/parser.mly" +# 3656 "parsing/parser.mly" ( () ) -# 13450 "parsing/parser.ml" +# 13710 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos_cid_ in let _sloc = (_symbolstartpos, _endpos) in -# 2987 "parsing/parser.mly" +# 3067 "parsing/parser.mly" ( let args, res = args_res in let info = symbol_info _endpos in let loc = make_loc _sloc in cid, args, res, attrs, loc, info ) -# 13463 "parsing/parser.ml" +# 13723 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13530,9 +13790,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 13536 "parsing/parser.ml" +# 13796 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -13545,9 +13805,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 13551 "parsing/parser.ml" +# 13811 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -13556,26 +13816,26 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13560 "parsing/parser.ml" +# 13820 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 13565 "parsing/parser.ml" +# 13825 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 13571 "parsing/parser.ml" +# 13831 "parsing/parser.ml" in let kind_priv_manifest = let _1 = _1_inlined3 in -# 2927 "parsing/parser.mly" +# 3007 "parsing/parser.mly" ( _2 ) -# 13579 "parsing/parser.ml" +# 13839 "parsing/parser.ml" in let id = @@ -13584,29 +13844,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13590 "parsing/parser.ml" +# 13850 "parsing/parser.ml" in let flag = -# 3590 "parsing/parser.mly" +# 3676 "parsing/parser.mly" ( Recursive ) -# 13596 "parsing/parser.ml" +# 13856 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 13603 "parsing/parser.ml" +# 13863 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2864 "parsing/parser.mly" +# 2944 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -13615,7 +13875,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 13619 "parsing/parser.ml" +# 13879 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13692,9 +13952,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined4 : unit = Obj.magic _1_inlined4 in let _1_inlined3 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 13698 "parsing/parser.ml" +# 13958 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -13708,9 +13968,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined5 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 13714 "parsing/parser.ml" +# 13974 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined5_ in @@ -13719,26 +13979,26 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13723 "parsing/parser.ml" +# 13983 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 13728 "parsing/parser.ml" +# 13988 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 13734 "parsing/parser.ml" +# 13994 "parsing/parser.ml" in let kind_priv_manifest = let _1 = _1_inlined4 in -# 2927 "parsing/parser.mly" +# 3007 "parsing/parser.mly" ( _2 ) -# 13742 "parsing/parser.ml" +# 14002 "parsing/parser.ml" in let id = @@ -13747,9 +14007,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13753 "parsing/parser.ml" +# 14013 "parsing/parser.ml" in let flag = @@ -13758,24 +14018,24 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3591 "parsing/parser.mly" +# 3678 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 13764 "parsing/parser.ml" +# 14024 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 13772 "parsing/parser.ml" +# 14032 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2864 "parsing/parser.mly" +# 2944 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -13784,7 +14044,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 13788 "parsing/parser.ml" +# 14048 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13848,9 +14108,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 13854 "parsing/parser.ml" +# 14114 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -13863,9 +14123,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 13869 "parsing/parser.ml" +# 14129 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -13874,18 +14134,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 13878 "parsing/parser.ml" +# 14138 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 13883 "parsing/parser.ml" +# 14143 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 13889 "parsing/parser.ml" +# 14149 "parsing/parser.ml" in let id = @@ -13894,29 +14154,29 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 13900 "parsing/parser.ml" +# 14160 "parsing/parser.ml" in let flag = -# 3586 "parsing/parser.mly" +# 3672 "parsing/parser.mly" ( Recursive ) -# 13906 "parsing/parser.ml" +# 14166 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 13913 "parsing/parser.ml" +# 14173 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2864 "parsing/parser.mly" +# 2944 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -13925,7 +14185,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 13929 "parsing/parser.ml" +# 14189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -13995,9 +14255,9 @@ module Tables = struct let xs : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined3 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14001 "parsing/parser.ml" +# 14261 "parsing/parser.ml" ) = Obj.magic _1_inlined3 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined2 : unit = Obj.magic _1_inlined2 in @@ -14011,9 +14271,9 @@ module Tables = struct Parsetree.type_declaration) = let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 14017 "parsing/parser.ml" +# 14277 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -14022,18 +14282,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 14026 "parsing/parser.ml" +# 14286 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 14031 "parsing/parser.ml" +# 14291 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 14037 "parsing/parser.ml" +# 14297 "parsing/parser.ml" in let id = @@ -14042,32 +14302,32 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14048 "parsing/parser.ml" +# 14308 "parsing/parser.ml" in let flag = let _1 = _1_inlined2 in -# 3587 "parsing/parser.mly" +# 3673 "parsing/parser.mly" ( Nonrecursive ) -# 14056 "parsing/parser.ml" +# 14316 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 14064 "parsing/parser.ml" +# 14324 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2864 "parsing/parser.mly" +# 2944 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -14076,7 +14336,7 @@ module Tables = struct (flag, ext), Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ) -# 14080 "parsing/parser.ml" +# 14340 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14095,17 +14355,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 14101 "parsing/parser.ml" +# 14361 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3431 "parsing/parser.mly" +# 3515 "parsing/parser.mly" ( _1 ) -# 14109 "parsing/parser.ml" +# 14369 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14124,17 +14384,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14130 "parsing/parser.ml" +# 14390 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3432 "parsing/parser.mly" +# 3516 "parsing/parser.mly" ( _1 ) -# 14138 "parsing/parser.ml" +# 14398 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14163,14 +14423,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 781 "parsing/parser.mly" - (Parsetree.structure) -# 14170 "parsing/parser.ml" - ) = -# 1072 "parsing/parser.mly" + let _v : (Parsetree.structure) = +# 1138 "parsing/parser.mly" ( _1 ) -# 14174 "parsing/parser.ml" +# 14430 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14186,9 +14442,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (string) = -# 3481 "parsing/parser.mly" +# 3565 "parsing/parser.mly" ( "" ) -# 14192 "parsing/parser.ml" +# 14448 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14218,9 +14474,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (string) = -# 3482 "parsing/parser.mly" +# 3566 "parsing/parser.mly" ( ";.." ) -# 14224 "parsing/parser.ml" +# 14480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14249,14 +14505,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 783 "parsing/parser.mly" - (Parsetree.signature) -# 14256 "parsing/parser.ml" - ) = -# 1078 "parsing/parser.mly" + let _v : (Parsetree.signature) = +# 1145 "parsing/parser.mly" ( _1 ) -# 14260 "parsing/parser.ml" +# 14512 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14300,9 +14552,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.extension) = -# 3766 "parsing/parser.mly" +# 3856 "parsing/parser.mly" ( (_2, _3) ) -# 14306 "parsing/parser.ml" +# 14558 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14321,9 +14573,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 693 "parsing/parser.mly" - (string * Location.t * string * Location.t * string option) -# 14327 "parsing/parser.ml" +# 747 "parsing/parser.mly" + (string * Location.t * string * Location.t * string option) +# 14579 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -14332,9 +14584,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3768 "parsing/parser.mly" +# 3858 "parsing/parser.mly" ( mk_quotedext ~loc:_sloc _1 ) -# 14338 "parsing/parser.ml" +# 14590 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14380,9 +14632,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14386 "parsing/parser.ml" +# 14638 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -14391,34 +14643,34 @@ module Tables = struct let _v : (Parsetree.label_declaration) = let _5 = let _1 = _1_inlined3 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 14397 "parsing/parser.ml" +# 14649 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3184 "parsing/parser.mly" +# 3268 "parsing/parser.mly" ( _1 ) -# 14406 "parsing/parser.ml" +# 14658 "parsing/parser.ml" in let _2 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 14414 "parsing/parser.ml" +# 14666 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14422 "parsing/parser.ml" +# 14674 "parsing/parser.ml" in let _startpos__2_ = _startpos__1_inlined1_ in @@ -14429,10 +14681,10 @@ module Tables = struct _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 3061 "parsing/parser.mly" +# 3141 "parsing/parser.mly" ( let info = symbol_info _endpos in Type.field _2 _4 ~mut:_1 ~attrs:_5 ~loc:(make_loc _sloc) ~info ) -# 14436 "parsing/parser.ml" +# 14688 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14492,9 +14744,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _3 : unit = Obj.magic _3 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14498 "parsing/parser.ml" +# 14750 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Asttypes.mutable_flag) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -14503,43 +14755,43 @@ module Tables = struct let _v : (Parsetree.label_declaration) = let _7 = let _1 = _1_inlined4 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 14509 "parsing/parser.ml" +# 14761 "parsing/parser.ml" in let _endpos__7_ = _endpos__1_inlined4_ in let _5 = let _1 = _1_inlined3 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 14518 "parsing/parser.ml" +# 14770 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3184 "parsing/parser.mly" +# 3268 "parsing/parser.mly" ( _1 ) -# 14527 "parsing/parser.ml" +# 14779 "parsing/parser.ml" in let _2 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 14535 "parsing/parser.ml" +# 14787 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14543 "parsing/parser.ml" +# 14795 "parsing/parser.ml" in let _startpos__2_ = _startpos__1_inlined1_ in @@ -14550,14 +14802,14 @@ module Tables = struct _startpos__2_ in let _sloc = (_symbolstartpos, _endpos) in -# 3066 "parsing/parser.mly" +# 3146 "parsing/parser.mly" ( let info = match rhs_info _endpos__5_ with | Some _ as info_before_semi -> info_before_semi | None -> symbol_info _endpos in Type.field _2 _4 ~mut:_1 ~attrs:(_5 @ _7) ~loc:(make_loc _sloc) ~info ) -# 14561 "parsing/parser.ml" +# 14813 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14580,9 +14832,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.label_declaration list) = -# 3055 "parsing/parser.mly" +# 3135 "parsing/parser.mly" ( [_1] ) -# 14586 "parsing/parser.ml" +# 14838 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14605,9 +14857,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.label_declaration list) = -# 3056 "parsing/parser.mly" +# 3136 "parsing/parser.mly" ( [_1] ) -# 14611 "parsing/parser.ml" +# 14863 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14637,9 +14889,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.label_declaration list) = -# 3057 "parsing/parser.mly" +# 3137 "parsing/parser.mly" ( _1 :: _2 ) -# 14643 "parsing/parser.ml" +# 14895 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14658,9 +14910,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14664 "parsing/parser.ml" +# 14916 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -14671,24 +14923,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14677 "parsing/parser.ml" +# 14929 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2219 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 14686 "parsing/parser.ml" +# 14938 "parsing/parser.ml" in -# 2121 "parsing/parser.mly" +# 2211 "parsing/parser.mly" ( x ) -# 14692 "parsing/parser.ml" +# 14944 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14721,9 +14973,9 @@ module Tables = struct let cty : (Parsetree.core_type) = Obj.magic cty in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14727 "parsing/parser.ml" +# 14979 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -14734,18 +14986,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 14740 "parsing/parser.ml" +# 14992 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2219 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 14749 "parsing/parser.ml" +# 15001 "parsing/parser.ml" in let _startpos_x_ = _startpos__1_ in @@ -14753,11 +15005,11 @@ module Tables = struct let _symbolstartpos = _startpos_x_ in let _sloc = (_symbolstartpos, _endpos) in -# 2123 "parsing/parser.mly" +# 2213 "parsing/parser.mly" ( let lab, pat = x in lab, mkpat ~loc:_sloc (Ppat_constraint (pat, cty)) ) -# 14761 "parsing/parser.ml" +# 15013 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14780,9 +15032,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3513 "parsing/parser.mly" +# 3597 "parsing/parser.mly" ( _1 ) -# 14786 "parsing/parser.ml" +# 15038 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14805,9 +15057,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2402 "parsing/parser.mly" +# 2464 "parsing/parser.mly" ( (Nolabel, _1) ) -# 14811 "parsing/parser.ml" +# 15063 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14833,17 +15085,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 638 "parsing/parser.mly" +# 692 "parsing/parser.mly" (string) -# 14839 "parsing/parser.ml" +# 15091 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2404 "parsing/parser.mly" +# 2466 "parsing/parser.mly" ( (Labelled _1, _2) ) -# 14847 "parsing/parser.ml" +# 15099 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14868,9 +15120,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14874 "parsing/parser.ml" +# 15126 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -14878,10 +15130,10 @@ module Tables = struct let _endpos = _endpos_label_ in let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2406 "parsing/parser.mly" +# 2468 "parsing/parser.mly" ( let loc = _loc_label_ in (Labelled label, mkexpvar ~loc label) ) -# 14885 "parsing/parser.ml" +# 15137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14906,9 +15158,9 @@ module Tables = struct }; } = _menhir_stack in let label : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 14912 "parsing/parser.ml" +# 15164 "parsing/parser.ml" ) = Obj.magic label in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -14916,10 +15168,10 @@ module Tables = struct let _endpos = _endpos_label_ in let _v : (Asttypes.arg_label * Parsetree.expression) = let _loc_label_ = (_startpos_label_, _endpos_label_) in -# 2409 "parsing/parser.mly" +# 2471 "parsing/parser.mly" ( let loc = _loc_label_ in (Optional label, mkexpvar ~loc label) ) -# 14923 "parsing/parser.ml" +# 15175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -14945,17 +15197,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 668 "parsing/parser.mly" +# 722 "parsing/parser.mly" (string) -# 14951 "parsing/parser.ml" +# 15203 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression) = -# 2412 "parsing/parser.mly" +# 2474 "parsing/parser.mly" ( (Optional _1, _2) ) -# 14959 "parsing/parser.ml" +# 15211 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15008,15 +15260,15 @@ module Tables = struct let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = let _1 = _1_inlined1 in -# 2117 "parsing/parser.mly" +# 2207 "parsing/parser.mly" ( _1 ) -# 15014 "parsing/parser.ml" +# 15266 "parsing/parser.ml" in -# 2091 "parsing/parser.mly" +# 2181 "parsing/parser.mly" ( (Optional (fst _3), _4, snd _3) ) -# 15020 "parsing/parser.ml" +# 15272 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15041,9 +15293,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 15047 "parsing/parser.ml" +# 15299 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -15056,24 +15308,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15062 "parsing/parser.ml" +# 15314 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2219 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 15071 "parsing/parser.ml" +# 15323 "parsing/parser.ml" in -# 2093 "parsing/parser.mly" +# 2183 "parsing/parser.mly" ( (Optional (fst _2), None, snd _2) ) -# 15077 "parsing/parser.ml" +# 15329 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15120,9 +15372,9 @@ module Tables = struct let _3 : (Parsetree.pattern) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 668 "parsing/parser.mly" +# 722 "parsing/parser.mly" (string) -# 15126 "parsing/parser.ml" +# 15378 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -15130,15 +15382,15 @@ module Tables = struct let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = let _4 = let _1 = _1_inlined1 in -# 2117 "parsing/parser.mly" +# 2207 "parsing/parser.mly" ( _1 ) -# 15136 "parsing/parser.ml" +# 15388 "parsing/parser.ml" in -# 2095 "parsing/parser.mly" +# 2185 "parsing/parser.mly" ( (Optional _1, _4, _3) ) -# 15142 "parsing/parser.ml" +# 15394 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15164,17 +15416,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 668 "parsing/parser.mly" +# 722 "parsing/parser.mly" (string) -# 15170 "parsing/parser.ml" +# 15422 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2097 "parsing/parser.mly" +# 2187 "parsing/parser.mly" ( (Optional _1, None, _2) ) -# 15178 "parsing/parser.ml" +# 15430 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15218,9 +15470,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2099 "parsing/parser.mly" +# 2189 "parsing/parser.mly" ( (Labelled (fst _3), None, snd _3) ) -# 15224 "parsing/parser.ml" +# 15476 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15245,9 +15497,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 15251 "parsing/parser.ml" +# 15503 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -15260,24 +15512,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 15266 "parsing/parser.ml" +# 15518 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2129 "parsing/parser.mly" +# 2219 "parsing/parser.mly" ( (_1.Location.txt, mkpat ~loc:_sloc (Ppat_var _1)) ) -# 15275 "parsing/parser.ml" +# 15527 "parsing/parser.ml" in -# 2101 "parsing/parser.mly" +# 2191 "parsing/parser.mly" ( (Labelled (fst _2), None, snd _2) ) -# 15281 "parsing/parser.ml" +# 15533 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15303,17 +15555,17 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.pattern) = Obj.magic _2 in let _1 : ( -# 638 "parsing/parser.mly" +# 692 "parsing/parser.mly" (string) -# 15309 "parsing/parser.ml" +# 15561 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2103 "parsing/parser.mly" +# 2193 "parsing/parser.mly" ( (Labelled _1, None, _2) ) -# 15317 "parsing/parser.ml" +# 15569 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15336,9 +15588,62 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.arg_label * Parsetree.expression option * Parsetree.pattern) = -# 2105 "parsing/parser.mly" +# 2195 "parsing/parser.mly" ( (Nolabel, None, _1) ) -# 15342 "parsing/parser.ml" +# 15594 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.pattern * Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Parsetree.expression * bool) = +# 2521 "parsing/parser.mly" + ( let p,e = _1 in (p,e,false) ) +# 15619 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Parsetree.expression * bool) = let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +# 2524 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1, true) ) +# 15647 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15372,15 +15677,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2419 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 15378 "parsing/parser.ml" +# 15683 "parsing/parser.ml" in -# 2423 "parsing/parser.mly" +# 2485 "parsing/parser.mly" ( (_1, _2) ) -# 15384 "parsing/parser.ml" +# 15689 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15428,16 +15733,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2419 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 15434 "parsing/parser.ml" +# 15739 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2425 "parsing/parser.mly" +# 2487 "parsing/parser.mly" ( let v = _1 in (* PR#7344 *) let t = match _2 with @@ -15450,7 +15755,7 @@ module Tables = struct let patloc = (_startpos__1_, _endpos__2_) in (ghpat ~loc:patloc (Ppat_constraint(v, typ)), mkexp_constraint ~loc:_sloc _4 _2) ) -# 15454 "parsing/parser.ml" +# 15759 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15519,18 +15824,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 15523 "parsing/parser.ml" +# 15828 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 985 "parsing/parser.mly" ( xs ) -# 15528 "parsing/parser.ml" +# 15833 "parsing/parser.ml" in -# 3166 "parsing/parser.mly" +# 3250 "parsing/parser.mly" ( _1 ) -# 15534 "parsing/parser.ml" +# 15839 "parsing/parser.ml" in let _startpos__3_ = _startpos_xs_ in @@ -15539,19 +15844,19 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2419 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 15545 "parsing/parser.ml" +# 15850 "parsing/parser.ml" in -# 2441 "parsing/parser.mly" +# 2503 "parsing/parser.mly" ( let typloc = (_startpos__3_, _endpos__5_) in let patloc = (_startpos__1_, _endpos__5_) in (ghpat ~loc:patloc (Ppat_constraint(_1, ghtyp ~loc:typloc (Ptyp_poly(_3,_5)))), _7) ) -# 15555 "parsing/parser.ml" +# 15860 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15623,30 +15928,30 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__8_ in let _v : (Parsetree.pattern * Parsetree.expression) = let _4 = -# 2416 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( xs ) -# 15629 "parsing/parser.ml" +# 15934 "parsing/parser.ml" in let _1 = let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2419 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 15638 "parsing/parser.ml" +# 15943 "parsing/parser.ml" in let _endpos = _endpos__8_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2447 "parsing/parser.mly" +# 2509 "parsing/parser.mly" ( let exp, poly = wrap_type_annotation ~loc:_sloc _4 _6 _8 in let loc = (_startpos__1_, _endpos__6_) in (ghpat ~loc (Ppat_constraint(_1, poly)), exp) ) -# 15650 "parsing/parser.ml" +# 15955 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15683,9 +15988,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2452 "parsing/parser.mly" +# 2514 "parsing/parser.mly" ( (_1, _3) ) -# 15689 "parsing/parser.ml" +# 15994 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15736,10 +16041,10 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2454 "parsing/parser.mly" +# 2516 "parsing/parser.mly" ( let loc = (_startpos__1_, _endpos__3_) in (ghpat ~loc (Ppat_constraint(_1, _3)), _5) ) -# 15743 "parsing/parser.ml" +# 16048 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15788,7 +16093,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let body : (Parsetree.pattern * Parsetree.expression * bool) = Obj.magic body in let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let ext : (string Asttypes.loc option) = Obj.magic ext in @@ -15800,36 +16105,36 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 15806 "parsing/parser.ml" +# 16111 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 15815 "parsing/parser.ml" +# 16120 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2470 "parsing/parser.mly" +# 2544 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in - mklbs ~loc:_sloc ext rec_flag (mklb ~loc:_sloc true body attrs) + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 15827 "parsing/parser.ml" +# 16132 "parsing/parser.ml" in -# 2460 "parsing/parser.mly" +# 2534 "parsing/parser.mly" ( _1 ) -# 15833 "parsing/parser.ml" +# 16138 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15859,9 +16164,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (let_bindings) = -# 2461 "parsing/parser.mly" +# 2535 "parsing/parser.mly" ( addlb _1 _2 ) -# 15865 "parsing/parser.ml" +# 16170 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -15904,7 +16209,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let body : (Parsetree.pattern * Parsetree.expression * bool) = Obj.magic body in let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -15915,41 +16220,41 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 15921 "parsing/parser.ml" +# 16226 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 15930 "parsing/parser.ml" +# 16235 "parsing/parser.ml" in let ext = -# 3754 "parsing/parser.mly" +# 3842 "parsing/parser.mly" ( None ) -# 15936 "parsing/parser.ml" +# 16241 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2470 "parsing/parser.mly" +# 2544 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in - mklbs ~loc:_sloc ext rec_flag (mklb ~loc:_sloc true body attrs) + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 15947 "parsing/parser.ml" +# 16252 "parsing/parser.ml" in -# 2460 "parsing/parser.mly" +# 2534 "parsing/parser.mly" ( _1 ) -# 15953 "parsing/parser.ml" +# 16258 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16004,7 +16309,7 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in - let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in + let body : (Parsetree.pattern * Parsetree.expression * bool) = Obj.magic body in let rec_flag : (Asttypes.rec_flag) = Obj.magic rec_flag in let _1_inlined2 : (Parsetree.attributes) = Obj.magic _1_inlined2 in let _2 : (string Asttypes.loc) = Obj.magic _2 in @@ -16017,18 +16322,18 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 16023 "parsing/parser.ml" +# 16328 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let attrs1 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 16032 "parsing/parser.ml" +# 16337 "parsing/parser.ml" in let ext = @@ -16037,27 +16342,27 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3755 "parsing/parser.mly" +# 3844 "parsing/parser.mly" ( not_expecting _loc "extension" ) -# 16043 "parsing/parser.ml" +# 16348 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2470 "parsing/parser.mly" +# 2544 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in - mklbs ~loc:_sloc ext rec_flag (mklb ~loc:_sloc true body attrs) + mklbs ext rec_flag (mklb ~loc:_sloc true body attrs) ) -# 16055 "parsing/parser.ml" +# 16360 "parsing/parser.ml" in -# 2460 "parsing/parser.mly" +# 2534 "parsing/parser.mly" ( _1 ) -# 16061 "parsing/parser.ml" +# 16366 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16087,9 +16392,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (let_bindings) = -# 2461 "parsing/parser.mly" +# 2535 "parsing/parser.mly" ( addlb _1 _2 ) -# 16093 "parsing/parser.ml" +# 16398 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16112,9 +16417,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2133 "parsing/parser.mly" +# 2223 "parsing/parser.mly" ( _1 ) -# 16118 "parsing/parser.ml" +# 16423 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16152,24 +16457,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2135 "parsing/parser.mly" +# 2225 "parsing/parser.mly" ( Ppat_constraint(_1, _3) ) -# 16158 "parsing/parser.ml" +# 16463 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 16167 "parsing/parser.ml" +# 16472 "parsing/parser.ml" in -# 2136 "parsing/parser.mly" +# 2226 "parsing/parser.mly" ( _1 ) -# 16173 "parsing/parser.ml" +# 16478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16203,15 +16508,43 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2419 "parsing/parser.mly" +# 2481 "parsing/parser.mly" ( mkpatvar ~loc:_sloc _1 ) -# 16209 "parsing/parser.ml" +# 16514 "parsing/parser.ml" in -# 2487 "parsing/parser.mly" +# 2561 "parsing/parser.mly" ( (pat, exp) ) -# 16215 "parsing/parser.ml" +# 16520 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Asttypes.label) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.pattern * Parsetree.expression) = let _endpos = _endpos__1_ in + let _startpos = _startpos__1_ in + let _loc = (_startpos, _endpos) in + +# 2564 "parsing/parser.mly" + ( (mkpatvar ~loc:_loc _1, mkexpvar ~loc:_loc _1) ) +# 16548 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16262,10 +16595,10 @@ module Tables = struct let _startpos = _startpos_pat_ in let _endpos = _endpos_exp_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2489 "parsing/parser.mly" +# 2566 "parsing/parser.mly" ( let loc = (_startpos_pat_, _endpos_typ_) in (ghpat ~loc (Ppat_constraint(pat, typ)), exp) ) -# 16269 "parsing/parser.ml" +# 16602 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16302,9 +16635,9 @@ module Tables = struct let _startpos = _startpos_pat_ in let _endpos = _endpos_exp_ in let _v : (Parsetree.pattern * Parsetree.expression) = -# 2492 "parsing/parser.mly" +# 2569 "parsing/parser.mly" ( (pat, exp) ) -# 16308 "parsing/parser.ml" +# 16641 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16327,10 +16660,10 @@ module Tables = struct let _startpos = _startpos_body_ in let _endpos = _endpos_body_ in let _v : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = -# 2496 "parsing/parser.mly" +# 2573 "parsing/parser.mly" ( let let_pat, let_exp = body in let_pat, let_exp, [] ) -# 16334 "parsing/parser.ml" +# 16667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16362,9 +16695,9 @@ module Tables = struct } = _menhir_stack in let body : (Parsetree.pattern * Parsetree.expression) = Obj.magic body in let _1 : ( -# 634 "parsing/parser.mly" +# 688 "parsing/parser.mly" (string) -# 16368 "parsing/parser.ml" +# 16701 "parsing/parser.ml" ) = Obj.magic _1 in let bindings : (Parsetree.pattern * Parsetree.expression * Parsetree.binding_op list) = Obj.magic bindings in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -16375,22 +16708,22 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16381 "parsing/parser.ml" +# 16714 "parsing/parser.ml" in let _endpos = _endpos_body_ in let _symbolstartpos = _startpos_bindings_ in let _sloc = (_symbolstartpos, _endpos) in -# 2499 "parsing/parser.mly" +# 2576 "parsing/parser.mly" ( let let_pat, let_exp, rev_ands = bindings in let pbop_pat, pbop_exp = body in let pbop_loc = make_loc _sloc in let and_ = {pbop_op; pbop_pat; pbop_exp; pbop_loc} in let_pat, let_exp, and_ :: rev_ands ) -# 16394 "parsing/parser.ml" +# 16727 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16408,7 +16741,7 @@ module Tables = struct let _v : (Parsetree.class_declaration list) = # 211 "" ( [] ) -# 16412 "parsing/parser.ml" +# 16745 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16472,9 +16805,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 16478 "parsing/parser.ml" +# 16811 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -16487,9 +16820,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 16493 "parsing/parser.ml" +# 16826 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -16499,24 +16832,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16505 "parsing/parser.ml" +# 16838 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 16513 "parsing/parser.ml" +# 16846 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1737 "parsing/parser.mly" +# 1827 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -16524,13 +16857,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id body ~virt ~params ~attrs ~loc ~text ~docs ) -# 16528 "parsing/parser.ml" +# 16861 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 16534 "parsing/parser.ml" +# 16867 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16548,7 +16881,7 @@ module Tables = struct let _v : (Parsetree.class_description list) = # 211 "" ( [] ) -# 16552 "parsing/parser.ml" +# 16885 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16619,9 +16952,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _6 : unit = Obj.magic _6 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 16625 "parsing/parser.ml" +# 16958 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -16634,9 +16967,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 16640 "parsing/parser.ml" +# 16973 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -16646,24 +16979,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16652 "parsing/parser.ml" +# 16985 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 16660 "parsing/parser.ml" +# 16993 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2028 "parsing/parser.mly" +# 2118 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -16671,13 +17004,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id cty ~virt ~params ~attrs ~loc ~text ~docs ) -# 16675 "parsing/parser.ml" +# 17008 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 16681 "parsing/parser.ml" +# 17014 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16695,7 +17028,7 @@ module Tables = struct let _v : (Parsetree.class_type_declaration list) = # 211 "" ( [] ) -# 16699 "parsing/parser.ml" +# 17032 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16766,9 +17099,9 @@ module Tables = struct let csig : (Parsetree.class_type) = Obj.magic csig in let _6 : unit = Obj.magic _6 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 16772 "parsing/parser.ml" +# 17105 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -16781,9 +17114,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 16787 "parsing/parser.ml" +# 17120 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -16793,24 +17126,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16799 "parsing/parser.ml" +# 17132 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 16807 "parsing/parser.ml" +# 17140 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2067 "parsing/parser.mly" +# 2157 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -16818,13 +17151,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Ci.mk id csig ~virt ~params ~attrs ~loc ~text ~docs ) -# 16822 "parsing/parser.ml" +# 17155 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 16828 "parsing/parser.ml" +# 17161 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16842,7 +17175,7 @@ module Tables = struct let _v : (Parsetree.module_binding list) = # 211 "" ( [] ) -# 16846 "parsing/parser.ml" +# 17179 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16903,9 +17236,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 16909 "parsing/parser.ml" +# 17242 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -16915,24 +17248,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 16921 "parsing/parser.ml" +# 17254 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 16929 "parsing/parser.ml" +# 17262 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1418 "parsing/parser.mly" +# 1489 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -16940,13 +17273,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Mb.mk name body ~attrs ~loc ~text ~docs ) -# 16944 "parsing/parser.ml" +# 17277 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 16950 "parsing/parser.ml" +# 17283 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -16964,7 +17297,7 @@ module Tables = struct let _v : (Parsetree.module_declaration list) = # 211 "" ( [] ) -# 16968 "parsing/parser.ml" +# 17301 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17032,9 +17365,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 17038 "parsing/parser.ml" +# 17371 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17044,24 +17377,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17050 "parsing/parser.ml" +# 17383 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 17058 "parsing/parser.ml" +# 17391 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1695 "parsing/parser.mly" +# 1768 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let docs = symbol_docs _sloc in @@ -17069,13 +17402,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Md.mk name mty ~attrs ~loc ~text ~docs ) -# 17073 "parsing/parser.ml" +# 17406 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17079 "parsing/parser.ml" +# 17412 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17093,7 +17426,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 211 "" ( [] ) -# 17097 "parsing/parser.ml" +# 17430 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17125,7 +17458,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 213 "" ( x :: xs ) -# 17129 "parsing/parser.ml" +# 17462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17143,7 +17476,7 @@ module Tables = struct let _v : (Parsetree.type_declaration list) = # 211 "" ( [] ) -# 17147 "parsing/parser.ml" +# 17480 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17208,9 +17541,9 @@ module Tables = struct let xs_inlined1 : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = Obj.magic xs_inlined1 in let kind_priv_manifest : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic kind_priv_manifest in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 17214 "parsing/parser.ml" +# 17547 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -17223,9 +17556,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 17229 "parsing/parser.ml" +# 17562 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -17234,18 +17567,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 17238 "parsing/parser.ml" +# 17571 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 17243 "parsing/parser.ml" +# 17576 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 17249 "parsing/parser.ml" +# 17582 "parsing/parser.ml" in let id = @@ -17254,24 +17587,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17260 "parsing/parser.ml" +# 17593 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 17268 "parsing/parser.ml" +# 17601 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2881 "parsing/parser.mly" +# 2961 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -17280,13 +17613,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text ) -# 17284 "parsing/parser.ml" +# 17617 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17290 "parsing/parser.ml" +# 17623 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17304,7 +17637,7 @@ module Tables = struct let _v : (Parsetree.type_declaration list) = # 211 "" ( [] ) -# 17308 "parsing/parser.ml" +# 17641 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17376,9 +17709,9 @@ module Tables = struct let _2 : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = Obj.magic _2 in let _1_inlined3 : unit = Obj.magic _1_inlined3 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 17382 "parsing/parser.ml" +# 17715 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -17391,9 +17724,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 17397 "parsing/parser.ml" +# 17730 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -17402,26 +17735,26 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 17406 "parsing/parser.ml" +# 17739 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 17411 "parsing/parser.ml" +# 17744 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 17417 "parsing/parser.ml" +# 17750 "parsing/parser.ml" in let kind_priv_manifest = let _1 = _1_inlined3 in -# 2927 "parsing/parser.mly" +# 3007 "parsing/parser.mly" ( _2 ) -# 17425 "parsing/parser.ml" +# 17758 "parsing/parser.ml" in let id = @@ -17430,24 +17763,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 17436 "parsing/parser.ml" +# 17769 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 17444 "parsing/parser.ml" +# 17777 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2881 "parsing/parser.mly" +# 2961 "parsing/parser.mly" ( let (kind, priv, manifest) = kind_priv_manifest in let docs = symbol_docs _sloc in @@ -17456,13 +17789,13 @@ module Tables = struct let text = symbol_text _symbolstartpos in Type.mk id ~params ~cstrs ~kind ~priv ?manifest ~attrs ~loc ~docs ~text ) -# 17460 "parsing/parser.ml" +# 17793 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17466 "parsing/parser.ml" +# 17799 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17480,7 +17813,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 211 "" ( [] ) -# 17484 "parsing/parser.ml" +# 17817 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17512,7 +17845,7 @@ module Tables = struct let _v : (Parsetree.attributes) = # 213 "" ( x :: xs ) -# 17516 "parsing/parser.ml" +# 17849 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17530,7 +17863,7 @@ module Tables = struct let _v : (Parsetree.signature_item list list) = # 211 "" ( [] ) -# 17534 "parsing/parser.ml" +# 17867 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17563,21 +17896,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 827 "parsing/parser.mly" +# 893 "parsing/parser.mly" ( text_sig _startpos ) -# 17569 "parsing/parser.ml" +# 17902 "parsing/parser.ml" in -# 1556 "parsing/parser.mly" +# 1627 "parsing/parser.mly" ( _1 ) -# 17575 "parsing/parser.ml" +# 17908 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17581 "parsing/parser.ml" +# 17914 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17610,21 +17943,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 825 "parsing/parser.mly" +# 891 "parsing/parser.mly" ( text_sig _startpos @ [_1] ) -# 17616 "parsing/parser.ml" +# 17949 "parsing/parser.ml" in -# 1556 "parsing/parser.mly" +# 1627 "parsing/parser.mly" ( _1 ) -# 17622 "parsing/parser.ml" +# 17955 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17628 "parsing/parser.ml" +# 17961 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17642,7 +17975,7 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = # 211 "" ( [] ) -# 17646 "parsing/parser.ml" +# 17979 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17675,40 +18008,40 @@ module Tables = struct let _1 = let ys = let items = -# 887 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( [] ) -# 17681 "parsing/parser.ml" +# 18014 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1372 "parsing/parser.mly" ( items ) -# 17686 "parsing/parser.ml" +# 18019 "parsing/parser.ml" in let xs = let _startpos = _startpos__1_ in -# 823 "parsing/parser.mly" +# 889 "parsing/parser.mly" ( text_str _startpos ) -# 17694 "parsing/parser.ml" +# 18027 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 17700 "parsing/parser.ml" +# 18033 "parsing/parser.ml" in -# 1317 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( _1 ) -# 17706 "parsing/parser.ml" +# 18039 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17712 "parsing/parser.ml" +# 18045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17760,70 +18093,70 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 17766 "parsing/parser.ml" +# 18099 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1379 "parsing/parser.mly" ( mkstrexp e attrs ) -# 17771 "parsing/parser.ml" +# 18104 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 887 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 17779 "parsing/parser.ml" +# 18112 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 840 "parsing/parser.mly" +# 906 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 17789 "parsing/parser.ml" +# 18122 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( x ) -# 17795 "parsing/parser.ml" +# 18128 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1372 "parsing/parser.mly" ( items ) -# 17801 "parsing/parser.ml" +# 18134 "parsing/parser.ml" in let xs = let _startpos = _startpos__1_ in -# 823 "parsing/parser.mly" +# 889 "parsing/parser.mly" ( text_str _startpos ) -# 17809 "parsing/parser.ml" +# 18142 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 17815 "parsing/parser.ml" +# 18148 "parsing/parser.ml" in -# 1317 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( _1 ) -# 17821 "parsing/parser.ml" +# 18154 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17827 "parsing/parser.ml" +# 18160 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17856,21 +18189,21 @@ module Tables = struct let _1 = let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 887 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 17862 "parsing/parser.ml" +# 18195 "parsing/parser.ml" in -# 1317 "parsing/parser.mly" +# 1388 "parsing/parser.mly" ( _1 ) -# 17868 "parsing/parser.ml" +# 18201 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17874 "parsing/parser.ml" +# 18207 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17888,7 +18221,7 @@ module Tables = struct let _v : (Parsetree.class_type_field list list) = # 211 "" ( [] ) -# 17892 "parsing/parser.ml" +# 18225 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17920,15 +18253,15 @@ module Tables = struct let _v : (Parsetree.class_type_field list list) = let x = let _startpos = _startpos__1_ in -# 835 "parsing/parser.mly" +# 901 "parsing/parser.mly" ( text_csig _startpos @ [_1] ) -# 17926 "parsing/parser.ml" +# 18259 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17932 "parsing/parser.ml" +# 18265 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17946,7 +18279,7 @@ module Tables = struct let _v : (Parsetree.class_field list list) = # 211 "" ( [] ) -# 17950 "parsing/parser.ml" +# 18283 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -17978,15 +18311,15 @@ module Tables = struct let _v : (Parsetree.class_field list list) = let x = let _startpos = _startpos__1_ in -# 833 "parsing/parser.mly" +# 899 "parsing/parser.mly" ( text_cstr _startpos @ [_1] ) -# 17984 "parsing/parser.ml" +# 18317 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 17990 "parsing/parser.ml" +# 18323 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18004,7 +18337,7 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = # 211 "" ( [] ) -# 18008 "parsing/parser.ml" +# 18341 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18036,15 +18369,15 @@ module Tables = struct let _v : (Parsetree.structure_item list list) = let x = let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 887 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 18042 "parsing/parser.ml" +# 18375 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18048 "parsing/parser.ml" +# 18381 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18062,7 +18395,7 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase list list) = # 211 "" ( [] ) -# 18066 "parsing/parser.ml" +# 18399 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18095,32 +18428,32 @@ module Tables = struct let _1 = let x = let _1 = -# 887 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( [] ) -# 18101 "parsing/parser.ml" +# 18434 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1185 "parsing/parser.mly" ( _1 ) -# 18106 "parsing/parser.ml" +# 18439 "parsing/parser.ml" in # 183 "" ( x ) -# 18112 "parsing/parser.ml" +# 18445 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 18118 "parsing/parser.ml" +# 18451 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18124 "parsing/parser.ml" +# 18457 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18172,58 +18505,58 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 18178 "parsing/parser.ml" +# 18511 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1379 "parsing/parser.mly" ( mkstrexp e attrs ) -# 18183 "parsing/parser.ml" +# 18516 "parsing/parser.ml" in -# 831 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( Ptop_def [_1] ) -# 18189 "parsing/parser.ml" +# 18522 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 895 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 18197 "parsing/parser.ml" +# 18530 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( x ) -# 18203 "parsing/parser.ml" +# 18536 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1185 "parsing/parser.mly" ( _1 ) -# 18209 "parsing/parser.ml" +# 18542 "parsing/parser.ml" in # 183 "" ( x ) -# 18215 "parsing/parser.ml" +# 18548 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 18221 "parsing/parser.ml" +# 18554 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18227 "parsing/parser.ml" +# 18560 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18255,27 +18588,27 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase list list) = let x = let _1 = let _1 = -# 831 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( Ptop_def [_1] ) -# 18261 "parsing/parser.ml" +# 18594 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 895 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 18267 "parsing/parser.ml" +# 18600 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 18273 "parsing/parser.ml" +# 18606 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18279 "parsing/parser.ml" +# 18612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18310,29 +18643,29 @@ module Tables = struct let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 840 "parsing/parser.mly" +# 906 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 18317 "parsing/parser.ml" +# 18650 "parsing/parser.ml" in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 895 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 18324 "parsing/parser.ml" +# 18657 "parsing/parser.ml" in -# 1129 "parsing/parser.mly" +# 1197 "parsing/parser.mly" ( _1 ) -# 18330 "parsing/parser.ml" +# 18663 "parsing/parser.ml" in # 213 "" ( x :: xs ) -# 18336 "parsing/parser.ml" +# 18669 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18371,7 +18704,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = # 124 "" ( None ) -# 18375 "parsing/parser.ml" +# 18708 "parsing/parser.ml" in let x = let label = @@ -18379,9 +18712,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 18385 "parsing/parser.ml" +# 18718 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -18389,7 +18722,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2767 "parsing/parser.mly" +# 2847 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -18403,13 +18736,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 18407 "parsing/parser.ml" +# 18740 "parsing/parser.ml" in -# 1056 "parsing/parser.mly" +# 1122 "parsing/parser.mly" ( [x], None ) -# 18413 "parsing/parser.ml" +# 18746 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18455,7 +18788,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.pattern) list * unit option) = let _2 = # 126 "" ( Some x ) -# 18459 "parsing/parser.ml" +# 18792 "parsing/parser.ml" in let x = let label = @@ -18463,9 +18796,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 18469 "parsing/parser.ml" +# 18802 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -18473,7 +18806,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2767 "parsing/parser.mly" +# 2847 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -18487,13 +18820,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 18491 "parsing/parser.ml" +# 18824 "parsing/parser.ml" in -# 1056 "parsing/parser.mly" +# 1122 "parsing/parser.mly" ( [x], None ) -# 18497 "parsing/parser.ml" +# 18830 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18556,9 +18889,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 18562 "parsing/parser.ml" +# 18895 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -18566,7 +18899,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2767 "parsing/parser.mly" +# 2847 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -18580,13 +18913,13 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 18584 "parsing/parser.ml" +# 18917 "parsing/parser.ml" in -# 1058 "parsing/parser.mly" +# 1124 "parsing/parser.mly" ( [x], Some y ) -# 18590 "parsing/parser.ml" +# 18923 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18642,9 +18975,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 18648 "parsing/parser.ml" +# 18981 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -18652,7 +18985,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2767 "parsing/parser.mly" +# 2847 "parsing/parser.mly" ( let label, pat = match opat with | None -> @@ -18666,14 +18999,14 @@ module Tables = struct in label, mkpat_opt_constraint ~loc:_sloc pat octy ) -# 18670 "parsing/parser.ml" +# 19003 "parsing/parser.ml" in -# 1062 "parsing/parser.mly" +# 1128 "parsing/parser.mly" ( let xs, y = tail in x :: xs, y ) -# 18677 "parsing/parser.ml" +# 19010 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18710,9 +19043,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.case) = -# 2525 "parsing/parser.mly" +# 2602 "parsing/parser.mly" ( Exp.case _1 _3 ) -# 18716 "parsing/parser.ml" +# 19049 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18763,9 +19096,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.case) = -# 2527 "parsing/parser.mly" +# 2604 "parsing/parser.mly" ( Exp.case _1 ~guard:_3 _5 ) -# 18769 "parsing/parser.ml" +# 19102 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18803,9 +19136,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.case) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2529 "parsing/parser.mly" +# 2606 "parsing/parser.mly" ( Exp.case _1 (Exp.unreachable ~loc:(make_loc _loc__3_) ()) ) -# 18809 "parsing/parser.ml" +# 19142 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18866,9 +19199,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 18872 "parsing/parser.ml" +# 19205 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -18877,49 +19210,49 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 18883 "parsing/parser.ml" +# 19216 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 18892 "parsing/parser.ml" +# 19225 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3184 "parsing/parser.mly" +# 3268 "parsing/parser.mly" ( _1 ) -# 18901 "parsing/parser.ml" +# 19234 "parsing/parser.ml" in let _1 = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 18908 "parsing/parser.ml" +# 19241 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 18916 "parsing/parser.ml" +# 19249 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3394 "parsing/parser.mly" +# 3478 "parsing/parser.mly" ( let info = match rhs_info _endpos__4_ with | Some _ as info_before_semi -> info_before_semi @@ -18927,13 +19260,13 @@ module Tables = struct in let attrs = add_info_attrs info (_4 @ _6) in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 18931 "parsing/parser.ml" +# 19264 "parsing/parser.ml" in -# 3375 "parsing/parser.mly" +# 3459 "parsing/parser.mly" ( let (f, c) = tail in (head :: f, c) ) -# 18937 "parsing/parser.ml" +# 19270 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -18974,15 +19307,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3405 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 18980 "parsing/parser.ml" +# 19313 "parsing/parser.ml" in -# 3375 "parsing/parser.mly" +# 3459 "parsing/parser.mly" ( let (f, c) = tail in (head :: f, c) ) -# 18986 "parsing/parser.ml" +# 19319 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19036,9 +19369,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19042 "parsing/parser.ml" +# 19375 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -19047,49 +19380,49 @@ module Tables = struct let _6 = let _1 = _1_inlined3 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19053 "parsing/parser.ml" +# 19386 "parsing/parser.ml" in let _endpos__6_ = _endpos__1_inlined3_ in let _4 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19062 "parsing/parser.ml" +# 19395 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3184 "parsing/parser.mly" +# 3268 "parsing/parser.mly" ( _1 ) -# 19071 "parsing/parser.ml" +# 19404 "parsing/parser.ml" in let _1 = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19078 "parsing/parser.ml" +# 19411 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19086 "parsing/parser.ml" +# 19419 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3394 "parsing/parser.mly" +# 3478 "parsing/parser.mly" ( let info = match rhs_info _endpos__4_ with | Some _ as info_before_semi -> info_before_semi @@ -19097,13 +19430,13 @@ module Tables = struct in let attrs = add_info_attrs info (_4 @ _6) in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 19101 "parsing/parser.ml" +# 19434 "parsing/parser.ml" in -# 3378 "parsing/parser.mly" +# 3462 "parsing/parser.mly" ( [head], Closed ) -# 19107 "parsing/parser.ml" +# 19440 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19137,15 +19470,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3405 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 19143 "parsing/parser.ml" +# 19476 "parsing/parser.ml" in -# 3378 "parsing/parser.mly" +# 3462 "parsing/parser.mly" ( [head], Closed ) -# 19149 "parsing/parser.ml" +# 19482 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19185,9 +19518,9 @@ module Tables = struct let _1_inlined1 : (Parsetree.core_type) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19191 "parsing/parser.ml" +# 19524 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -19196,50 +19529,50 @@ module Tables = struct let _4 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19202 "parsing/parser.ml" +# 19535 "parsing/parser.ml" in let _endpos__4_ = _endpos__1_inlined2_ in let _3 = let _1 = _1_inlined1 in -# 3184 "parsing/parser.mly" +# 3268 "parsing/parser.mly" ( _1 ) -# 19211 "parsing/parser.ml" +# 19544 "parsing/parser.ml" in let _1 = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19218 "parsing/parser.ml" +# 19551 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19226 "parsing/parser.ml" +# 19559 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3387 "parsing/parser.mly" +# 3471 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _4 in Of.tag ~loc:(make_loc _sloc) ~attrs _1 _3 ) -# 19237 "parsing/parser.ml" +# 19570 "parsing/parser.ml" in -# 3381 "parsing/parser.mly" +# 3465 "parsing/parser.mly" ( [head], Closed ) -# 19243 "parsing/parser.ml" +# 19576 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19266,15 +19599,15 @@ module Tables = struct let _symbolstartpos = _startpos_ty_ in let _sloc = (_symbolstartpos, _endpos) in -# 3405 "parsing/parser.mly" +# 3489 "parsing/parser.mly" ( Of.inherit_ ~loc:(make_loc _sloc) ty ) -# 19272 "parsing/parser.ml" +# 19605 "parsing/parser.ml" in -# 3381 "parsing/parser.mly" +# 3465 "parsing/parser.mly" ( [head], Closed ) -# 19278 "parsing/parser.ml" +# 19611 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19297,9 +19630,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.object_field list * Asttypes.closed_flag) = -# 3383 "parsing/parser.mly" +# 3467 "parsing/parser.mly" ( [], Open ) -# 19303 "parsing/parser.ml" +# 19636 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19344,9 +19677,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19350 "parsing/parser.ml" +# 19683 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let private_ : (Asttypes.private_flag) = Obj.magic private_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -19358,41 +19691,41 @@ module Tables = struct Parsetree.attributes) = let ty = let _1 = _1_inlined2 in -# 3180 "parsing/parser.mly" +# 3264 "parsing/parser.mly" ( _1 ) -# 19364 "parsing/parser.ml" +# 19697 "parsing/parser.ml" in let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19372 "parsing/parser.ml" +# 19705 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19380 "parsing/parser.ml" +# 19713 "parsing/parser.ml" in let attrs = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19386 "parsing/parser.ml" +# 19719 "parsing/parser.ml" in let _1 = -# 3646 "parsing/parser.mly" +# 3734 "parsing/parser.mly" ( Fresh ) -# 19391 "parsing/parser.ml" +# 19724 "parsing/parser.ml" in -# 1875 "parsing/parser.mly" +# 1965 "parsing/parser.mly" ( (label, private_, Cfk_virtual ty), attrs ) -# 19396 "parsing/parser.ml" +# 19729 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19430,9 +19763,9 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19436 "parsing/parser.ml" +# 19769 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -19444,36 +19777,36 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19450 "parsing/parser.ml" +# 19783 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19458 "parsing/parser.ml" +# 19791 "parsing/parser.ml" in let _2 = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19464 "parsing/parser.ml" +# 19797 "parsing/parser.ml" in let _1 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 19469 "parsing/parser.ml" +# 19802 "parsing/parser.ml" in -# 1877 "parsing/parser.mly" +# 1967 "parsing/parser.mly" ( let e = _5 in let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in (_4, _3, Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 19477 "parsing/parser.ml" +# 19810 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19517,9 +19850,9 @@ module Tables = struct } = _menhir_stack in let _5 : (Parsetree.expression) = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19523 "parsing/parser.ml" +# 19856 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -19532,39 +19865,39 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19538 "parsing/parser.ml" +# 19871 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19546 "parsing/parser.ml" +# 19879 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19554 "parsing/parser.ml" +# 19887 "parsing/parser.ml" in let _1 = -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 19560 "parsing/parser.ml" +# 19893 "parsing/parser.ml" in -# 1877 "parsing/parser.mly" +# 1967 "parsing/parser.mly" ( let e = _5 in let loc = Location.(e.pexp_loc.loc_start, e.pexp_loc.loc_end) in (_4, _3, Cfk_concrete (_1, ghexp ~loc (Pexp_poly (e, None)))), _2 ) -# 19568 "parsing/parser.ml" +# 19901 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19623,9 +19956,9 @@ module Tables = struct let _1_inlined2 : (Parsetree.core_type) = Obj.magic _1_inlined2 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19629 "parsing/parser.ml" +# 19962 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -19637,45 +19970,45 @@ module Tables = struct Parsetree.attributes) = let _6 = let _1 = _1_inlined2 in -# 3180 "parsing/parser.mly" +# 3264 "parsing/parser.mly" ( _1 ) -# 19643 "parsing/parser.ml" +# 19976 "parsing/parser.ml" in let _startpos__6_ = _startpos__1_inlined2_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19652 "parsing/parser.ml" +# 19985 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19660 "parsing/parser.ml" +# 19993 "parsing/parser.ml" in let _2 = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19666 "parsing/parser.ml" +# 19999 "parsing/parser.ml" in let _1 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 19671 "parsing/parser.ml" +# 20004 "parsing/parser.ml" in -# 1883 "parsing/parser.mly" +# 1973 "parsing/parser.mly" ( let poly_exp = let loc = (_startpos__6_, _endpos__8_) in ghexp ~loc (Pexp_poly(_8, Some _6)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 19679 "parsing/parser.ml" +# 20012 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19740,9 +20073,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.core_type) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19746 "parsing/parser.ml" +# 20079 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -19755,48 +20088,48 @@ module Tables = struct Parsetree.attributes) = let _6 = let _1 = _1_inlined3 in -# 3180 "parsing/parser.mly" +# 3264 "parsing/parser.mly" ( _1 ) -# 19761 "parsing/parser.ml" +# 20094 "parsing/parser.ml" in let _startpos__6_ = _startpos__1_inlined3_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19770 "parsing/parser.ml" +# 20103 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19778 "parsing/parser.ml" +# 20111 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19786 "parsing/parser.ml" +# 20119 "parsing/parser.ml" in let _1 = -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 19792 "parsing/parser.ml" +# 20125 "parsing/parser.ml" in -# 1883 "parsing/parser.mly" +# 1973 "parsing/parser.mly" ( let poly_exp = let loc = (_startpos__6_, _endpos__8_) in ghexp ~loc (Pexp_poly(_8, Some _6)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 19800 "parsing/parser.ml" +# 20133 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -19876,9 +20209,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 19882 "parsing/parser.ml" +# 20215 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -19888,38 +20221,38 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * Parsetree.class_field_kind) * Parsetree.attributes) = let _7 = -# 2416 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( xs ) -# 19894 "parsing/parser.ml" +# 20227 "parsing/parser.ml" in let _startpos__7_ = _startpos_xs_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 19902 "parsing/parser.ml" +# 20235 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 19910 "parsing/parser.ml" +# 20243 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 19917 "parsing/parser.ml" +# 20250 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 19923 "parsing/parser.ml" +# 20256 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__11_ in @@ -19935,7 +20268,7 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1889 "parsing/parser.mly" +# 1979 "parsing/parser.mly" ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in let poly_exp = let exp, poly = @@ -19946,7 +20279,7 @@ module Tables = struct ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 19950 "parsing/parser.ml" +# 20283 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20032,9 +20365,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 20038 "parsing/parser.ml" +# 20371 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.private_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -20045,41 +20378,41 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Asttypes.private_flag * Parsetree.class_field_kind) * Parsetree.attributes) = let _7 = -# 2416 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( xs ) -# 20051 "parsing/parser.ml" +# 20384 "parsing/parser.ml" in let _startpos__7_ = _startpos_xs_ in let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 20059 "parsing/parser.ml" +# 20392 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 20067 "parsing/parser.ml" +# 20400 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 20076 "parsing/parser.ml" +# 20409 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 20083 "parsing/parser.ml" +# 20416 "parsing/parser.ml" in let _endpos = _endpos__11_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -20094,7 +20427,7 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1889 "parsing/parser.mly" +# 1979 "parsing/parser.mly" ( let poly_exp_loc = (_startpos__7_, _endpos__11_) in let poly_exp = let exp, poly = @@ -20105,7 +20438,7 @@ module Tables = struct ghexp ~loc:poly_exp_loc (Pexp_poly(exp, Some poly)) in (_4, _3, Cfk_concrete (_1, poly_exp)), _2 ) -# 20109 "parsing/parser.ml" +# 20442 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20124,17 +20457,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 20130 "parsing/parser.ml" +# 20463 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20138 "parsing/parser.ml" +# 20471 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20165,9 +20498,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 20171 "parsing/parser.ml" +# 20504 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -20175,9 +20508,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20181 "parsing/parser.ml" +# 20514 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20196,17 +20529,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 20202 "parsing/parser.ml" +# 20535 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20210 "parsing/parser.ml" +# 20543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20237,9 +20570,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 20243 "parsing/parser.ml" +# 20576 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -20247,9 +20580,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20253 "parsing/parser.ml" +# 20586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20272,14 +20605,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = let _1 = -# 3543 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( _1 ) -# 20278 "parsing/parser.ml" +# 20611 "parsing/parser.ml" in -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20283 "parsing/parser.ml" +# 20616 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20317,20 +20650,20 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _1 = let _1 = -# 3486 "parsing/parser.mly" +# 3570 "parsing/parser.mly" ( "::" ) -# 20323 "parsing/parser.ml" +# 20656 "parsing/parser.ml" in -# 3543 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( _1 ) -# 20328 "parsing/parser.ml" +# 20661 "parsing/parser.ml" in -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20334 "parsing/parser.ml" +# 20667 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20353,14 +20686,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = let _1 = -# 3543 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( _1 ) -# 20359 "parsing/parser.ml" +# 20692 "parsing/parser.ml" in -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20364 "parsing/parser.ml" +# 20697 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20399,15 +20732,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let _1 = _1_inlined1 in -# 3543 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( _1 ) -# 20405 "parsing/parser.ml" +# 20738 "parsing/parser.ml" in -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20411 "parsing/parser.ml" +# 20744 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20460,20 +20793,20 @@ module Tables = struct let _v : (Longident.t) = let _3 = let (_2, _1) = (_2_inlined1, _1_inlined1) in let _1 = -# 3486 "parsing/parser.mly" +# 3570 "parsing/parser.mly" ( "::" ) -# 20466 "parsing/parser.ml" +# 20799 "parsing/parser.ml" in -# 3543 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( _1 ) -# 20471 "parsing/parser.ml" +# 20804 "parsing/parser.ml" in -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20477 "parsing/parser.ml" +# 20810 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20512,15 +20845,15 @@ module Tables = struct let _v : (Longident.t) = let _3 = let _1 = _1_inlined1 in -# 3543 "parsing/parser.mly" +# 3628 "parsing/parser.mly" ( _1 ) -# 20518 "parsing/parser.ml" +# 20851 "parsing/parser.ml" in -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20524 "parsing/parser.ml" +# 20857 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20543,9 +20876,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20549 "parsing/parser.ml" +# 20882 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20582,9 +20915,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20588 "parsing/parser.ml" +# 20921 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20603,17 +20936,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 20609 "parsing/parser.ml" +# 20942 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20617 "parsing/parser.ml" +# 20950 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20644,9 +20977,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 20650 "parsing/parser.ml" +# 20983 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -20654,9 +20987,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20660 "parsing/parser.ml" +# 20993 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20675,17 +21008,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 20681 "parsing/parser.ml" +# 21014 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20689 "parsing/parser.ml" +# 21022 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20716,9 +21049,9 @@ module Tables = struct }; } = _menhir_stack in let _3 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 20722 "parsing/parser.ml" +# 21055 "parsing/parser.ml" ) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : (Longident.t) = Obj.magic _1 in @@ -20726,9 +21059,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20732 "parsing/parser.ml" +# 21065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20751,9 +21084,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3506 "parsing/parser.mly" +# 3590 "parsing/parser.mly" ( Lident _1 ) -# 20757 "parsing/parser.ml" +# 21090 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20790,9 +21123,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Longident.t) = -# 3507 "parsing/parser.mly" +# 3591 "parsing/parser.mly" ( Ldot(_1,_3) ) -# 20796 "parsing/parser.ml" +# 21129 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20815,9 +21148,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3522 "parsing/parser.mly" +# 3606 "parsing/parser.mly" ( _1 ) -# 20821 "parsing/parser.ml" +# 21154 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20864,9 +21197,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3524 "parsing/parser.mly" +# 3608 "parsing/parser.mly" ( lapply ~loc:_sloc _1 _3 ) -# 20870 "parsing/parser.ml" +# 21203 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20904,9 +21237,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Longident.t) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3526 "parsing/parser.mly" +# 3610 "parsing/parser.mly" ( expecting _loc__3_ "module path" ) -# 20910 "parsing/parser.ml" +# 21243 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20929,9 +21262,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3519 "parsing/parser.mly" +# 3603 "parsing/parser.mly" ( _1 ) -# 20935 "parsing/parser.ml" +# 21268 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -20961,9 +21294,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = -# 1377 "parsing/parser.mly" +# 1448 "parsing/parser.mly" ( me ) -# 20967 "parsing/parser.ml" +# 21300 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21008,24 +21341,24 @@ module Tables = struct let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1380 "parsing/parser.mly" +# 1451 "parsing/parser.mly" ( Pmod_constraint(me, mty) ) -# 21014 "parsing/parser.ml" +# 21347 "parsing/parser.ml" in let _endpos__1_ = _endpos_me_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 926 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21023 "parsing/parser.ml" +# 21356 "parsing/parser.ml" in -# 1384 "parsing/parser.mly" +# 1455 "parsing/parser.mly" ( _1 ) -# 21029 "parsing/parser.ml" +# 21362 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21056,25 +21389,25 @@ module Tables = struct let _endpos = _endpos_body_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1382 "parsing/parser.mly" +# 1453 "parsing/parser.mly" ( let (_, arg) = arg_and_pos in Pmod_functor(arg, body) ) -# 21063 "parsing/parser.ml" +# 21396 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 926 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21072 "parsing/parser.ml" +# 21405 "parsing/parser.ml" in -# 1384 "parsing/parser.mly" +# 1455 "parsing/parser.mly" ( _1 ) -# 21078 "parsing/parser.ml" +# 21411 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21104,9 +21437,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_mty_ in let _v : (Parsetree.module_type) = -# 1621 "parsing/parser.mly" +# 1694 "parsing/parser.mly" ( mty ) -# 21110 "parsing/parser.ml" +# 21443 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21137,25 +21470,25 @@ module Tables = struct let _endpos = _endpos_body_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1624 "parsing/parser.mly" +# 1697 "parsing/parser.mly" ( let (_, arg) = arg_and_pos in Pmty_functor(arg, body) ) -# 21144 "parsing/parser.ml" +# 21477 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_body_, _startpos_arg_and_pos_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 928 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 21153 "parsing/parser.ml" +# 21486 "parsing/parser.ml" in -# 1627 "parsing/parser.mly" +# 1700 "parsing/parser.mly" ( _1 ) -# 21159 "parsing/parser.ml" +# 21492 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21201,18 +21534,18 @@ module Tables = struct let _v : (Parsetree.module_expr) = let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21207 "parsing/parser.ml" +# 21540 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1216 "parsing/parser.mly" +# 1287 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_structure s) ) -# 21216 "parsing/parser.ml" +# 21549 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21258,17 +21591,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21264 "parsing/parser.ml" +# 21597 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1218 "parsing/parser.mly" +# 1289 "parsing/parser.mly" ( unclosed "struct" _loc__1_ "end" _loc__4_ ) -# 21272 "parsing/parser.ml" +# 21605 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21321,30 +21654,30 @@ module Tables = struct let _v : (Parsetree.module_expr) = let args = let _1 = _1_inlined2 in -# 1182 "parsing/parser.mly" +# 1253 "parsing/parser.mly" ( _1 ) -# 21327 "parsing/parser.ml" +# 21660 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21335 "parsing/parser.ml" +# 21668 "parsing/parser.ml" in let _endpos = _endpos_me_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1220 "parsing/parser.mly" +# 1291 "parsing/parser.mly" ( wrap_mod_attrs ~loc:_sloc attrs ( List.fold_left (fun acc (startpos, arg) -> mkmod ~loc:(startpos, _endpos) (Pmod_functor (arg, acc)) ) me args ) ) -# 21348 "parsing/parser.ml" +# 21681 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21367,9 +21700,9 @@ module Tables = struct let _startpos = _startpos_me_ in let _endpos = _endpos_me_ in let _v : (Parsetree.module_expr) = -# 1226 "parsing/parser.mly" +# 1297 "parsing/parser.mly" ( me ) -# 21373 "parsing/parser.ml" +# 21706 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21399,9 +21732,9 @@ module Tables = struct let _startpos = _startpos_me_ in let _endpos = _endpos_attr_ in let _v : (Parsetree.module_expr) = -# 1228 "parsing/parser.mly" +# 1299 "parsing/parser.mly" ( Mod.attr me attr ) -# 21405 "parsing/parser.ml" +# 21738 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21430,30 +21763,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21436 "parsing/parser.ml" +# 21769 "parsing/parser.ml" in -# 1232 "parsing/parser.mly" +# 1303 "parsing/parser.mly" ( Pmod_ident x ) -# 21442 "parsing/parser.ml" +# 21775 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 926 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21451 "parsing/parser.ml" +# 21784 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1315 "parsing/parser.mly" ( _1 ) -# 21457 "parsing/parser.ml" +# 21790 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21484,24 +21817,24 @@ module Tables = struct let _endpos = _endpos_me2_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1235 "parsing/parser.mly" +# 1306 "parsing/parser.mly" ( Pmod_apply(me1, me2) ) -# 21490 "parsing/parser.ml" +# 21823 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_me2_, _startpos_me1_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 926 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21499 "parsing/parser.ml" +# 21832 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1315 "parsing/parser.mly" ( _1 ) -# 21505 "parsing/parser.ml" +# 21838 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21543,10 +21876,10 @@ module Tables = struct let _symbolstartpos = _startpos_me1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1238 "parsing/parser.mly" +# 1309 "parsing/parser.mly" ( (* TODO review mkmod location *) Pmod_apply(me1, mkmod ~loc:_sloc (Pmod_structure [])) ) -# 21550 "parsing/parser.ml" +# 21883 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_me1_) in @@ -21554,15 +21887,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 926 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21560 "parsing/parser.ml" +# 21893 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1315 "parsing/parser.mly" ( _1 ) -# 21566 "parsing/parser.ml" +# 21899 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21586,24 +21919,24 @@ module Tables = struct let _endpos = _endpos_ex_ in let _v : (Parsetree.module_expr) = let _1 = let _1 = -# 1242 "parsing/parser.mly" +# 1313 "parsing/parser.mly" ( Pmod_extension ex ) -# 21592 "parsing/parser.ml" +# 21925 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_ex_, _startpos_ex_) in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 860 "parsing/parser.mly" +# 926 "parsing/parser.mly" ( mkmod ~loc:_sloc _1 ) -# 21601 "parsing/parser.ml" +# 21934 "parsing/parser.ml" in -# 1244 "parsing/parser.mly" +# 1315 "parsing/parser.mly" ( _1 ) -# 21607 "parsing/parser.ml" +# 21940 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21622,17 +21955,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let x : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 21628 "parsing/parser.ml" +# 21961 "parsing/parser.ml" ) = Obj.magic x in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (string option) = -# 1199 "parsing/parser.mly" +# 1270 "parsing/parser.mly" ( Some x ) -# 21636 "parsing/parser.ml" +# 21969 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21655,9 +21988,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string option) = -# 1202 "parsing/parser.mly" +# 1273 "parsing/parser.mly" ( None ) -# 21661 "parsing/parser.ml" +# 21994 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21715,9 +22048,9 @@ module Tables = struct let _1_inlined3 : (Longident.t) = Obj.magic _1_inlined3 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 21721 "parsing/parser.ml" +# 22054 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let ext : (string Asttypes.loc option) = Obj.magic ext in @@ -21728,9 +22061,9 @@ module Tables = struct let _v : (Parsetree.module_substitution * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 21734 "parsing/parser.ml" +# 22067 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -21740,9 +22073,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21746 "parsing/parser.ml" +# 22079 "parsing/parser.ml" in let uid = @@ -21751,31 +22084,31 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21757 "parsing/parser.ml" +# 22090 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21765 "parsing/parser.ml" +# 22098 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1657 "parsing/parser.mly" +# 1730 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Ms.mk uid body ~attrs ~loc ~docs, ext ) -# 21779 "parsing/parser.ml" +# 22112 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21826,9 +22159,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 21832 "parsing/parser.ml" +# 22165 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in let _2 : (string Asttypes.loc option) = Obj.magic _2 in @@ -21842,24 +22175,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 21848 "parsing/parser.ml" +# 22181 "parsing/parser.ml" in let _3 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21856 "parsing/parser.ml" +# 22189 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in -# 1664 "parsing/parser.mly" +# 1737 "parsing/parser.mly" ( expecting _loc__6_ "module path" ) -# 21863 "parsing/parser.ml" +# 22196 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21905,18 +22238,18 @@ module Tables = struct let _v : (Parsetree.module_type) = let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21911 "parsing/parser.ml" +# 22244 "parsing/parser.ml" in let _endpos = _endpos__4_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1509 "parsing/parser.mly" +# 1580 "parsing/parser.mly" ( mkmty ~loc:_sloc ~attrs (Pmty_signature s) ) -# 21920 "parsing/parser.ml" +# 22253 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -21962,17 +22295,17 @@ module Tables = struct let _v : (Parsetree.module_type) = let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 21968 "parsing/parser.ml" +# 22301 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1511 "parsing/parser.mly" +# 1582 "parsing/parser.mly" ( unclosed "sig" _loc__1_ "end" _loc__4_ ) -# 21976 "parsing/parser.ml" +# 22309 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22025,30 +22358,30 @@ module Tables = struct let _v : (Parsetree.module_type) = let args = let _1 = _1_inlined2 in -# 1182 "parsing/parser.mly" +# 1253 "parsing/parser.mly" ( _1 ) -# 22031 "parsing/parser.ml" +# 22364 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 22039 "parsing/parser.ml" +# 22372 "parsing/parser.ml" in let _endpos = _endpos_mty_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1515 "parsing/parser.mly" +# 1586 "parsing/parser.mly" ( wrap_mty_attrs ~loc:_sloc attrs ( List.fold_left (fun acc (startpos, arg) -> mkmty ~loc:(startpos, _endpos) (Pmty_functor (arg, acc)) ) mty args ) ) -# 22052 "parsing/parser.ml" +# 22385 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22101,18 +22434,18 @@ module Tables = struct let _v : (Parsetree.module_type) = let _4 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 22107 "parsing/parser.ml" +# 22440 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1521 "parsing/parser.mly" +# 1592 "parsing/parser.mly" ( mkmty ~loc:_sloc ~attrs:_4 (Pmty_typeof _5) ) -# 22116 "parsing/parser.ml" +# 22449 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22149,9 +22482,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.module_type) = -# 1523 "parsing/parser.mly" +# 1594 "parsing/parser.mly" ( _2 ) -# 22155 "parsing/parser.ml" +# 22488 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22190,9 +22523,9 @@ module Tables = struct let _v : (Parsetree.module_type) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1525 "parsing/parser.mly" +# 1596 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 22196 "parsing/parser.ml" +# 22529 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22222,9 +22555,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.module_type) = -# 1527 "parsing/parser.mly" +# 1598 "parsing/parser.mly" ( Mty.attr _1 _2 ) -# 22228 "parsing/parser.ml" +# 22561 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22253,30 +22586,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22259 "parsing/parser.ml" +# 22592 "parsing/parser.ml" in -# 1530 "parsing/parser.mly" +# 1601 "parsing/parser.mly" ( Pmty_ident _1 ) -# 22265 "parsing/parser.ml" +# 22598 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 928 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 22274 "parsing/parser.ml" +# 22607 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1612 "parsing/parser.mly" ( _1 ) -# 22280 "parsing/parser.ml" +# 22613 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22314,24 +22647,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1533 "parsing/parser.mly" +# 1604 "parsing/parser.mly" ( Pmty_functor(Named (mknoloc None, _1), _3) ) -# 22320 "parsing/parser.ml" +# 22653 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 928 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 22329 "parsing/parser.ml" +# 22662 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1612 "parsing/parser.mly" ( _1 ) -# 22335 "parsing/parser.ml" +# 22668 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22373,18 +22706,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 22377 "parsing/parser.ml" +# 22710 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 22382 "parsing/parser.ml" +# 22715 "parsing/parser.ml" in -# 1535 "parsing/parser.mly" +# 1606 "parsing/parser.mly" ( Pmty_with(_1, _3) ) -# 22388 "parsing/parser.ml" +# 22721 "parsing/parser.ml" in let _endpos__1_ = _endpos_xs_ in @@ -22392,15 +22725,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 928 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 22398 "parsing/parser.ml" +# 22731 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1612 "parsing/parser.mly" ( _1 ) -# 22404 "parsing/parser.ml" +# 22737 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22424,23 +22757,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.module_type) = let _1 = let _1 = -# 1539 "parsing/parser.mly" +# 1610 "parsing/parser.mly" ( Pmty_extension _1 ) -# 22430 "parsing/parser.ml" +# 22763 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 862 "parsing/parser.mly" +# 928 "parsing/parser.mly" ( mkmty ~loc:_sloc _1 ) -# 22438 "parsing/parser.ml" +# 22771 "parsing/parser.ml" in -# 1541 "parsing/parser.mly" +# 1612 "parsing/parser.mly" ( _1 ) -# 22444 "parsing/parser.ml" +# 22777 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22507,9 +22840,9 @@ module Tables = struct let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 22513 "parsing/parser.ml" +# 22846 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -22519,31 +22852,141 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22525 "parsing/parser.ml" +# 22858 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 22533 "parsing/parser.ml" +# 22866 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1455 "parsing/parser.mly" +# 1526 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Mtd.mk id ?typ ~attrs ~loc ~docs, ext ) -# 22547 "parsing/parser.ml" +# 22880 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined3; + MenhirLib.EngineTypes.startp = _startpos__1_inlined3_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = typ; + MenhirLib.EngineTypes.startp = _startpos_typ_; + MenhirLib.EngineTypes.endp = _endpos_typ_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _6; + MenhirLib.EngineTypes.startp = _startpos__6_; + MenhirLib.EngineTypes.endp = _endpos__6_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined2; + MenhirLib.EngineTypes.startp = _startpos__1_inlined2_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = ext; + MenhirLib.EngineTypes.startp = _startpos_ext_; + MenhirLib.EngineTypes.endp = _endpos_ext_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + }; + }; + } = _menhir_stack in + let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in + let typ : (Parsetree.module_type) = Obj.magic typ in + let _6 : unit = Obj.magic _6 in + let _1_inlined2 : (Asttypes.label) = Obj.magic _1_inlined2 in + let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in + let ext : (string Asttypes.loc option) = Obj.magic ext in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_inlined3_ in + let _v : (Parsetree.module_type_declaration * string Asttypes.loc option) = let attrs2 = + let _1 = _1_inlined3 in + +# 3831 "parsing/parser.mly" + ( _1 ) +# 22956 "parsing/parser.ml" + + in + let _endpos_attrs2_ = _endpos__1_inlined3_ in + let id = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 883 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 22968 "parsing/parser.ml" + + in + let attrs1 = + let _1 = _1_inlined1 in + +# 3835 "parsing/parser.mly" + ( _1 ) +# 22976 "parsing/parser.ml" + + in + let _endpos = _endpos_attrs2_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 1786 "parsing/parser.mly" + ( + let attrs = attrs1 @ attrs2 in + let loc = make_loc _sloc in + let docs = symbol_docs _sloc in + Mtd.mk id ~typ ~attrs ~loc ~docs, ext + ) +# 22990 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22566,9 +23009,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3529 "parsing/parser.mly" +# 3613 "parsing/parser.mly" ( _1 ) -# 22572 "parsing/parser.ml" +# 23015 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22584,9 +23027,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.mutable_flag) = -# 3606 "parsing/parser.mly" +# 3694 "parsing/parser.mly" ( Immutable ) -# 22590 "parsing/parser.ml" +# 23033 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22609,9 +23052,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 3607 "parsing/parser.mly" +# 3695 "parsing/parser.mly" ( Mutable ) -# 22615 "parsing/parser.ml" +# 23058 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22627,9 +23070,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3615 "parsing/parser.mly" +# 3703 "parsing/parser.mly" ( Immutable, Concrete ) -# 22633 "parsing/parser.ml" +# 23076 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22652,9 +23095,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3617 "parsing/parser.mly" +# 3705 "parsing/parser.mly" ( Mutable, Concrete ) -# 22658 "parsing/parser.ml" +# 23101 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22677,9 +23120,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3619 "parsing/parser.mly" +# 3707 "parsing/parser.mly" ( Immutable, Virtual ) -# 22683 "parsing/parser.ml" +# 23126 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22709,9 +23152,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3622 "parsing/parser.mly" +# 3710 "parsing/parser.mly" ( Mutable, Virtual ) -# 22715 "parsing/parser.ml" +# 23158 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22741,9 +23184,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag * Asttypes.virtual_flag) = -# 3622 "parsing/parser.mly" +# 3710 "parsing/parser.mly" ( Mutable, Virtual ) -# 22747 "parsing/parser.ml" +# 23190 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22773,9 +23216,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.label) = -# 3579 "parsing/parser.mly" +# 3665 "parsing/parser.mly" ( _2 ) -# 22779 "parsing/parser.ml" +# 23222 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22794,9 +23237,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 22800 "parsing/parser.ml" +# 23243 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22806,15 +23249,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22812 "parsing/parser.ml" +# 23255 "parsing/parser.ml" in # 221 "" ( [ x ] ) -# 22818 "parsing/parser.ml" +# 23261 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22840,9 +23283,9 @@ module Tables = struct } = _menhir_stack in let xs : (string Asttypes.loc list) = Obj.magic xs in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 22846 "parsing/parser.ml" +# 23289 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -22852,15 +23295,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 22858 "parsing/parser.ml" +# 23301 "parsing/parser.ml" in # 223 "" ( x :: xs ) -# 22864 "parsing/parser.ml" +# 23307 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22879,22 +23322,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let s : ( -# 689 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * Location.t * string option) -# 22885 "parsing/parser.ml" +# 23328 "parsing/parser.ml" ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_s_ in let _endpos = _endpos_s_ in let _v : (string list) = let x = -# 3575 "parsing/parser.mly" +# 3661 "parsing/parser.mly" ( let body, _, _ = s in body ) -# 22893 "parsing/parser.ml" +# 23336 "parsing/parser.ml" in # 221 "" ( [ x ] ) -# 22898 "parsing/parser.ml" +# 23341 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22920,22 +23363,22 @@ module Tables = struct } = _menhir_stack in let xs : (string list) = Obj.magic xs in let s : ( -# 689 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * Location.t * string option) -# 22926 "parsing/parser.ml" +# 23369 "parsing/parser.ml" ) = Obj.magic s in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_s_ in let _endpos = _endpos_xs_ in let _v : (string list) = let x = -# 3575 "parsing/parser.mly" +# 3661 "parsing/parser.mly" ( let body, _, _ = s in body ) -# 22934 "parsing/parser.ml" +# 23377 "parsing/parser.ml" in # 223 "" ( x :: xs ) -# 22939 "parsing/parser.ml" +# 23382 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22958,14 +23401,14 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 22964 "parsing/parser.ml" +# 23407 "parsing/parser.ml" in -# 2901 "parsing/parser.mly" +# 2981 "parsing/parser.mly" ( (Ptype_abstract, priv, Some ty) ) -# 22969 "parsing/parser.ml" +# 23412 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -22995,14 +23438,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23001 "parsing/parser.ml" +# 23444 "parsing/parser.ml" in -# 2901 "parsing/parser.mly" +# 2981 "parsing/parser.mly" ( (Ptype_abstract, priv, Some ty) ) -# 23006 "parsing/parser.ml" +# 23449 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23025,26 +23468,26 @@ module Tables = struct let _startpos = _startpos_cs_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 23031 "parsing/parser.ml" +# 23474 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23037 "parsing/parser.ml" +# 23480 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23042 "parsing/parser.ml" +# 23485 "parsing/parser.ml" in -# 2905 "parsing/parser.mly" +# 2985 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23048 "parsing/parser.ml" +# 23491 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23074,26 +23517,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23080 "parsing/parser.ml" +# 23523 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23086 "parsing/parser.ml" +# 23529 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23091 "parsing/parser.ml" +# 23534 "parsing/parser.ml" in -# 2905 "parsing/parser.mly" +# 2985 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23097 "parsing/parser.ml" +# 23540 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23130,33 +23573,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 23136 "parsing/parser.ml" +# 23579 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23143 "parsing/parser.ml" +# 23586 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23148 "parsing/parser.ml" +# 23591 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23154 "parsing/parser.ml" +# 23597 "parsing/parser.ml" in -# 2905 "parsing/parser.mly" +# 2985 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23160 "parsing/parser.ml" +# 23603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23200,33 +23643,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_cs_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23206 "parsing/parser.ml" +# 23649 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23213 "parsing/parser.ml" +# 23656 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23218 "parsing/parser.ml" +# 23661 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23224 "parsing/parser.ml" +# 23667 "parsing/parser.ml" in -# 2905 "parsing/parser.mly" +# 2985 "parsing/parser.mly" ( (Ptype_variant cs, priv, oty) ) -# 23230 "parsing/parser.ml" +# 23673 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23249,26 +23692,26 @@ module Tables = struct let _startpos = _startpos__3_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 23255 "parsing/parser.ml" +# 23698 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23261 "parsing/parser.ml" +# 23704 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23266 "parsing/parser.ml" +# 23709 "parsing/parser.ml" in -# 2909 "parsing/parser.mly" +# 2989 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 23272 "parsing/parser.ml" +# 23715 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23298,26 +23741,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23304 "parsing/parser.ml" +# 23747 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23310 "parsing/parser.ml" +# 23753 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23315 "parsing/parser.ml" +# 23758 "parsing/parser.ml" in -# 2909 "parsing/parser.mly" +# 2989 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 23321 "parsing/parser.ml" +# 23764 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23354,33 +23797,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 23360 "parsing/parser.ml" +# 23803 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23367 "parsing/parser.ml" +# 23810 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23372 "parsing/parser.ml" +# 23815 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23378 "parsing/parser.ml" +# 23821 "parsing/parser.ml" in -# 2909 "parsing/parser.mly" +# 2989 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 23384 "parsing/parser.ml" +# 23827 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23424,33 +23867,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__3_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23430 "parsing/parser.ml" +# 23873 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23437 "parsing/parser.ml" +# 23880 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23442 "parsing/parser.ml" +# 23885 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23448 "parsing/parser.ml" +# 23891 "parsing/parser.ml" in -# 2909 "parsing/parser.mly" +# 2989 "parsing/parser.mly" ( (Ptype_open, priv, oty) ) -# 23454 "parsing/parser.ml" +# 23897 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23487,26 +23930,26 @@ module Tables = struct let _startpos = _startpos__3_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 23493 "parsing/parser.ml" +# 23936 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23499 "parsing/parser.ml" +# 23942 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23504 "parsing/parser.ml" +# 23947 "parsing/parser.ml" in -# 2913 "parsing/parser.mly" +# 2993 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 23510 "parsing/parser.ml" +# 23953 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23550,26 +23993,26 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23556 "parsing/parser.ml" +# 23999 "parsing/parser.ml" in let oty = let _1 = # 124 "" ( None ) -# 23562 "parsing/parser.ml" +# 24005 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23567 "parsing/parser.ml" +# 24010 "parsing/parser.ml" in -# 2913 "parsing/parser.mly" +# 2993 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 23573 "parsing/parser.ml" +# 24016 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23620,33 +24063,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 23626 "parsing/parser.ml" +# 24069 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23633 "parsing/parser.ml" +# 24076 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23638 "parsing/parser.ml" +# 24081 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23644 "parsing/parser.ml" +# 24087 "parsing/parser.ml" in -# 2913 "parsing/parser.mly" +# 2993 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 23650 "parsing/parser.ml" +# 24093 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23704,33 +24147,33 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos__5_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = let priv = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 23710 "parsing/parser.ml" +# 24153 "parsing/parser.ml" in let oty = let _1 = let x = # 191 "" ( x ) -# 23717 "parsing/parser.ml" +# 24160 "parsing/parser.ml" in # 126 "" ( Some x ) -# 23722 "parsing/parser.ml" +# 24165 "parsing/parser.ml" in -# 2917 "parsing/parser.mly" +# 2997 "parsing/parser.mly" ( _1 ) -# 23728 "parsing/parser.ml" +# 24171 "parsing/parser.ml" in -# 2913 "parsing/parser.mly" +# 2993 "parsing/parser.mly" ( (Ptype_record ls, priv, oty) ) -# 23734 "parsing/parser.ml" +# 24177 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23783,37 +24226,37 @@ module Tables = struct let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 23789 "parsing/parser.ml" +# 24232 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 23798 "parsing/parser.ml" +# 24241 "parsing/parser.ml" in let override = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 23804 "parsing/parser.ml" +# 24247 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1474 "parsing/parser.mly" +# 1545 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk me ~override ~attrs ~loc ~docs, ext ) -# 23817 "parsing/parser.ml" +# 24260 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23873,40 +24316,40 @@ module Tables = struct let _v : (Parsetree.open_declaration * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 23879 "parsing/parser.ml" +# 24322 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let attrs1 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 23888 "parsing/parser.ml" +# 24331 "parsing/parser.ml" in let override = let _1 = _1_inlined1 in -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 23896 "parsing/parser.ml" +# 24339 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1474 "parsing/parser.mly" +# 1545 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk me ~override ~attrs ~loc ~docs, ext ) -# 23910 "parsing/parser.ml" +# 24353 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -23959,9 +24402,9 @@ module Tables = struct let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 23965 "parsing/parser.ml" +# 24408 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -23971,36 +24414,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 23977 "parsing/parser.ml" +# 24420 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 23985 "parsing/parser.ml" +# 24428 "parsing/parser.ml" in let override = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 23991 "parsing/parser.ml" +# 24434 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1489 "parsing/parser.mly" +# 1560 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk id ~override ~attrs ~loc ~docs, ext ) -# 24004 "parsing/parser.ml" +# 24447 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24060,9 +24503,9 @@ module Tables = struct let _v : (Parsetree.open_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 24066 "parsing/parser.ml" +# 24509 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -24072,39 +24515,39 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 24078 "parsing/parser.ml" +# 24521 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined2 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 24086 "parsing/parser.ml" +# 24529 "parsing/parser.ml" in let override = let _1 = _1_inlined1 in -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 24094 "parsing/parser.ml" +# 24537 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1489 "parsing/parser.mly" +# 1560 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Opn.mk id ~override ~attrs ~loc ~docs, ext ) -# 24108 "parsing/parser.ml" +# 24551 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24123,17 +24566,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 675 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 24129 "parsing/parser.ml" +# 24572 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3445 "parsing/parser.mly" +# 3529 "parsing/parser.mly" ( _1 ) -# 24137 "parsing/parser.ml" +# 24580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24152,17 +24595,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 633 "parsing/parser.mly" +# 687 "parsing/parser.mly" (string) -# 24158 "parsing/parser.ml" +# 24601 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3446 "parsing/parser.mly" +# 3530 "parsing/parser.mly" ( _1 ) -# 24166 "parsing/parser.ml" +# 24609 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24181,17 +24624,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 634 "parsing/parser.mly" +# 688 "parsing/parser.mly" (string) -# 24187 "parsing/parser.ml" +# 24630 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3447 "parsing/parser.mly" +# 3531 "parsing/parser.mly" ( _1 ) -# 24195 "parsing/parser.ml" +# 24638 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24231,17 +24674,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 24237 "parsing/parser.ml" +# 24680 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.label) = -# 3448 "parsing/parser.mly" +# 3532 "parsing/parser.mly" ( "."^ _1 ^"(" ^ _3 ^ ")" ) -# 24245 "parsing/parser.ml" +# 24688 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24288,17 +24731,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 24294 "parsing/parser.ml" +# 24737 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Asttypes.label) = -# 3449 "parsing/parser.mly" +# 3533 "parsing/parser.mly" ( "."^ _1 ^ "(" ^ _3 ^ ")<-" ) -# 24302 "parsing/parser.ml" +# 24745 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24338,17 +24781,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 24344 "parsing/parser.ml" +# 24787 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.label) = -# 3450 "parsing/parser.mly" +# 3534 "parsing/parser.mly" ( "."^ _1 ^"[" ^ _3 ^ "]" ) -# 24352 "parsing/parser.ml" +# 24795 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24395,17 +24838,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 24401 "parsing/parser.ml" +# 24844 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Asttypes.label) = -# 3451 "parsing/parser.mly" +# 3535 "parsing/parser.mly" ( "."^ _1 ^ "[" ^ _3 ^ "]<-" ) -# 24409 "parsing/parser.ml" +# 24852 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24445,17 +24888,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 24451 "parsing/parser.ml" +# 24894 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Asttypes.label) = -# 3452 "parsing/parser.mly" +# 3536 "parsing/parser.mly" ( "."^ _1 ^"{" ^ _3 ^ "}" ) -# 24459 "parsing/parser.ml" +# 24902 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24502,17 +24945,17 @@ module Tables = struct let _3 : (string) = Obj.magic _3 in let _2 : unit = Obj.magic _2 in let _1 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 24508 "parsing/parser.ml" +# 24951 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Asttypes.label) = -# 3453 "parsing/parser.mly" +# 3537 "parsing/parser.mly" ( "."^ _1 ^ "{" ^ _3 ^ "}<-" ) -# 24516 "parsing/parser.ml" +# 24959 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24531,17 +24974,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 686 "parsing/parser.mly" +# 740 "parsing/parser.mly" (string) -# 24537 "parsing/parser.ml" +# 24980 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3454 "parsing/parser.mly" +# 3538 "parsing/parser.mly" ( _1 ) -# 24545 "parsing/parser.ml" +# 24988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24564,9 +25007,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3455 "parsing/parser.mly" +# 3539 "parsing/parser.mly" ( "!" ) -# 24570 "parsing/parser.ml" +# 25013 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24585,22 +25028,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 627 "parsing/parser.mly" +# 681 "parsing/parser.mly" (string) -# 24591 "parsing/parser.ml" +# 25034 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3459 "parsing/parser.mly" +# 3543 "parsing/parser.mly" ( op ) -# 24599 "parsing/parser.ml" +# 25042 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24604 "parsing/parser.ml" +# 25047 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24619,22 +25062,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 628 "parsing/parser.mly" +# 682 "parsing/parser.mly" (string) -# 24625 "parsing/parser.ml" +# 25068 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3460 "parsing/parser.mly" +# 3544 "parsing/parser.mly" ( op ) -# 24633 "parsing/parser.ml" +# 25076 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24638 "parsing/parser.ml" +# 25081 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24653,22 +25096,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 629 "parsing/parser.mly" +# 683 "parsing/parser.mly" (string) -# 24659 "parsing/parser.ml" +# 25102 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3461 "parsing/parser.mly" +# 3545 "parsing/parser.mly" ( op ) -# 24667 "parsing/parser.ml" +# 25110 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24672 "parsing/parser.ml" +# 25115 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24687,22 +25130,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 630 "parsing/parser.mly" +# 684 "parsing/parser.mly" (string) -# 24693 "parsing/parser.ml" +# 25136 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3462 "parsing/parser.mly" +# 3546 "parsing/parser.mly" ( op ) -# 24701 "parsing/parser.ml" +# 25144 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24706 "parsing/parser.ml" +# 25149 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24721,22 +25164,22 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let op : ( -# 631 "parsing/parser.mly" +# 685 "parsing/parser.mly" (string) -# 24727 "parsing/parser.ml" +# 25170 "parsing/parser.ml" ) = Obj.magic op in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_op_ in let _endpos = _endpos_op_ in let _v : (Asttypes.label) = let _1 = -# 3463 "parsing/parser.mly" +# 3547 "parsing/parser.mly" ( op ) -# 24735 "parsing/parser.ml" +# 25178 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24740 "parsing/parser.ml" +# 25183 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24759,14 +25202,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3464 "parsing/parser.mly" +# 3548 "parsing/parser.mly" ("+") -# 24765 "parsing/parser.ml" +# 25208 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24770 "parsing/parser.ml" +# 25213 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24789,14 +25232,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3465 "parsing/parser.mly" +# 3549 "parsing/parser.mly" ("+.") -# 24795 "parsing/parser.ml" +# 25238 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24800 "parsing/parser.ml" +# 25243 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24819,14 +25262,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3466 "parsing/parser.mly" +# 3550 "parsing/parser.mly" ("+=") -# 24825 "parsing/parser.ml" +# 25268 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24830 "parsing/parser.ml" +# 25273 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24849,14 +25292,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3467 "parsing/parser.mly" +# 3551 "parsing/parser.mly" ("-") -# 24855 "parsing/parser.ml" +# 25298 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24860 "parsing/parser.ml" +# 25303 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24879,14 +25322,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3468 "parsing/parser.mly" +# 3552 "parsing/parser.mly" ("-.") -# 24885 "parsing/parser.ml" +# 25328 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24890 "parsing/parser.ml" +# 25333 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24909,14 +25352,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3469 "parsing/parser.mly" +# 3553 "parsing/parser.mly" ("*") -# 24915 "parsing/parser.ml" +# 25358 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24920 "parsing/parser.ml" +# 25363 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24939,14 +25382,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3470 "parsing/parser.mly" +# 3554 "parsing/parser.mly" ("%") -# 24945 "parsing/parser.ml" +# 25388 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24950 "parsing/parser.ml" +# 25393 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24969,14 +25412,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3471 "parsing/parser.mly" +# 3555 "parsing/parser.mly" ("=") -# 24975 "parsing/parser.ml" +# 25418 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 24980 "parsing/parser.ml" +# 25423 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -24999,14 +25442,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3472 "parsing/parser.mly" +# 3556 "parsing/parser.mly" ("<") -# 25005 "parsing/parser.ml" +# 25448 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25010 "parsing/parser.ml" +# 25453 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25029,14 +25472,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3473 "parsing/parser.mly" +# 3557 "parsing/parser.mly" (">") -# 25035 "parsing/parser.ml" +# 25478 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25040 "parsing/parser.ml" +# 25483 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25059,14 +25502,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3474 "parsing/parser.mly" +# 3558 "parsing/parser.mly" ("or") -# 25065 "parsing/parser.ml" +# 25508 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25070 "parsing/parser.ml" +# 25513 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25089,14 +25532,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3475 "parsing/parser.mly" +# 3559 "parsing/parser.mly" ("||") -# 25095 "parsing/parser.ml" +# 25538 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25100 "parsing/parser.ml" +# 25543 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25119,14 +25562,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3476 "parsing/parser.mly" +# 3560 "parsing/parser.mly" ("&") -# 25125 "parsing/parser.ml" +# 25568 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25130 "parsing/parser.ml" +# 25573 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25149,14 +25592,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3477 "parsing/parser.mly" +# 3561 "parsing/parser.mly" ("&&") -# 25155 "parsing/parser.ml" +# 25598 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25160 "parsing/parser.ml" +# 25603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25179,14 +25622,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = let _1 = -# 3478 "parsing/parser.mly" +# 3562 "parsing/parser.mly" (":=") -# 25185 "parsing/parser.ml" +# 25628 "parsing/parser.ml" in -# 3456 "parsing/parser.mly" +# 3540 "parsing/parser.mly" ( _1 ) -# 25190 "parsing/parser.ml" +# 25633 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25209,9 +25652,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (bool) = -# 3360 "parsing/parser.mly" +# 3444 "parsing/parser.mly" ( true ) -# 25215 "parsing/parser.ml" +# 25658 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25227,9 +25670,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (bool) = -# 3361 "parsing/parser.mly" +# 3445 "parsing/parser.mly" ( false ) -# 25233 "parsing/parser.ml" +# 25676 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25247,7 +25690,7 @@ module Tables = struct let _v : (unit option) = # 114 "" ( None ) -# 25251 "parsing/parser.ml" +# 25694 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25272,7 +25715,7 @@ module Tables = struct let _v : (unit option) = # 116 "" ( Some x ) -# 25276 "parsing/parser.ml" +# 25719 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25290,7 +25733,7 @@ module Tables = struct let _v : (unit option) = # 114 "" ( None ) -# 25294 "parsing/parser.ml" +# 25737 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25315,7 +25758,7 @@ module Tables = struct let _v : (unit option) = # 116 "" ( Some x ) -# 25319 "parsing/parser.ml" +# 25762 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25333,7 +25776,7 @@ module Tables = struct let _v : (string Asttypes.loc option) = # 114 "" ( None ) -# 25337 "parsing/parser.ml" +# 25780 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25358,9 +25801,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 25364 "parsing/parser.ml" +# 25807 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -25373,21 +25816,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 25379 "parsing/parser.ml" +# 25822 "parsing/parser.ml" in # 183 "" ( x ) -# 25385 "parsing/parser.ml" +# 25828 "parsing/parser.ml" in # 116 "" ( Some x ) -# 25391 "parsing/parser.ml" +# 25834 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25405,7 +25848,7 @@ module Tables = struct let _v : (Parsetree.core_type option) = # 114 "" ( None ) -# 25409 "parsing/parser.ml" +# 25852 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25437,12 +25880,12 @@ module Tables = struct let _v : (Parsetree.core_type option) = let x = # 183 "" ( x ) -# 25441 "parsing/parser.ml" +# 25884 "parsing/parser.ml" in # 116 "" ( Some x ) -# 25446 "parsing/parser.ml" +# 25889 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25460,7 +25903,7 @@ module Tables = struct let _v : (Parsetree.expression option) = # 114 "" ( None ) -# 25464 "parsing/parser.ml" +# 25907 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25492,12 +25935,12 @@ module Tables = struct let _v : (Parsetree.expression option) = let x = # 183 "" ( x ) -# 25496 "parsing/parser.ml" +# 25939 "parsing/parser.ml" in # 116 "" ( Some x ) -# 25501 "parsing/parser.ml" +# 25944 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25515,7 +25958,7 @@ module Tables = struct let _v : (Parsetree.module_type option) = # 114 "" ( None ) -# 25519 "parsing/parser.ml" +# 25962 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25547,12 +25990,12 @@ module Tables = struct let _v : (Parsetree.module_type option) = let x = # 183 "" ( x ) -# 25551 "parsing/parser.ml" +# 25994 "parsing/parser.ml" in # 116 "" ( Some x ) -# 25556 "parsing/parser.ml" +# 25999 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25570,7 +26013,7 @@ module Tables = struct let _v : (Parsetree.pattern option) = # 114 "" ( None ) -# 25574 "parsing/parser.ml" +# 26017 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25602,12 +26045,12 @@ module Tables = struct let _v : (Parsetree.pattern option) = let x = # 183 "" ( x ) -# 25606 "parsing/parser.ml" +# 26049 "parsing/parser.ml" in # 116 "" ( Some x ) -# 25611 "parsing/parser.ml" +# 26054 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25625,7 +26068,7 @@ module Tables = struct let _v : (Parsetree.expression option) = # 114 "" ( None ) -# 25629 "parsing/parser.ml" +# 26072 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25657,12 +26100,12 @@ module Tables = struct let _v : (Parsetree.expression option) = let x = # 183 "" ( x ) -# 25661 "parsing/parser.ml" +# 26104 "parsing/parser.ml" in # 116 "" ( Some x ) -# 25666 "parsing/parser.ml" +# 26109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25680,7 +26123,7 @@ module Tables = struct let _v : ((Parsetree.core_type option * Parsetree.core_type option) option) = # 114 "" ( None ) -# 25684 "parsing/parser.ml" +# 26127 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25705,7 +26148,7 @@ module Tables = struct let _v : ((Parsetree.core_type option * Parsetree.core_type option) option) = # 116 "" ( Some x ) -# 25709 "parsing/parser.ml" +# 26152 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25724,17 +26167,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 668 "parsing/parser.mly" +# 722 "parsing/parser.mly" (string) -# 25730 "parsing/parser.ml" +# 26173 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3661 "parsing/parser.mly" +# 3749 "parsing/parser.mly" ( _1 ) -# 25738 "parsing/parser.ml" +# 26181 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25766,18 +26209,18 @@ module Tables = struct } = _menhir_stack in let _3 : unit = Obj.magic _3 in let _2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 25772 "parsing/parser.ml" +# 26215 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (string) = -# 3662 "parsing/parser.mly" +# 3750 "parsing/parser.mly" ( _2 ) -# 25781 "parsing/parser.ml" +# 26224 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25831,9 +26274,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1253 "parsing/parser.mly" +# 1324 "parsing/parser.mly" ( mkmod ~loc:_sloc (Pmod_constraint(me, mty)) ) -# 25837 "parsing/parser.ml" +# 26280 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25886,9 +26329,9 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1255 "parsing/parser.mly" +# 1326 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 25892 "parsing/parser.ml" +# 26335 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25925,9 +26368,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.module_expr) = -# 1258 "parsing/parser.mly" +# 1329 "parsing/parser.mly" ( me (* TODO consider reloc *) ) -# 25931 "parsing/parser.ml" +# 26374 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -25966,9 +26409,9 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1260 "parsing/parser.mly" +# 1331 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 25972 "parsing/parser.ml" +# 26415 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26019,25 +26462,25 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.module_expr) = let e = -# 1277 "parsing/parser.mly" +# 1348 "parsing/parser.mly" ( e ) -# 26025 "parsing/parser.ml" +# 26468 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26032 "parsing/parser.ml" +# 26475 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1335 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26041 "parsing/parser.ml" +# 26484 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26108,11 +26551,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26116 "parsing/parser.ml" +# 26559 "parsing/parser.ml" in let _endpos_ty_ = _endpos__1_ in @@ -26120,26 +26563,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1279 "parsing/parser.mly" +# 1350 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_constraint (e, ty)) ) -# 26126 "parsing/parser.ml" +# 26569 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26134 "parsing/parser.ml" +# 26577 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1335 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26143 "parsing/parser.ml" +# 26586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26225,11 +26668,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26233 "parsing/parser.ml" +# 26676 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_inlined1_ in @@ -26238,37 +26681,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26246 "parsing/parser.ml" +# 26689 "parsing/parser.ml" in let _endpos = _endpos_ty2_ in let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1281 "parsing/parser.mly" +# 1352 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, Some ty1, ty2)) ) -# 26255 "parsing/parser.ml" +# 26698 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26263 "parsing/parser.ml" +# 26706 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1335 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26272 "parsing/parser.ml" +# 26715 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26339,11 +26782,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 26347 "parsing/parser.ml" +# 26790 "parsing/parser.ml" in let _endpos_ty2_ = _endpos__1_ in @@ -26351,26 +26794,26 @@ module Tables = struct let _startpos = _startpos_e_ in let _loc = (_startpos, _endpos) in -# 1283 "parsing/parser.mly" +# 1354 "parsing/parser.mly" ( ghexp ~loc:_loc (Pexp_coerce (e, None, ty2)) ) -# 26357 "parsing/parser.ml" +# 26800 "parsing/parser.ml" in let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26365 "parsing/parser.ml" +# 26808 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1264 "parsing/parser.mly" +# 1335 "parsing/parser.mly" ( mkmod ~loc:_sloc ~attrs (Pmod_unpack e) ) -# 26374 "parsing/parser.ml" +# 26817 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26430,17 +26873,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _3 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26436 "parsing/parser.ml" +# 26879 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1266 "parsing/parser.mly" +# 1337 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 26444 "parsing/parser.ml" +# 26887 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26500,17 +26943,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _3 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26506 "parsing/parser.ml" +# 26949 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1268 "parsing/parser.mly" +# 1339 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 26514 "parsing/parser.ml" +# 26957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26563,17 +27006,17 @@ module Tables = struct let _v : (Parsetree.module_expr) = let _3 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 26569 "parsing/parser.ml" +# 27012 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1270 "parsing/parser.mly" +# 1341 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 26577 "parsing/parser.ml" +# 27020 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26602,14 +27045,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 805 "parsing/parser.mly" - (Longident.t) -# 26609 "parsing/parser.ml" - ) = -# 1174 "parsing/parser.mly" + let _v : (Longident.t) = +# 1243 "parsing/parser.mly" ( _1 ) -# 26613 "parsing/parser.ml" +# 27052 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26638,14 +27077,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 795 "parsing/parser.mly" - (Longident.t) -# 26645 "parsing/parser.ml" - ) = -# 1159 "parsing/parser.mly" + let _v : (Longident.t) = +# 1228 "parsing/parser.mly" ( _1 ) -# 26649 "parsing/parser.ml" +# 27084 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26674,14 +27109,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 789 "parsing/parser.mly" - (Parsetree.core_type) -# 26681 "parsing/parser.ml" - ) = -# 1134 "parsing/parser.mly" + let _v : (Parsetree.core_type) = +# 1203 "parsing/parser.mly" ( _1 ) -# 26685 "parsing/parser.ml" +# 27116 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26710,14 +27141,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 791 "parsing/parser.mly" - (Parsetree.expression) -# 26717 "parsing/parser.ml" - ) = -# 1139 "parsing/parser.mly" + let _v : (Parsetree.expression) = +# 1208 "parsing/parser.mly" ( _1 ) -# 26721 "parsing/parser.ml" +# 27148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26746,14 +27173,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 801 "parsing/parser.mly" - (Longident.t) -# 26753 "parsing/parser.ml" - ) = -# 1164 "parsing/parser.mly" + let _v : (Longident.t) = +# 1233 "parsing/parser.mly" ( _1 ) -# 26757 "parsing/parser.ml" +# 27180 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26782,14 +27205,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 803 "parsing/parser.mly" - (Longident.t) -# 26789 "parsing/parser.ml" - ) = -# 1169 "parsing/parser.mly" + let _v : (Longident.t) = +# 1238 "parsing/parser.mly" ( _1 ) -# 26793 "parsing/parser.ml" +# 27212 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26818,14 +27237,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 799 "parsing/parser.mly" - (Longident.t) -# 26825 "parsing/parser.ml" - ) = -# 1149 "parsing/parser.mly" + let _v : (Longident.t) = +# 1218 "parsing/parser.mly" ( _1 ) -# 26829 "parsing/parser.ml" +# 27244 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26854,14 +27269,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 793 "parsing/parser.mly" - (Parsetree.pattern) -# 26861 "parsing/parser.ml" - ) = -# 1144 "parsing/parser.mly" + let _v : (Parsetree.pattern) = +# 1213 "parsing/parser.mly" ( _1 ) -# 26865 "parsing/parser.ml" +# 27276 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26890,14 +27301,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 797 "parsing/parser.mly" - (Longident.t) -# 26897 "parsing/parser.ml" - ) = -# 1154 "parsing/parser.mly" + let _v : (Longident.t) = +# 1223 "parsing/parser.mly" ( _1 ) -# 26901 "parsing/parser.ml" +# 27308 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26939,15 +27346,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2633 "parsing/parser.mly" +# 2710 "parsing/parser.mly" ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 26945 "parsing/parser.ml" +# 27352 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 26951 "parsing/parser.ml" +# 27358 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -26977,14 +27384,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = -# 2635 "parsing/parser.mly" +# 2712 "parsing/parser.mly" ( Pat.attr _1 _2 ) -# 26983 "parsing/parser.ml" +# 27390 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 26988 "parsing/parser.ml" +# 27395 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27007,14 +27414,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = -# 2637 "parsing/parser.mly" +# 2714 "parsing/parser.mly" ( _1 ) -# 27013 "parsing/parser.ml" +# 27420 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27018 "parsing/parser.ml" +# 27425 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27059,15 +27466,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27065 "parsing/parser.ml" +# 27472 "parsing/parser.ml" in -# 2640 "parsing/parser.mly" +# 2717 "parsing/parser.mly" ( Ppat_alias(_1, _3) ) -# 27071 "parsing/parser.ml" +# 27478 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -27075,21 +27482,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27081 "parsing/parser.ml" +# 27488 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 27087 "parsing/parser.ml" +# 27494 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27093 "parsing/parser.ml" +# 27500 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27130,9 +27537,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2642 "parsing/parser.mly" +# 2719 "parsing/parser.mly" ( expecting _loc__3_ "identifier" ) -# 27136 "parsing/parser.ml" +# 27543 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -27140,21 +27547,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27146 "parsing/parser.ml" +# 27553 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 27152 "parsing/parser.ml" +# 27559 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27158 "parsing/parser.ml" +# 27565 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27179,29 +27586,29 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2644 "parsing/parser.mly" +# 2721 "parsing/parser.mly" ( Ppat_tuple(List.rev _1) ) -# 27185 "parsing/parser.ml" +# 27592 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27193 "parsing/parser.ml" +# 27600 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 27199 "parsing/parser.ml" +# 27606 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27205 "parsing/parser.ml" +# 27612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27242,9 +27649,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2646 "parsing/parser.mly" +# 2723 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 27248 "parsing/parser.ml" +# 27655 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -27252,21 +27659,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27258 "parsing/parser.ml" +# 27665 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 27264 "parsing/parser.ml" +# 27671 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27270 "parsing/parser.ml" +# 27677 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27305,30 +27712,30 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2648 "parsing/parser.mly" +# 2725 "parsing/parser.mly" ( Ppat_or(_1, _3) ) -# 27311 "parsing/parser.ml" +# 27718 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27320 "parsing/parser.ml" +# 27727 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 27326 "parsing/parser.ml" +# 27733 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27332 "parsing/parser.ml" +# 27739 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27369,9 +27776,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2650 "parsing/parser.mly" +# 2727 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 27375 "parsing/parser.ml" +# 27782 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -27379,21 +27786,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27385 "parsing/parser.ml" +# 27792 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 27391 "parsing/parser.ml" +# 27798 "parsing/parser.ml" in -# 2621 "parsing/parser.mly" +# 2698 "parsing/parser.mly" ( _1 ) -# 27397 "parsing/parser.ml" +# 27804 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27441,24 +27848,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 27447 "parsing/parser.ml" +# 27854 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 27453 "parsing/parser.ml" +# 27860 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2623 "parsing/parser.mly" +# 2700 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_exception _3) _2) -# 27462 "parsing/parser.ml" +# 27869 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27495,9 +27902,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2747 "parsing/parser.mly" +# 2827 "parsing/parser.mly" ( _3 :: _1 ) -# 27501 "parsing/parser.ml" +# 27908 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27534,9 +27941,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2748 "parsing/parser.mly" +# 2828 "parsing/parser.mly" ( [_3; _1] ) -# 27540 "parsing/parser.ml" +# 27947 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27574,9 +27981,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2749 "parsing/parser.mly" +# 2829 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 27580 "parsing/parser.ml" +# 27987 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27613,9 +28020,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2747 "parsing/parser.mly" +# 2827 "parsing/parser.mly" ( _3 :: _1 ) -# 27619 "parsing/parser.ml" +# 28026 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27652,9 +28059,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = -# 2748 "parsing/parser.mly" +# 2828 "parsing/parser.mly" ( [_3; _1] ) -# 27658 "parsing/parser.ml" +# 28065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27692,9 +28099,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern list) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2749 "parsing/parser.mly" +# 2829 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 27698 "parsing/parser.ml" +# 28105 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27717,9 +28124,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2656 "parsing/parser.mly" +# 2733 "parsing/parser.mly" ( _1 ) -# 27723 "parsing/parser.ml" +# 28130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27755,15 +28162,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 27761 "parsing/parser.ml" +# 28168 "parsing/parser.ml" in -# 2659 "parsing/parser.mly" - ( Ppat_construct(_1, Some _2) ) -# 27767 "parsing/parser.ml" +# 2736 "parsing/parser.mly" + ( Ppat_construct(_1, Some ([], _2)) ) +# 28174 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -27771,15 +28178,108 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27777 "parsing/parser.ml" +# 28184 "parsing/parser.ml" in -# 2662 "parsing/parser.mly" +# 2742 "parsing/parser.mly" ( _1 ) -# 27783 "parsing/parser.ml" +# 28190 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = pat; + MenhirLib.EngineTypes.startp = _startpos_pat_; + MenhirLib.EngineTypes.endp = _endpos_pat_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = xs; + MenhirLib.EngineTypes.startp = _startpos_xs_; + MenhirLib.EngineTypes.endp = _endpos_xs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + }; + } = _menhir_stack in + let pat : (Parsetree.pattern) = Obj.magic pat in + let _5 : unit = Obj.magic _5 in + let xs : (string Asttypes.loc list) = Obj.magic xs in + let _3 : unit = Obj.magic _3 in + let _2 : unit = Obj.magic _2 in + let _1 : (Longident.t) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_pat_ in + let _v : (Parsetree.pattern) = let _1 = + let _1 = + let newtypes = +# 2478 "parsing/parser.mly" + ( xs ) +# 28252 "parsing/parser.ml" + in + let constr = + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 883 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 28261 "parsing/parser.ml" + + in + +# 2739 "parsing/parser.mly" + ( Ppat_construct(constr, Some (newtypes, pat)) ) +# 28267 "parsing/parser.ml" + + in + let _endpos__1_ = _endpos_pat_ in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 918 "parsing/parser.mly" + ( mkpat ~loc:_sloc _1 ) +# 28277 "parsing/parser.ml" + + in + +# 2742 "parsing/parser.mly" + ( _1 ) +# 28283 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27810,24 +28310,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2661 "parsing/parser.mly" +# 2741 "parsing/parser.mly" ( Ppat_variant(_1, Some _2) ) -# 27816 "parsing/parser.ml" +# 28316 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 27825 "parsing/parser.ml" +# 28325 "parsing/parser.ml" in -# 2662 "parsing/parser.mly" +# 2742 "parsing/parser.mly" ( _1 ) -# 27831 "parsing/parser.ml" +# 28331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27875,24 +28375,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 27881 "parsing/parser.ml" +# 28381 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 27887 "parsing/parser.ml" +# 28387 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2664 "parsing/parser.mly" +# 2744 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_lazy _3) _2) -# 27896 "parsing/parser.ml" +# 28396 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27934,15 +28434,15 @@ module Tables = struct let _loc__2_ = (_startpos__2_, _endpos__2_) in let _sloc = (_symbolstartpos, _endpos) in -# 2633 "parsing/parser.mly" +# 2710 "parsing/parser.mly" ( mkpat_cons ~loc:_sloc _loc__2_ (ghpat ~loc:_sloc (Ppat_tuple[_1;_3])) ) -# 27940 "parsing/parser.ml" +# 28440 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 27946 "parsing/parser.ml" +# 28446 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -27972,14 +28472,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = -# 2635 "parsing/parser.mly" +# 2712 "parsing/parser.mly" ( Pat.attr _1 _2 ) -# 27978 "parsing/parser.ml" +# 28478 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 27983 "parsing/parser.ml" +# 28483 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28002,14 +28502,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = -# 2637 "parsing/parser.mly" +# 2714 "parsing/parser.mly" ( _1 ) -# 28008 "parsing/parser.ml" +# 28508 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28013 "parsing/parser.ml" +# 28513 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28054,15 +28554,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 28060 "parsing/parser.ml" +# 28560 "parsing/parser.ml" in -# 2640 "parsing/parser.mly" +# 2717 "parsing/parser.mly" ( Ppat_alias(_1, _3) ) -# 28066 "parsing/parser.ml" +# 28566 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -28070,21 +28570,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28076 "parsing/parser.ml" +# 28576 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 28082 "parsing/parser.ml" +# 28582 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28088 "parsing/parser.ml" +# 28588 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28125,9 +28625,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2642 "parsing/parser.mly" +# 2719 "parsing/parser.mly" ( expecting _loc__3_ "identifier" ) -# 28131 "parsing/parser.ml" +# 28631 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -28135,21 +28635,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28141 "parsing/parser.ml" +# 28641 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 28147 "parsing/parser.ml" +# 28647 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28153 "parsing/parser.ml" +# 28653 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28174,29 +28674,29 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2644 "parsing/parser.mly" +# 2721 "parsing/parser.mly" ( Ppat_tuple(List.rev _1) ) -# 28180 "parsing/parser.ml" +# 28680 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28188 "parsing/parser.ml" +# 28688 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 28194 "parsing/parser.ml" +# 28694 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28200 "parsing/parser.ml" +# 28700 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28237,9 +28737,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2646 "parsing/parser.mly" +# 2723 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 28243 "parsing/parser.ml" +# 28743 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -28247,21 +28747,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28253 "parsing/parser.ml" +# 28753 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 28259 "parsing/parser.ml" +# 28759 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28265 "parsing/parser.ml" +# 28765 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28300,30 +28800,30 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _1 = -# 2648 "parsing/parser.mly" +# 2725 "parsing/parser.mly" ( Ppat_or(_1, _3) ) -# 28306 "parsing/parser.ml" +# 28806 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28315 "parsing/parser.ml" +# 28815 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 28321 "parsing/parser.ml" +# 28821 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28327 "parsing/parser.ml" +# 28827 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28364,9 +28864,9 @@ module Tables = struct let _1 = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2650 "parsing/parser.mly" +# 2727 "parsing/parser.mly" ( expecting _loc__3_ "pattern" ) -# 28370 "parsing/parser.ml" +# 28870 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -28374,21 +28874,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28380 "parsing/parser.ml" +# 28880 "parsing/parser.ml" in -# 2651 "parsing/parser.mly" +# 2728 "parsing/parser.mly" ( _1 ) -# 28386 "parsing/parser.ml" +# 28886 "parsing/parser.ml" in -# 2628 "parsing/parser.mly" +# 2705 "parsing/parser.mly" ( _1 ) -# 28392 "parsing/parser.ml" +# 28892 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28407,9 +28907,9 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 28413 "parsing/parser.ml" +# 28913 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -28421,30 +28921,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 28427 "parsing/parser.ml" +# 28927 "parsing/parser.ml" in -# 2110 "parsing/parser.mly" +# 2200 "parsing/parser.mly" ( Ppat_var _1 ) -# 28433 "parsing/parser.ml" +# 28933 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28442 "parsing/parser.ml" +# 28942 "parsing/parser.ml" in -# 2112 "parsing/parser.mly" +# 2202 "parsing/parser.mly" ( _1 ) -# 28448 "parsing/parser.ml" +# 28948 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28468,23 +28968,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2111 "parsing/parser.mly" +# 2201 "parsing/parser.mly" ( Ppat_any ) -# 28474 "parsing/parser.ml" +# 28974 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 28482 "parsing/parser.ml" +# 28982 "parsing/parser.ml" in -# 2112 "parsing/parser.mly" +# 2202 "parsing/parser.mly" ( _1 ) -# 28488 "parsing/parser.ml" +# 28988 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28507,9 +29007,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.payload) = -# 3771 "parsing/parser.mly" +# 3861 "parsing/parser.mly" ( PStr _1 ) -# 28513 "parsing/parser.ml" +# 29013 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28539,9 +29039,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 3772 "parsing/parser.mly" +# 3862 "parsing/parser.mly" ( PSig _2 ) -# 28545 "parsing/parser.ml" +# 29045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28571,9 +29071,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 3773 "parsing/parser.mly" +# 3863 "parsing/parser.mly" ( PTyp _2 ) -# 28577 "parsing/parser.ml" +# 29077 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28603,9 +29103,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.payload) = -# 3774 "parsing/parser.mly" +# 3864 "parsing/parser.mly" ( PPat (_2, None) ) -# 28609 "parsing/parser.ml" +# 29109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28649,9 +29149,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.payload) = -# 3775 "parsing/parser.mly" +# 3865 "parsing/parser.mly" ( PPat (_2, Some _4) ) -# 28655 "parsing/parser.ml" +# 29155 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28674,9 +29174,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = -# 3174 "parsing/parser.mly" +# 3258 "parsing/parser.mly" ( _1 ) -# 28680 "parsing/parser.ml" +# 29180 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28719,24 +29219,24 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 28723 "parsing/parser.ml" +# 29223 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 985 "parsing/parser.mly" ( xs ) -# 28728 "parsing/parser.ml" +# 29228 "parsing/parser.ml" in -# 3166 "parsing/parser.mly" +# 3250 "parsing/parser.mly" ( _1 ) -# 28734 "parsing/parser.ml" +# 29234 "parsing/parser.ml" in -# 3170 "parsing/parser.mly" +# 3254 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 28740 "parsing/parser.ml" +# 29240 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__3_, _startpos_xs_) in @@ -28744,15 +29244,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 28750 "parsing/parser.ml" +# 29250 "parsing/parser.ml" in -# 3176 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( _1 ) -# 28756 "parsing/parser.ml" +# 29256 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28775,14 +29275,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 28781 "parsing/parser.ml" +# 29281 "parsing/parser.ml" in -# 3174 "parsing/parser.mly" +# 3258 "parsing/parser.mly" ( _1 ) -# 28786 "parsing/parser.ml" +# 29286 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28821,33 +29321,33 @@ module Tables = struct let _v : (Parsetree.core_type) = let _1 = let _1 = let _3 = -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 28827 "parsing/parser.ml" +# 29327 "parsing/parser.ml" in let _1 = let _1 = let xs = # 253 "" ( List.rev xs ) -# 28834 "parsing/parser.ml" +# 29334 "parsing/parser.ml" in -# 919 "parsing/parser.mly" +# 985 "parsing/parser.mly" ( xs ) -# 28839 "parsing/parser.ml" +# 29339 "parsing/parser.ml" in -# 3166 "parsing/parser.mly" +# 3250 "parsing/parser.mly" ( _1 ) -# 28845 "parsing/parser.ml" +# 29345 "parsing/parser.ml" in -# 3170 "parsing/parser.mly" +# 3254 "parsing/parser.mly" ( Ptyp_poly(_1, _3) ) -# 28851 "parsing/parser.ml" +# 29351 "parsing/parser.ml" in let _startpos__1_ = _startpos_xs_ in @@ -28855,15 +29355,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 28861 "parsing/parser.ml" +# 29361 "parsing/parser.ml" in -# 3176 "parsing/parser.mly" +# 3260 "parsing/parser.mly" ( _1 ) -# 28867 "parsing/parser.ml" +# 29367 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28910,9 +29410,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3734 "parsing/parser.mly" +# 3822 "parsing/parser.mly" ( Attr.mk ~loc:(make_loc _sloc) _2 _3 ) -# 28916 "parsing/parser.ml" +# 29416 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -28993,9 +29493,9 @@ module Tables = struct let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 28999 "parsing/parser.ml" +# 29499 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -29005,30 +29505,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 29011 "parsing/parser.ml" +# 29511 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 29019 "parsing/parser.ml" +# 29519 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2811 "parsing/parser.mly" +# 2891 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~prim ~attrs ~loc ~docs, ext ) -# 29032 "parsing/parser.ml" +# 29532 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29044,14 +29544,14 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.private_flag) = let _1 = -# 3602 "parsing/parser.mly" +# 3690 "parsing/parser.mly" ( Public ) -# 29050 "parsing/parser.ml" +# 29550 "parsing/parser.ml" in -# 3599 "parsing/parser.mly" +# 3687 "parsing/parser.mly" ( _1 ) -# 29055 "parsing/parser.ml" +# 29555 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29074,14 +29574,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = let _1 = -# 3603 "parsing/parser.mly" +# 3691 "parsing/parser.mly" ( Private ) -# 29080 "parsing/parser.ml" +# 29580 "parsing/parser.ml" in -# 3599 "parsing/parser.mly" +# 3687 "parsing/parser.mly" ( _1 ) -# 29085 "parsing/parser.ml" +# 29585 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29097,9 +29597,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3625 "parsing/parser.mly" +# 3713 "parsing/parser.mly" ( Public, Concrete ) -# 29103 "parsing/parser.ml" +# 29603 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29122,9 +29622,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3626 "parsing/parser.mly" +# 3714 "parsing/parser.mly" ( Private, Concrete ) -# 29128 "parsing/parser.ml" +# 29628 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29147,9 +29647,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3627 "parsing/parser.mly" +# 3715 "parsing/parser.mly" ( Public, Virtual ) -# 29153 "parsing/parser.ml" +# 29653 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29179,9 +29679,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3628 "parsing/parser.mly" +# 3716 "parsing/parser.mly" ( Private, Virtual ) -# 29185 "parsing/parser.ml" +# 29685 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29211,9 +29711,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag * Asttypes.virtual_flag) = -# 3629 "parsing/parser.mly" +# 3717 "parsing/parser.mly" ( Private, Virtual ) -# 29217 "parsing/parser.ml" +# 29717 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29229,9 +29729,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.rec_flag) = -# 3582 "parsing/parser.mly" +# 3668 "parsing/parser.mly" ( Nonrecursive ) -# 29235 "parsing/parser.ml" +# 29735 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29254,9 +29754,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.rec_flag) = -# 3583 "parsing/parser.mly" +# 3669 "parsing/parser.mly" ( Recursive ) -# 29260 "parsing/parser.ml" +# 29760 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29282,12 +29782,12 @@ module Tables = struct (Longident.t Asttypes.loc * Parsetree.expression) list) = let eo = # 124 "" ( None ) -# 29286 "parsing/parser.ml" +# 29786 "parsing/parser.ml" in -# 2553 "parsing/parser.mly" +# 2630 "parsing/parser.mly" ( eo, fields ) -# 29291 "parsing/parser.ml" +# 29791 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29328,18 +29828,18 @@ module Tables = struct let x = # 191 "" ( x ) -# 29332 "parsing/parser.ml" +# 29832 "parsing/parser.ml" in # 126 "" ( Some x ) -# 29337 "parsing/parser.ml" +# 29837 "parsing/parser.ml" in -# 2553 "parsing/parser.mly" +# 2630 "parsing/parser.mly" ( eo, fields ) -# 29343 "parsing/parser.ml" +# 29843 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29364,17 +29864,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 2996 "parsing/parser.mly" +# 3076 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Type.constructor cid ~args ?res ~attrs ~loc ~info ) -# 29373 "parsing/parser.ml" +# 29873 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1095 "parsing/parser.mly" ( [x] ) -# 29378 "parsing/parser.ml" +# 29878 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29399,17 +29899,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 2996 "parsing/parser.mly" +# 3076 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Type.constructor cid ~args ?res ~attrs ~loc ~info ) -# 29408 "parsing/parser.ml" +# 29908 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1098 "parsing/parser.mly" ( [x] ) -# 29413 "parsing/parser.ml" +# 29913 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29441,17 +29941,17 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_d_ in let _v : (Parsetree.constructor_declaration list) = let x = -# 2996 "parsing/parser.mly" +# 3076 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Type.constructor cid ~args ?res ~attrs ~loc ~info ) -# 29450 "parsing/parser.ml" +# 29950 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1102 "parsing/parser.mly" ( x :: xs ) -# 29455 "parsing/parser.ml" +# 29955 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29477,23 +29977,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3108 "parsing/parser.mly" +# 3188 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 29486 "parsing/parser.ml" +# 29986 "parsing/parser.ml" in -# 3102 "parsing/parser.mly" +# 3182 "parsing/parser.mly" ( _1 ) -# 29491 "parsing/parser.ml" +# 29991 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1095 "parsing/parser.mly" ( [x] ) -# 29497 "parsing/parser.ml" +# 29997 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29516,14 +30016,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3104 "parsing/parser.mly" +# 3184 "parsing/parser.mly" ( _1 ) -# 29522 "parsing/parser.ml" +# 30022 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1095 "parsing/parser.mly" ( [x] ) -# 29527 "parsing/parser.ml" +# 30027 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29549,23 +30049,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3108 "parsing/parser.mly" +# 3188 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 29558 "parsing/parser.ml" +# 30058 "parsing/parser.ml" in -# 3102 "parsing/parser.mly" +# 3182 "parsing/parser.mly" ( _1 ) -# 29563 "parsing/parser.ml" +# 30063 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1098 "parsing/parser.mly" ( [x] ) -# 29569 "parsing/parser.ml" +# 30069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29588,14 +30088,14 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3104 "parsing/parser.mly" +# 3184 "parsing/parser.mly" ( _1 ) -# 29594 "parsing/parser.ml" +# 30094 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1098 "parsing/parser.mly" ( [x] ) -# 29599 "parsing/parser.ml" +# 30099 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29628,23 +30128,23 @@ module Tables = struct let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = let _1 = -# 3108 "parsing/parser.mly" +# 3188 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 29637 "parsing/parser.ml" +# 30137 "parsing/parser.ml" in -# 3102 "parsing/parser.mly" +# 3182 "parsing/parser.mly" ( _1 ) -# 29642 "parsing/parser.ml" +# 30142 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1102 "parsing/parser.mly" ( x :: xs ) -# 29648 "parsing/parser.ml" +# 30148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29674,14 +30174,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos__1_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3104 "parsing/parser.mly" +# 3184 "parsing/parser.mly" ( _1 ) -# 29680 "parsing/parser.ml" +# 30180 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1102 "parsing/parser.mly" ( x :: xs ) -# 29685 "parsing/parser.ml" +# 30185 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29706,17 +30206,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3108 "parsing/parser.mly" +# 3188 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 29715 "parsing/parser.ml" +# 30215 "parsing/parser.ml" in -# 1029 "parsing/parser.mly" +# 1095 "parsing/parser.mly" ( [x] ) -# 29720 "parsing/parser.ml" +# 30220 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29741,17 +30241,17 @@ module Tables = struct let _startpos = _startpos_d_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3108 "parsing/parser.mly" +# 3188 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 29750 "parsing/parser.ml" +# 30250 "parsing/parser.ml" in -# 1032 "parsing/parser.mly" +# 1098 "parsing/parser.mly" ( [x] ) -# 29755 "parsing/parser.ml" +# 30255 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29783,17 +30283,17 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_d_ in let _v : (Parsetree.extension_constructor list) = let x = -# 3108 "parsing/parser.mly" +# 3188 "parsing/parser.mly" ( let cid, args, res, attrs, loc, info = d in Te.decl cid ~args ?res ~attrs ~loc ~info ) -# 29792 "parsing/parser.ml" +# 30292 "parsing/parser.ml" in -# 1036 "parsing/parser.mly" +# 1102 "parsing/parser.mly" ( x :: xs ) -# 29797 "parsing/parser.ml" +# 30297 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29809,9 +30309,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * Parsetree.core_type * Ast_helper.loc) list) = -# 895 "parsing/parser.mly" +# 961 "parsing/parser.mly" ( [] ) -# 29815 "parsing/parser.ml" +# 30315 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29868,21 +30368,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1990 "parsing/parser.mly" +# 2080 "parsing/parser.mly" ( _1, _3, make_loc _sloc ) -# 29874 "parsing/parser.ml" +# 30374 "parsing/parser.ml" in # 183 "" ( x ) -# 29880 "parsing/parser.ml" +# 30380 "parsing/parser.ml" in -# 897 "parsing/parser.mly" +# 963 "parsing/parser.mly" ( x :: xs ) -# 29886 "parsing/parser.ml" +# 30386 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29905,9 +30405,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 909 "parsing/parser.mly" +# 975 "parsing/parser.mly" ( [ x ] ) -# 29911 "parsing/parser.ml" +# 30411 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29937,9 +30437,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Lexing.position * Parsetree.functor_parameter) list) = -# 911 "parsing/parser.mly" +# 977 "parsing/parser.mly" ( x :: xs ) -# 29943 "parsing/parser.ml" +# 30443 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29962,9 +30462,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 909 "parsing/parser.mly" +# 975 "parsing/parser.mly" ( [ x ] ) -# 29968 "parsing/parser.ml" +# 30468 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -29994,9 +30494,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Asttypes.arg_label * Parsetree.expression) list) = -# 911 "parsing/parser.mly" +# 977 "parsing/parser.mly" ( x :: xs ) -# 30000 "parsing/parser.ml" +# 30500 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30019,9 +30519,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 909 "parsing/parser.mly" +# 975 "parsing/parser.mly" ( [ x ] ) -# 30025 "parsing/parser.ml" +# 30525 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30051,9 +30551,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Asttypes.label list) = -# 911 "parsing/parser.mly" +# 977 "parsing/parser.mly" ( x :: xs ) -# 30057 "parsing/parser.ml" +# 30557 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30089,21 +30589,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30095 "parsing/parser.ml" +# 30595 "parsing/parser.ml" in -# 3162 "parsing/parser.mly" +# 3246 "parsing/parser.mly" ( _2 ) -# 30101 "parsing/parser.ml" +# 30601 "parsing/parser.ml" in -# 909 "parsing/parser.mly" +# 975 "parsing/parser.mly" ( [ x ] ) -# 30107 "parsing/parser.ml" +# 30607 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30146,21 +30646,21 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 30152 "parsing/parser.ml" +# 30652 "parsing/parser.ml" in -# 3162 "parsing/parser.mly" +# 3246 "parsing/parser.mly" ( _2 ) -# 30158 "parsing/parser.ml" +# 30658 "parsing/parser.ml" in -# 911 "parsing/parser.mly" +# 977 "parsing/parser.mly" ( x :: xs ) -# 30164 "parsing/parser.ml" +# 30664 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30185,12 +30685,12 @@ module Tables = struct let _v : (Parsetree.case list) = let _1 = # 124 "" ( None ) -# 30189 "parsing/parser.ml" +# 30689 "parsing/parser.ml" in -# 1000 "parsing/parser.mly" +# 1066 "parsing/parser.mly" ( [x] ) -# 30194 "parsing/parser.ml" +# 30694 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30224,13 +30724,13 @@ module Tables = struct # 126 "" ( Some x ) -# 30228 "parsing/parser.ml" +# 30728 "parsing/parser.ml" in -# 1000 "parsing/parser.mly" +# 1066 "parsing/parser.mly" ( [x] ) -# 30234 "parsing/parser.ml" +# 30734 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30267,9 +30767,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.case list) = -# 1004 "parsing/parser.mly" +# 1070 "parsing/parser.mly" ( x :: xs ) -# 30273 "parsing/parser.ml" +# 30773 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30293,20 +30793,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type list) = let xs = let x = -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 30299 "parsing/parser.ml" +# 30799 "parsing/parser.ml" in -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 30304 "parsing/parser.ml" +# 30804 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30310 "parsing/parser.ml" +# 30810 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30344,20 +30844,20 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type list) = let xs = let x = -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 30350 "parsing/parser.ml" +# 30850 "parsing/parser.ml" in -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 30355 "parsing/parser.ml" +# 30855 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30361 "parsing/parser.ml" +# 30861 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30380,14 +30880,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.with_constraint list) = let xs = -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 30386 "parsing/parser.ml" +# 30886 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30391 "parsing/parser.ml" +# 30891 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30424,14 +30924,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.with_constraint list) = let xs = -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 30430 "parsing/parser.ml" +# 30930 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30435 "parsing/parser.ml" +# 30935 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30454,14 +30954,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.row_field list) = let xs = -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 30460 "parsing/parser.ml" +# 30960 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30465 "parsing/parser.ml" +# 30965 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30498,14 +30998,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.row_field list) = let xs = -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 30504 "parsing/parser.ml" +# 31004 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30509 "parsing/parser.ml" +# 31009 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30528,14 +31028,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 30534 "parsing/parser.ml" +# 31034 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30539 "parsing/parser.ml" +# 31039 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30572,14 +31072,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 30578 "parsing/parser.ml" +# 31078 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30583 "parsing/parser.ml" +# 31083 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30602,14 +31102,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 30608 "parsing/parser.ml" +# 31108 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30613 "parsing/parser.ml" +# 31113 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30646,14 +31146,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = let xs = -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 30652 "parsing/parser.ml" +# 31152 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30657 "parsing/parser.ml" +# 31157 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30676,14 +31176,14 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 935 "parsing/parser.mly" +# 1001 "parsing/parser.mly" ( [ x ] ) -# 30682 "parsing/parser.ml" +# 31182 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30687 "parsing/parser.ml" +# 31187 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30720,14 +31220,14 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = let xs = -# 939 "parsing/parser.mly" +# 1005 "parsing/parser.mly" ( x :: xs ) -# 30726 "parsing/parser.ml" +# 31226 "parsing/parser.ml" in -# 943 "parsing/parser.mly" +# 1009 "parsing/parser.mly" ( xs ) -# 30731 "parsing/parser.ml" +# 31231 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30764,9 +31264,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 966 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x :: xs ) -# 30770 "parsing/parser.ml" +# 31270 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30803,9 +31303,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 970 "parsing/parser.mly" +# 1036 "parsing/parser.mly" ( [ x2; x1 ] ) -# 30809 "parsing/parser.ml" +# 31309 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30842,9 +31342,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.expression list) = -# 966 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x :: xs ) -# 30848 "parsing/parser.ml" +# 31348 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30881,9 +31381,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.expression list) = -# 970 "parsing/parser.mly" +# 1036 "parsing/parser.mly" ( [ x2; x1 ] ) -# 30887 "parsing/parser.ml" +# 31387 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30920,9 +31420,9 @@ module Tables = struct let _startpos = _startpos_xs_ in let _endpos = _endpos_x_ in let _v : (Parsetree.core_type list) = -# 966 "parsing/parser.mly" +# 1032 "parsing/parser.mly" ( x :: xs ) -# 30926 "parsing/parser.ml" +# 31426 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30959,9 +31459,9 @@ module Tables = struct let _startpos = _startpos_x1_ in let _endpos = _endpos_x2_ in let _v : (Parsetree.core_type list) = -# 970 "parsing/parser.mly" +# 1036 "parsing/parser.mly" ( [ x2; x1 ] ) -# 30965 "parsing/parser.ml" +# 31465 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -30984,9 +31484,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.row_field) = -# 3345 "parsing/parser.mly" +# 3429 "parsing/parser.mly" ( _1 ) -# 30990 "parsing/parser.ml" +# 31490 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31012,9 +31512,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3347 "parsing/parser.mly" +# 3431 "parsing/parser.mly" ( Rf.inherit_ ~loc:(make_loc _sloc) _1 ) -# 31018 "parsing/parser.ml" +# 31518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31039,12 +31539,12 @@ module Tables = struct let _v : (Parsetree.expression list) = let _2 = # 124 "" ( None ) -# 31043 "parsing/parser.ml" +# 31543 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31048 "parsing/parser.ml" +# 31548 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31078,13 +31578,13 @@ module Tables = struct # 126 "" ( Some x ) -# 31082 "parsing/parser.ml" +# 31582 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31088 "parsing/parser.ml" +# 31588 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31121,9 +31621,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.expression list) = -# 991 "parsing/parser.mly" +# 1057 "parsing/parser.mly" ( x :: xs ) -# 31127 "parsing/parser.ml" +# 31627 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31149,9 +31649,9 @@ module Tables = struct } = _menhir_stack in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 31155 "parsing/parser.ml" +# 31655 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -31159,22 +31659,22 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = # 124 "" ( None ) -# 31163 "parsing/parser.ml" +# 31663 "parsing/parser.ml" in let x = let label = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 31170 "parsing/parser.ml" +# 31670 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31178 "parsing/parser.ml" +# 31678 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31182,7 +31682,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2576 "parsing/parser.mly" +# 2653 "parsing/parser.mly" ( let e = match oe with | None -> @@ -31192,13 +31692,13 @@ module Tables = struct e in label, e ) -# 31196 "parsing/parser.ml" +# 31696 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31202 "parsing/parser.ml" +# 31702 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31231,9 +31731,9 @@ module Tables = struct let x : unit = Obj.magic x in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 31237 "parsing/parser.ml" +# 31737 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -31241,22 +31741,22 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let _2 = # 126 "" ( Some x ) -# 31245 "parsing/parser.ml" +# 31745 "parsing/parser.ml" in let x = let label = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 31252 "parsing/parser.ml" +# 31752 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31260 "parsing/parser.ml" +# 31760 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31264,7 +31764,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2576 "parsing/parser.mly" +# 2653 "parsing/parser.mly" ( let e = match oe with | None -> @@ -31274,13 +31774,13 @@ module Tables = struct e in label, e ) -# 31278 "parsing/parser.ml" +# 31778 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31284 "parsing/parser.ml" +# 31784 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31320,9 +31820,9 @@ module Tables = struct let _2 : unit = Obj.magic _2 in let oe : (Parsetree.expression option) = Obj.magic oe in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 31326 "parsing/parser.ml" +# 31826 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -31330,17 +31830,17 @@ module Tables = struct let _v : ((Asttypes.label Asttypes.loc * Parsetree.expression) list) = let x = let label = let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 31336 "parsing/parser.ml" +# 31836 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31344 "parsing/parser.ml" +# 31844 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31348,7 +31848,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2576 "parsing/parser.mly" +# 2653 "parsing/parser.mly" ( let e = match oe with | None -> @@ -31358,13 +31858,13 @@ module Tables = struct e in label, e ) -# 31362 "parsing/parser.ml" +# 31862 "parsing/parser.ml" in -# 991 "parsing/parser.mly" +# 1057 "parsing/parser.mly" ( x :: xs ) -# 31368 "parsing/parser.ml" +# 31868 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31389,12 +31889,12 @@ module Tables = struct let _v : (Parsetree.pattern list) = let _2 = # 124 "" ( None ) -# 31393 "parsing/parser.ml" +# 31893 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31398 "parsing/parser.ml" +# 31898 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31428,13 +31928,13 @@ module Tables = struct # 126 "" ( Some x ) -# 31432 "parsing/parser.ml" +# 31932 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31438 "parsing/parser.ml" +# 31938 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31471,9 +31971,9 @@ module Tables = struct let _startpos = _startpos_x_ in let _endpos = _endpos_xs_ in let _v : (Parsetree.pattern list) = -# 991 "parsing/parser.mly" +# 1057 "parsing/parser.mly" ( x :: xs ) -# 31477 "parsing/parser.ml" +# 31977 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31512,7 +32012,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = # 124 "" ( None ) -# 31516 "parsing/parser.ml" +# 32016 "parsing/parser.ml" in let x = let label = @@ -31520,9 +32020,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31526 "parsing/parser.ml" +# 32026 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31530,7 +32030,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2559 "parsing/parser.mly" +# 2636 "parsing/parser.mly" ( let e = match eo with | None -> @@ -31540,13 +32040,13 @@ module Tables = struct e in label, mkexp_opt_constraint ~loc:_sloc e c ) -# 31544 "parsing/parser.ml" +# 32044 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31550 "parsing/parser.ml" +# 32050 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31592,7 +32092,7 @@ module Tables = struct let _v : ((Longident.t Asttypes.loc * Parsetree.expression) list) = let _2 = # 126 "" ( Some x ) -# 31596 "parsing/parser.ml" +# 32096 "parsing/parser.ml" in let x = let label = @@ -31600,9 +32100,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31606 "parsing/parser.ml" +# 32106 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31610,7 +32110,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2559 "parsing/parser.mly" +# 2636 "parsing/parser.mly" ( let e = match eo with | None -> @@ -31620,13 +32120,13 @@ module Tables = struct e in label, mkexp_opt_constraint ~loc:_sloc e c ) -# 31624 "parsing/parser.ml" +# 32124 "parsing/parser.ml" in -# 987 "parsing/parser.mly" +# 1053 "parsing/parser.mly" ( [x] ) -# 31630 "parsing/parser.ml" +# 32130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31682,9 +32182,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31688 "parsing/parser.ml" +# 32188 "parsing/parser.ml" in let _startpos_label_ = _startpos__1_ in @@ -31692,7 +32192,7 @@ module Tables = struct let _symbolstartpos = _startpos_label_ in let _sloc = (_symbolstartpos, _endpos) in -# 2559 "parsing/parser.mly" +# 2636 "parsing/parser.mly" ( let e = match eo with | None -> @@ -31702,13 +32202,13 @@ module Tables = struct e in label, mkexp_opt_constraint ~loc:_sloc e c ) -# 31706 "parsing/parser.ml" +# 32206 "parsing/parser.ml" in -# 991 "parsing/parser.mly" +# 1057 "parsing/parser.mly" ( x :: xs ) -# 31712 "parsing/parser.ml" +# 32212 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31731,9 +32231,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = -# 2079 "parsing/parser.mly" +# 2169 "parsing/parser.mly" ( _1 ) -# 31737 "parsing/parser.ml" +# 32237 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31763,9 +32263,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2080 "parsing/parser.mly" +# 2170 "parsing/parser.mly" ( _1 ) -# 31769 "parsing/parser.ml" +# 32269 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31803,24 +32303,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2082 "parsing/parser.mly" +# 2172 "parsing/parser.mly" ( Pexp_sequence(_1, _3) ) -# 31809 "parsing/parser.ml" +# 32309 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 31818 "parsing/parser.ml" +# 32318 "parsing/parser.ml" in -# 2083 "parsing/parser.mly" +# 2173 "parsing/parser.mly" ( _1 ) -# 31824 "parsing/parser.ml" +# 32324 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31874,11 +32374,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2085 "parsing/parser.mly" +# 2175 "parsing/parser.mly" ( let seq = mkexp ~loc:_sloc (Pexp_sequence (_1, _5)) in let payload = PStr [mkstrexp seq []] in mkexp ~loc:_sloc (Pexp_extension (_4, payload)) ) -# 31882 "parsing/parser.ml" +# 32382 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -31945,18 +32445,18 @@ module Tables = struct let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 31951 "parsing/parser.ml" +# 32451 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined4_ in let attrs2 = let _1 = _1_inlined3 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 31960 "parsing/parser.ml" +# 32460 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -31966,17 +32466,17 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 31972 "parsing/parser.ml" +# 32472 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 31980 "parsing/parser.ml" +# 32480 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in @@ -31984,14 +32484,14 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3026 "parsing/parser.mly" +# 3106 "parsing/parser.mly" ( let args, res = args_res in let loc = make_loc (_startpos, _endpos_attrs2_) in let docs = symbol_docs _sloc in Te.mk_exception ~attrs (Te.decl id ~args ?res ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 31995 "parsing/parser.ml" +# 32495 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32017,21 +32517,21 @@ module Tables = struct let _1 = # 260 "" ( List.flatten xss ) -# 32021 "parsing/parser.ml" +# 32521 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 810 "parsing/parser.mly" +# 876 "parsing/parser.mly" ( extra_sig _startpos _endpos _1 ) -# 32029 "parsing/parser.ml" +# 32529 "parsing/parser.ml" in -# 1547 "parsing/parser.mly" +# 1618 "parsing/parser.mly" ( _1 ) -# 32035 "parsing/parser.ml" +# 32535 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32063,9 +32563,9 @@ module Tables = struct let _v : (Parsetree.signature_item) = let _2 = let _1 = _1_inlined1 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 32069 "parsing/parser.ml" +# 32569 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -32073,10 +32573,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1562 "parsing/parser.mly" +# 1633 "parsing/parser.mly" ( let docs = symbol_docs _sloc in mksig ~loc:_sloc (Psig_extension (_1, (add_docs_attrs docs _2))) ) -# 32080 "parsing/parser.ml" +# 32580 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32100,23 +32600,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1566 "parsing/parser.mly" +# 1637 "parsing/parser.mly" ( Psig_attribute _1 ) -# 32106 "parsing/parser.ml" +# 32606 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 858 "parsing/parser.mly" +# 924 "parsing/parser.mly" ( mksig ~loc:_sloc _1 ) -# 32114 "parsing/parser.ml" +# 32614 "parsing/parser.ml" in -# 1568 "parsing/parser.mly" +# 1639 "parsing/parser.mly" ( _1 ) -# 32120 "parsing/parser.ml" +# 32620 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32140,23 +32640,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1571 "parsing/parser.mly" +# 1642 "parsing/parser.mly" ( psig_value _1 ) -# 32146 "parsing/parser.ml" +# 32646 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32154 "parsing/parser.ml" +# 32654 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32160 "parsing/parser.ml" +# 32660 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32180,23 +32680,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1573 "parsing/parser.mly" +# 1644 "parsing/parser.mly" ( psig_value _1 ) -# 32186 "parsing/parser.ml" +# 32686 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32194 "parsing/parser.ml" +# 32694 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32200 "parsing/parser.ml" +# 32700 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32231,26 +32731,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 32237 "parsing/parser.ml" +# 32737 "parsing/parser.ml" in -# 2847 "parsing/parser.mly" +# 2927 "parsing/parser.mly" ( _1 ) -# 32242 "parsing/parser.ml" +# 32742 "parsing/parser.ml" in -# 2830 "parsing/parser.mly" +# 2910 "parsing/parser.mly" ( _1 ) -# 32248 "parsing/parser.ml" +# 32748 "parsing/parser.ml" in -# 1575 "parsing/parser.mly" +# 1646 "parsing/parser.mly" ( psig_type _1 ) -# 32254 "parsing/parser.ml" +# 32754 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -32258,15 +32758,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32264 "parsing/parser.ml" +# 32764 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32270 "parsing/parser.ml" +# 32770 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32301,26 +32801,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 32307 "parsing/parser.ml" +# 32807 "parsing/parser.ml" in -# 2847 "parsing/parser.mly" +# 2927 "parsing/parser.mly" ( _1 ) -# 32312 "parsing/parser.ml" +# 32812 "parsing/parser.ml" in -# 2835 "parsing/parser.mly" +# 2915 "parsing/parser.mly" ( _1 ) -# 32318 "parsing/parser.ml" +# 32818 "parsing/parser.ml" in -# 1577 "parsing/parser.mly" +# 1648 "parsing/parser.mly" ( psig_typesubst _1 ) -# 32324 "parsing/parser.ml" +# 32824 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -32328,15 +32828,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32334 "parsing/parser.ml" +# 32834 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32340 "parsing/parser.ml" +# 32840 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32421,16 +32921,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 32427 "parsing/parser.ml" +# 32927 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1040 "parsing/parser.mly" +# 1106 "parsing/parser.mly" ( List.rev xs ) -# 32434 "parsing/parser.ml" +# 32934 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -32438,46 +32938,46 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32444 "parsing/parser.ml" +# 32944 "parsing/parser.ml" in let _4 = -# 3590 "parsing/parser.mly" +# 3676 "parsing/parser.mly" ( Recursive ) -# 32450 "parsing/parser.ml" +# 32950 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 32457 "parsing/parser.ml" +# 32957 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3095 "parsing/parser.mly" +# 3175 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 32469 "parsing/parser.ml" +# 32969 "parsing/parser.ml" in -# 3082 "parsing/parser.mly" +# 3162 "parsing/parser.mly" ( _1 ) -# 32475 "parsing/parser.ml" +# 32975 "parsing/parser.ml" in -# 1579 "parsing/parser.mly" +# 1650 "parsing/parser.mly" ( psig_typext _1 ) -# 32481 "parsing/parser.ml" +# 32981 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -32485,15 +32985,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32491 "parsing/parser.ml" +# 32991 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32497 "parsing/parser.ml" +# 32997 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32585,16 +33085,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 32591 "parsing/parser.ml" +# 33091 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1040 "parsing/parser.mly" +# 1106 "parsing/parser.mly" ( List.rev xs ) -# 32598 "parsing/parser.ml" +# 33098 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -32602,9 +33102,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32608 "parsing/parser.ml" +# 33108 "parsing/parser.ml" in let _4 = @@ -32613,41 +33113,41 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3591 "parsing/parser.mly" +# 3678 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 32619 "parsing/parser.ml" +# 33119 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 32627 "parsing/parser.ml" +# 33127 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3095 "parsing/parser.mly" +# 3175 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 32639 "parsing/parser.ml" +# 33139 "parsing/parser.ml" in -# 3082 "parsing/parser.mly" +# 3162 "parsing/parser.mly" ( _1 ) -# 32645 "parsing/parser.ml" +# 33145 "parsing/parser.ml" in -# 1579 "parsing/parser.mly" +# 1650 "parsing/parser.mly" ( psig_typext _1 ) -# 32651 "parsing/parser.ml" +# 33151 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -32655,15 +33155,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32661 "parsing/parser.ml" +# 33161 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32667 "parsing/parser.ml" +# 33167 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32687,23 +33187,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1581 "parsing/parser.mly" +# 1652 "parsing/parser.mly" ( psig_exception _1 ) -# 32693 "parsing/parser.ml" +# 33193 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32701 "parsing/parser.ml" +# 33201 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32707 "parsing/parser.ml" +# 33207 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32766,9 +33266,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 32772 "parsing/parser.ml" +# 33272 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -32778,37 +33278,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32784 "parsing/parser.ml" +# 33284 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 32792 "parsing/parser.ml" +# 33292 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1610 "parsing/parser.mly" +# 1683 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 32806 "parsing/parser.ml" +# 33306 "parsing/parser.ml" in -# 1583 "parsing/parser.mly" +# 1654 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 32812 "parsing/parser.ml" +# 33312 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -32816,15 +33316,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32822 "parsing/parser.ml" +# 33322 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32828 "parsing/parser.ml" +# 33328 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32894,9 +33394,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 32900 "parsing/parser.ml" +# 33400 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in @@ -32907,9 +33407,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32913 "parsing/parser.ml" +# 33413 "parsing/parser.ml" in let (_endpos_id_, _startpos_id_) = (_endpos__1_, _startpos__1_) in @@ -32917,9 +33417,9 @@ module Tables = struct let _symbolstartpos = _startpos_id_ in let _sloc = (_symbolstartpos, _endpos) in -# 1647 "parsing/parser.mly" +# 1720 "parsing/parser.mly" ( Mty.alias ~loc:(make_loc _sloc) id ) -# 32923 "parsing/parser.ml" +# 33423 "parsing/parser.ml" in let name = @@ -32928,37 +33428,37 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 32934 "parsing/parser.ml" +# 33434 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 32942 "parsing/parser.ml" +# 33442 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1638 "parsing/parser.mly" +# 1711 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Md.mk name body ~attrs ~loc ~docs, ext ) -# 32956 "parsing/parser.ml" +# 33456 "parsing/parser.ml" in -# 1585 "parsing/parser.mly" +# 1656 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_module body, ext) ) -# 32962 "parsing/parser.ml" +# 33462 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -32966,15 +33466,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 32972 "parsing/parser.ml" +# 33472 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 32978 "parsing/parser.ml" +# 33478 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -32998,23 +33498,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1587 "parsing/parser.mly" +# 1658 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modsubst body, ext) ) -# 33004 "parsing/parser.ml" +# 33504 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33012 "parsing/parser.ml" +# 33512 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 33018 "parsing/parser.ml" +# 33518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33100,9 +33600,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 33106 "parsing/parser.ml" +# 33606 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -33112,49 +33612,49 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33118 "parsing/parser.ml" +# 33618 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 33126 "parsing/parser.ml" +# 33626 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1681 "parsing/parser.mly" +# 1754 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in ext, Md.mk name mty ~attrs ~loc ~docs ) -# 33140 "parsing/parser.ml" +# 33640 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 33146 "parsing/parser.ml" +# 33646 "parsing/parser.ml" in -# 1670 "parsing/parser.mly" +# 1743 "parsing/parser.mly" ( _1 ) -# 33152 "parsing/parser.ml" +# 33652 "parsing/parser.ml" in -# 1589 "parsing/parser.mly" +# 1660 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_recmodule l, ext) ) -# 33158 "parsing/parser.ml" +# 33658 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -33162,15 +33662,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33168 "parsing/parser.ml" +# 33668 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 33174 "parsing/parser.ml" +# 33674 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33194,23 +33694,63 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1591 "parsing/parser.mly" +# 1662 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_modtype body, ext) ) -# 33200 "parsing/parser.ml" +# 33700 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33208 "parsing/parser.ml" +# 33708 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" + ( _1 ) +# 33714 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + } = _menhir_stack in + let _1 : (Parsetree.module_type_declaration * string Asttypes.loc option) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__1_ in + let _v : (Parsetree.signature_item) = let _1 = + let _1 = +# 1664 "parsing/parser.mly" + ( let (body, ext) = _1 in (Psig_modtypesubst body, ext) ) +# 33740 "parsing/parser.ml" + in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 941 "parsing/parser.mly" + ( wrap_mksig_ext ~loc:_sloc _1 ) +# 33748 "parsing/parser.ml" + + in + +# 1674 "parsing/parser.mly" ( _1 ) -# 33214 "parsing/parser.ml" +# 33754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33234,23 +33774,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1593 "parsing/parser.mly" +# 1666 "parsing/parser.mly" ( let (body, ext) = _1 in (Psig_open body, ext) ) -# 33240 "parsing/parser.ml" +# 33780 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33248 "parsing/parser.ml" +# 33788 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 33254 "parsing/parser.ml" +# 33794 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33306,38 +33846,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 33312 "parsing/parser.ml" +# 33852 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 33321 "parsing/parser.ml" +# 33861 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1439 "parsing/parser.mly" +# 1510 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 33335 "parsing/parser.ml" +# 33875 "parsing/parser.ml" in -# 1595 "parsing/parser.mly" +# 1668 "parsing/parser.mly" ( psig_include _1 ) -# 33341 "parsing/parser.ml" +# 33881 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -33345,15 +33885,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33351 "parsing/parser.ml" +# 33891 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 33357 "parsing/parser.ml" +# 33897 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33430,9 +33970,9 @@ module Tables = struct let cty : (Parsetree.class_type) = Obj.magic cty in let _7 : unit = Obj.magic _7 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 33436 "parsing/parser.ml" +# 33976 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -33450,9 +33990,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 33456 "parsing/parser.ml" +# 33996 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -33462,24 +34002,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 33468 "parsing/parser.ml" +# 34008 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 33476 "parsing/parser.ml" +# 34016 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2011 "parsing/parser.mly" +# 2101 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -33487,25 +34027,25 @@ module Tables = struct ext, Ci.mk id cty ~virt ~params ~attrs ~loc ~docs ) -# 33491 "parsing/parser.ml" +# 34031 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 33497 "parsing/parser.ml" +# 34037 "parsing/parser.ml" in -# 1999 "parsing/parser.mly" +# 2089 "parsing/parser.mly" ( _1 ) -# 33503 "parsing/parser.ml" +# 34043 "parsing/parser.ml" in -# 1597 "parsing/parser.mly" +# 1670 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class l, ext) ) -# 33509 "parsing/parser.ml" +# 34049 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -33513,15 +34053,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33519 "parsing/parser.ml" +# 34059 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 33525 "parsing/parser.ml" +# 34065 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33545,23 +34085,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.signature_item) = let _1 = let _1 = -# 1599 "parsing/parser.mly" +# 1672 "parsing/parser.mly" ( let (ext, l) = _1 in (Psig_class_type l, ext) ) -# 33551 "parsing/parser.ml" +# 34091 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 875 "parsing/parser.mly" +# 941 "parsing/parser.mly" ( wrap_mksig_ext ~loc:_sloc _1 ) -# 33559 "parsing/parser.ml" +# 34099 "parsing/parser.ml" in -# 1601 "parsing/parser.mly" +# 1674 "parsing/parser.mly" ( _1 ) -# 33565 "parsing/parser.ml" +# 34105 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33584,9 +34124,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.constant) = -# 3421 "parsing/parser.mly" +# 3505 "parsing/parser.mly" ( _1 ) -# 33590 "parsing/parser.ml" +# 34130 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33611,18 +34151,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 637 "parsing/parser.mly" +# 691 "parsing/parser.mly" (string * char option) -# 33617 "parsing/parser.ml" +# 34157 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3422 "parsing/parser.mly" +# 3506 "parsing/parser.mly" ( let (n, m) = _2 in Pconst_integer("-" ^ n, m) ) -# 33626 "parsing/parser.ml" +# 34166 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33647,18 +34187,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 616 "parsing/parser.mly" +# 670 "parsing/parser.mly" (string * char option) -# 33653 "parsing/parser.ml" +# 34193 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3423 "parsing/parser.mly" +# 3507 "parsing/parser.mly" ( let (f, m) = _2 in Pconst_float("-" ^ f, m) ) -# 33662 "parsing/parser.ml" +# 34202 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33683,18 +34223,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 637 "parsing/parser.mly" +# 691 "parsing/parser.mly" (string * char option) -# 33689 "parsing/parser.ml" +# 34229 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3424 "parsing/parser.mly" +# 3508 "parsing/parser.mly" ( let (n, m) = _2 in Pconst_integer (n, m) ) -# 33698 "parsing/parser.ml" +# 34238 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33719,18 +34259,18 @@ module Tables = struct }; } = _menhir_stack in let _2 : ( -# 616 "parsing/parser.mly" +# 670 "parsing/parser.mly" (string * char option) -# 33725 "parsing/parser.ml" +# 34265 "parsing/parser.ml" ) = Obj.magic _2 in let _1 : unit = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.constant) = -# 3425 "parsing/parser.mly" +# 3509 "parsing/parser.mly" ( let (f, m) = _2 in Pconst_float(f, m) ) -# 33734 "parsing/parser.ml" +# 34274 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33771,18 +34311,18 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 2759 "parsing/parser.mly" +# 2839 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 33779 "parsing/parser.ml" +# 34319 "parsing/parser.ml" in -# 2730 "parsing/parser.mly" +# 2810 "parsing/parser.mly" ( let (fields, closed) = _2 in Ppat_record(fields, closed) ) -# 33786 "parsing/parser.ml" +# 34326 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -33790,15 +34330,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 33796 "parsing/parser.ml" +# 34336 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 33802 "parsing/parser.ml" +# 34342 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33839,19 +34379,19 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 2759 "parsing/parser.mly" +# 2839 "parsing/parser.mly" ( let fields, closed = _1 in let closed = match closed with Some () -> Open | None -> Closed in fields, closed ) -# 33847 "parsing/parser.ml" +# 34387 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2733 "parsing/parser.mly" +# 2813 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 33855 "parsing/parser.ml" +# 34395 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -33859,15 +34399,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 33865 "parsing/parser.ml" +# 34405 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 33871 "parsing/parser.ml" +# 34411 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33906,15 +34446,15 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2753 "parsing/parser.mly" +# 2833 "parsing/parser.mly" ( ps ) -# 33912 "parsing/parser.ml" +# 34452 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2735 "parsing/parser.mly" +# 2815 "parsing/parser.mly" ( fst (mktailpat _loc__3_ _2) ) -# 33918 "parsing/parser.ml" +# 34458 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -33922,15 +34462,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 33928 "parsing/parser.ml" +# 34468 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 33934 "parsing/parser.ml" +# 34474 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -33969,16 +34509,16 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2753 "parsing/parser.mly" +# 2833 "parsing/parser.mly" ( ps ) -# 33975 "parsing/parser.ml" +# 34515 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2737 "parsing/parser.mly" +# 2817 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 33982 "parsing/parser.ml" +# 34522 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -33986,15 +34526,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 33992 "parsing/parser.ml" +# 34532 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 33998 "parsing/parser.ml" +# 34538 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34033,14 +34573,14 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2753 "parsing/parser.mly" +# 2833 "parsing/parser.mly" ( ps ) -# 34039 "parsing/parser.ml" +# 34579 "parsing/parser.ml" in -# 2739 "parsing/parser.mly" +# 2819 "parsing/parser.mly" ( Ppat_array _2 ) -# 34044 "parsing/parser.ml" +# 34584 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34048,15 +34588,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34054 "parsing/parser.ml" +# 34594 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 34060 "parsing/parser.ml" +# 34600 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34087,24 +34627,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2741 "parsing/parser.mly" +# 2821 "parsing/parser.mly" ( Ppat_array [] ) -# 34093 "parsing/parser.ml" +# 34633 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34102 "parsing/parser.ml" +# 34642 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 34108 "parsing/parser.ml" +# 34648 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34143,16 +34683,16 @@ module Tables = struct let _v : (Parsetree.pattern) = let _1 = let _1 = let _2 = -# 2753 "parsing/parser.mly" +# 2833 "parsing/parser.mly" ( ps ) -# 34149 "parsing/parser.ml" +# 34689 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2743 "parsing/parser.mly" +# 2823 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 34156 "parsing/parser.ml" +# 34696 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -34160,15 +34700,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 34166 "parsing/parser.ml" +# 34706 "parsing/parser.ml" in -# 2744 "parsing/parser.mly" +# 2824 "parsing/parser.mly" ( _1 ) -# 34172 "parsing/parser.ml" +# 34712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34208,9 +34748,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2246 "parsing/parser.mly" +# 2341 "parsing/parser.mly" ( reloc_exp ~loc:_sloc _2 ) -# 34214 "parsing/parser.ml" +# 34754 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34249,9 +34789,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2248 "parsing/parser.mly" +# 2343 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 34255 "parsing/parser.ml" +# 34795 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34298,9 +34838,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2250 "parsing/parser.mly" +# 2345 "parsing/parser.mly" ( mkexp_constraint ~loc:_sloc _2 _3 ) -# 34304 "parsing/parser.ml" +# 34844 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34318,9 +34858,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -34328,14 +34868,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34343,75 +34883,33 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2346 "parsing/parser.mly" + ( None ) +# 34898 "parsing/parser.ml" + in + +# 2231 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 34903 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2252 "parsing/parser.mly" - ( array_get ~loc:_sloc _1 _4 ) -# 34360 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 2254 "parsing/parser.mly" - ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 34415 "parsing/parser.ml" +# 2347 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 34913 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34429,9 +34927,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -34439,14 +34937,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34454,75 +34952,33 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2346 "parsing/parser.mly" + ( None ) +# 34967 "parsing/parser.ml" + in + +# 2233 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 34972 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2256 "parsing/parser.mly" - ( string_get ~loc:_sloc _1 _4 ) -# 34471 "parsing/parser.ml" - in - { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = Obj.repr _v; - MenhirLib.EngineTypes.startp = _startpos; - MenhirLib.EngineTypes.endp = _endpos; - MenhirLib.EngineTypes.next = _menhir_stack; - }); - (fun _menhir_env -> - let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in - let { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; - }; - }; - } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in - let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in - -# 2258 "parsing/parser.mly" - ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 34526 "parsing/parser.ml" +# 2347 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 34982 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34540,9 +34996,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = i; + MenhirLib.EngineTypes.startp = _startpos_i_; + MenhirLib.EngineTypes.endp = _endpos_i_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -34550,14 +35006,14 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = d; + MenhirLib.EngineTypes.startp = _startpos_d_; + MenhirLib.EngineTypes.endp = _endpos_d_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34565,29 +35021,33 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let es : (Parsetree.expression list) = Obj.magic es in + let i : (Parsetree.expression) = Obj.magic i in let _3 : unit = Obj.magic _3 in - let _2 : ( -# 632 "parsing/parser.mly" - (string) -# 34574 "parsing/parser.ml" - ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let d : unit = Obj.magic d in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" - ( es ) -# 34583 "parsing/parser.ml" - in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2346 "parsing/parser.mly" + ( None ) +# 35036 "parsing/parser.ml" + in + +# 2235 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 35041 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2260 "parsing/parser.mly" - ( dotop_get ~loc:_sloc lident bracket _2 _1 _4 ) -# 34591 "parsing/parser.ml" +# 2347 "parsing/parser.mly" + ( mk_indexop_expr builtin_indexing_operators ~loc:_sloc _1 ) +# 35051 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34620,9 +35080,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34633,25 +35093,51 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 34639 "parsing/parser.ml" +# 35099 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" + let _v : (Parsetree.expression) = let _1 = + let r = +# 2348 "parsing/parser.mly" + ( None ) +# 35109 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 34648 "parsing/parser.ml" - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in +# 35114 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 35120 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35125 "parsing/parser.ml" + + in + +# 2231 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 35131 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2262 "parsing/parser.mly" - ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 34655 "parsing/parser.ml" +# 2349 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 35141 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34683,11 +35169,23 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -34697,26 +35195,61 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 34703 "parsing/parser.ml" +# 35201 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" + let _v : (Parsetree.expression) = let _1 = + let r = +# 2348 "parsing/parser.mly" + ( None ) +# 35213 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 34712 "parsing/parser.ml" - in - let _endpos = _endpos__5_ in +# 35218 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 35226 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 35231 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35237 "parsing/parser.ml" + + in + +# 2231 "parsing/parser.mly" + ( array, d, Paren, i, r ) +# 35243 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2264 "parsing/parser.mly" - ( dotop_get ~loc:_sloc lident paren _2 _1 _4 ) -# 34720 "parsing/parser.ml" +# 2349 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 35253 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34749,9 +35282,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34762,25 +35295,51 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 34768 "parsing/parser.ml" +# 35301 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" + let _v : (Parsetree.expression) = let _1 = + let r = +# 2348 "parsing/parser.mly" + ( None ) +# 35311 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 34777 "parsing/parser.ml" - in - let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in +# 35316 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 35322 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35327 "parsing/parser.ml" + + in + +# 2233 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 35333 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2266 "parsing/parser.mly" - ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 34784 "parsing/parser.ml" +# 2349 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 35343 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34812,11 +35371,23 @@ module Tables = struct MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; @@ -34826,26 +35397,61 @@ module Tables = struct let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 34832 "parsing/parser.ml" +# 35403 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _4 = -# 2588 "parsing/parser.mly" + let _v : (Parsetree.expression) = let _1 = + let r = +# 2348 "parsing/parser.mly" + ( None ) +# 35415 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 34841 "parsing/parser.ml" - in - let _endpos = _endpos__5_ in +# 35420 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 35428 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 35433 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35439 "parsing/parser.ml" + + in + +# 2233 "parsing/parser.mly" + ( array, d, Brace, i, r ) +# 35445 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2268 "parsing/parser.mly" - ( dotop_get ~loc:_sloc lident brace _2 _1 _4 ) -# 34849 "parsing/parser.ml" +# 2349 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 35455 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34863,9 +35469,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _3; @@ -34878,9 +35484,9 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34888,23 +35494,54 @@ module Tables = struct }; } = _menhir_stack in let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in + let es : (Parsetree.expression list) = Obj.magic es in let _3 : unit = Obj.magic _3 in let _2 : ( -# 632 "parsing/parser.mly" +# 686 "parsing/parser.mly" (string) -# 34897 "parsing/parser.ml" +# 35503 "parsing/parser.ml" ) = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in + let _startpos = _startpos_array_ in let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2348 "parsing/parser.mly" + ( None ) +# 35513 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" + ( es ) +# 35518 "parsing/parser.ml" + in + let d = + let _1 = +# 124 "" + ( None ) +# 35524 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35529 "parsing/parser.ml" + + in + +# 2235 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 35535 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in -# 2270 "parsing/parser.mly" - ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 34908 "parsing/parser.ml" +# 2349 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 35545 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34917,9 +35554,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _5; + MenhirLib.EngineTypes.startp = _startpos__5_; + MenhirLib.EngineTypes.endp = _endpos__5_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = es; @@ -34927,29 +35564,29 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _3; + MenhirLib.EngineTypes.startp = _startpos__3_; + MenhirLib.EngineTypes.endp = _endpos__3_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.semv = array; + MenhirLib.EngineTypes.startp = _startpos_array_; + MenhirLib.EngineTypes.endp = _endpos_array_; MenhirLib.EngineTypes.next = _menhir_stack; }; }; @@ -34958,32 +35595,65 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in - let es : (Parsetree.expression list) = Obj.magic es in let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" + let es : (Parsetree.expression list) = Obj.magic es in + let _3 : unit = Obj.magic _3 in + let _2 : ( +# 686 "parsing/parser.mly" (string) -# 34968 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in - let _1 : (Parsetree.expression) = Obj.magic _1 in +# 35605 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1 : unit = Obj.magic _1 in + let array : (Parsetree.expression) = Obj.magic array in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in - let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _startpos = _startpos_array_ in + let _endpos = _endpos__5_ in + let _v : (Parsetree.expression) = let _1 = + let r = +# 2348 "parsing/parser.mly" + ( None ) +# 35617 "parsing/parser.ml" + in + let i = +# 2665 "parsing/parser.mly" ( es ) -# 34979 "parsing/parser.ml" - in - let _endpos = _endpos__7_ in +# 35622 "parsing/parser.ml" + in + let d = + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 35630 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 35635 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35641 "parsing/parser.ml" + + in + +# 2235 "parsing/parser.mly" + ( array, d, Bracket, i, r ) +# 35647 "parsing/parser.ml" + + in + let (_endpos__1_, _startpos__1_) = (_endpos__5_, _startpos_array_) in + let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2272 "parsing/parser.mly" - ( dotop_get ~loc:_sloc (ldot _3) bracket _4 _1 _6 ) -# 34987 "parsing/parser.ml" +# 2349 "parsing/parser.mly" + ( mk_indexop_expr user_indexing_operators ~loc:_sloc _1 ) +# 35657 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -34996,72 +35666,118 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = es; - MenhirLib.EngineTypes.startp = _startpos_es_; - MenhirLib.EngineTypes.endp = _endpos_es_; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in - let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" - (string) -# 35047 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" - ( es ) -# 35058 "parsing/parser.ml" + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2240 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 35713 "parsing/parser.ml" + + in + +# 2350 "parsing/parser.mly" + ( _1 ) +# 35719 "parsing/parser.ml" in - let _loc__7_ = (_startpos__7_, _endpos__7_) in - let _loc__5_ = (_startpos__5_, _endpos__5_) in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2242 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 35775 "parsing/parser.ml" + + in -# 2275 "parsing/parser.mly" - ( unclosed "[" _loc__5_ "]" _loc__7_ ) -# 35065 "parsing/parser.ml" +# 2350 "parsing/parser.mly" + ( _1 ) +# 35781 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35074,9 +35790,71 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let _e : unit = Obj.magic _e in + let _4 : (Parsetree.expression) = Obj.magic _4 in + let _p : unit = Obj.magic _p in + let _2 : unit = Obj.magic _2 in + let _1 : (Parsetree.expression) = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2244 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 35837 "parsing/parser.ml" + + in + +# 2350 "parsing/parser.mly" + ( _1 ) +# 35843 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = es; @@ -35084,63 +35862,67 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in + let _e : unit = Obj.magic _e in let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" + let _p : unit = Obj.magic _p in + let _2 : ( +# 686 "parsing/parser.mly" (string) -# 35125 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in +# 35891 "parsing/parser.ml" + ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 2665 "parsing/parser.mly" ( es ) -# 35136 "parsing/parser.ml" - in - let _endpos = _endpos__7_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +# 35901 "parsing/parser.ml" + in + let _2 = + let _1 = +# 124 "" + ( None ) +# 35907 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 35912 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2240 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 35920 "parsing/parser.ml" + + in -# 2277 "parsing/parser.mly" - ( dotop_get ~loc:_sloc (ldot _3) paren _4 _1 _6 ) -# 35144 "parsing/parser.ml" +# 2351 "parsing/parser.mly" + ( _1 ) +# 35926 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35153,9 +35935,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = es; @@ -35163,24 +35945,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -35194,31 +35976,59 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in + let _e : unit = Obj.magic _e in let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" + let _p : unit = Obj.magic _p in + let _2 : ( +# 686 "parsing/parser.mly" (string) -# 35204 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in +# 35986 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 2665 "parsing/parser.mly" ( es ) -# 35215 "parsing/parser.ml" - in - let _loc__7_ = (_startpos__7_, _endpos__7_) in - let _loc__5_ = (_startpos__5_, _endpos__5_) in +# 35998 "parsing/parser.ml" + in + let _2 = + let _1 = _1_inlined1 in + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 36007 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 36012 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 36018 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2240 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Paren _loc__e_ ) +# 36026 "parsing/parser.ml" + + in -# 2280 "parsing/parser.mly" - ( unclosed "(" _loc__5_ ")" _loc__7_ ) -# 35222 "parsing/parser.ml" +# 2351 "parsing/parser.mly" + ( _1 ) +# 36032 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35231,9 +36041,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = es; @@ -35241,63 +36051,67 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; - MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; - }; - }; + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; }; }; }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in + let _e : unit = Obj.magic _e in let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" + let _p : unit = Obj.magic _p in + let _2 : ( +# 686 "parsing/parser.mly" (string) -# 35282 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in +# 36080 "parsing/parser.ml" + ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 2665 "parsing/parser.mly" ( es ) -# 35293 "parsing/parser.ml" - in - let _endpos = _endpos__7_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in +# 36090 "parsing/parser.ml" + in + let _2 = + let _1 = +# 124 "" + ( None ) +# 36096 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 36101 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2242 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 36109 "parsing/parser.ml" + + in -# 2282 "parsing/parser.mly" - ( dotop_get ~loc:_sloc (ldot _3) brace _4 _1 _6 ) -# 35301 "parsing/parser.ml" +# 2351 "parsing/parser.mly" + ( _1 ) +# 36115 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35310,9 +36124,9 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _7; - MenhirLib.EngineTypes.startp = _startpos__7_; - MenhirLib.EngineTypes.endp = _endpos__7_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = es; @@ -35320,24 +36134,24 @@ module Tables = struct MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _2; - MenhirLib.EngineTypes.startp = _startpos__2_; - MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _menhir_s; MenhirLib.EngineTypes.semv = _1; @@ -35351,31 +36165,59 @@ module Tables = struct }; }; } = _menhir_stack in - let _7 : unit = Obj.magic _7 in + let _e : unit = Obj.magic _e in let es : (Parsetree.expression list) = Obj.magic es in - let _5 : unit = Obj.magic _5 in - let _4 : ( -# 632 "parsing/parser.mly" + let _p : unit = Obj.magic _p in + let _2 : ( +# 686 "parsing/parser.mly" (string) -# 35361 "parsing/parser.ml" - ) = Obj.magic _4 in - let _3 : (Longident.t) = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in +# 36175 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__7_ in - let _v : (Parsetree.expression) = let _6 = -# 2588 "parsing/parser.mly" + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 2665 "parsing/parser.mly" ( es ) -# 35372 "parsing/parser.ml" - in - let _loc__7_ = (_startpos__7_, _endpos__7_) in - let _loc__5_ = (_startpos__5_, _endpos__5_) in +# 36187 "parsing/parser.ml" + in + let _2 = + let _1 = _1_inlined1 in + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 36196 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 36201 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 36207 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2242 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Brace _loc__e_ ) +# 36215 "parsing/parser.ml" + + in -# 2285 "parsing/parser.mly" - ( unclosed "{" _loc__5_ "}" _loc__7_ ) -# 35379 "parsing/parser.ml" +# 2351 "parsing/parser.mly" + ( _1 ) +# 36221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35388,19 +36230,19 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; @@ -35417,21 +36259,48 @@ module Tables = struct }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 686 "parsing/parser.mly" + (string) +# 36269 "parsing/parser.ml" + ) = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _endpos = _endpos__5_ in - let _symbolstartpos = _startpos__1_ in - let _sloc = (_symbolstartpos, _endpos) in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 2665 "parsing/parser.mly" + ( es ) +# 36279 "parsing/parser.ml" + in + let _2 = + let _1 = +# 124 "" + ( None ) +# 36285 "parsing/parser.ml" + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 36290 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2244 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 36298 "parsing/parser.ml" + + in -# 2287 "parsing/parser.mly" - ( bigarray_get ~loc:_sloc _1 _4 ) -# 35435 "parsing/parser.ml" +# 2351 "parsing/parser.mly" + ( _1 ) +# 36304 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35444,49 +36313,100 @@ module Tables = struct let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in let { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _5; - MenhirLib.EngineTypes.startp = _startpos__5_; - MenhirLib.EngineTypes.endp = _endpos__5_; + MenhirLib.EngineTypes.semv = _e; + MenhirLib.EngineTypes.startp = _startpos__e_; + MenhirLib.EngineTypes.endp = _endpos__e_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _4; - MenhirLib.EngineTypes.startp = _startpos__4_; - MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.semv = es; + MenhirLib.EngineTypes.startp = _startpos_es_; + MenhirLib.EngineTypes.endp = _endpos_es_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; - MenhirLib.EngineTypes.semv = _3; - MenhirLib.EngineTypes.startp = _startpos__3_; - MenhirLib.EngineTypes.endp = _endpos__3_; + MenhirLib.EngineTypes.semv = _p; + MenhirLib.EngineTypes.startp = _startpos__p_; + MenhirLib.EngineTypes.endp = _endpos__p_; MenhirLib.EngineTypes.next = { MenhirLib.EngineTypes.state = _; MenhirLib.EngineTypes.semv = _2; MenhirLib.EngineTypes.startp = _startpos__2_; MenhirLib.EngineTypes.endp = _endpos__2_; MenhirLib.EngineTypes.next = { - MenhirLib.EngineTypes.state = _menhir_s; - MenhirLib.EngineTypes.semv = _1; - MenhirLib.EngineTypes.startp = _startpos__1_; - MenhirLib.EngineTypes.endp = _endpos__1_; - MenhirLib.EngineTypes.next = _menhir_stack; + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2_inlined1; + MenhirLib.EngineTypes.startp = _startpos__2_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__2_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; }; }; }; }; } = _menhir_stack in - let _5 : unit = Obj.magic _5 in - let _4 : (Parsetree.expression) = Obj.magic _4 in - let _3 : unit = Obj.magic _3 in - let _2 : unit = Obj.magic _2 in + let _e : unit = Obj.magic _e in + let es : (Parsetree.expression list) = Obj.magic es in + let _p : unit = Obj.magic _p in + let _2 : ( +# 686 "parsing/parser.mly" + (string) +# 36364 "parsing/parser.ml" + ) = Obj.magic _2 in + let _2_inlined1 : (Longident.t) = Obj.magic _2_inlined1 in + let _1_inlined1 : unit = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in - let _endpos = _endpos__5_ in - let _v : (Parsetree.expression) = let _loc__5_ = (_startpos__5_, _endpos__5_) in - let _loc__3_ = (_startpos__3_, _endpos__3_) in + let _endpos = _endpos__e_ in + let _v : (Parsetree.expression) = let _1 = + let _4 = +# 2665 "parsing/parser.mly" + ( es ) +# 36376 "parsing/parser.ml" + in + let _2 = + let _1 = _1_inlined1 in + let _1 = + let _2 = _2_inlined1 in + let x = +# 2247 "parsing/parser.mly" + (_2) +# 36385 "parsing/parser.ml" + in + +# 126 "" + ( Some x ) +# 36390 "parsing/parser.ml" + + in + +# 2247 "parsing/parser.mly" + ( _1, _2 ) +# 36396 "parsing/parser.ml" + + in + let _loc__p_ = (_startpos__p_, _endpos__p_) in + let _loc__e_ = (_startpos__e_, _endpos__e_) in + +# 2244 "parsing/parser.mly" + ( indexop_unclosed_error _loc__p_ Bracket _loc__e_ ) +# 36404 "parsing/parser.ml" + + in -# 2289 "parsing/parser.mly" - ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 35490 "parsing/parser.ml" +# 2351 "parsing/parser.mly" + ( _1 ) +# 36410 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35540,15 +36460,15 @@ module Tables = struct let attrs = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 35546 "parsing/parser.ml" +# 36466 "parsing/parser.ml" in -# 2298 "parsing/parser.mly" +# 2360 "parsing/parser.mly" ( e.pexp_desc, (ext, attrs @ e.pexp_attributes) ) -# 35552 "parsing/parser.ml" +# 36472 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -35556,10 +36476,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 35563 "parsing/parser.ml" +# 36483 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35608,24 +36528,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 35614 "parsing/parser.ml" +# 36534 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 35620 "parsing/parser.ml" +# 36540 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2300 "parsing/parser.mly" +# 2362 "parsing/parser.mly" ( Pexp_construct (mkloc (Lident "()") (make_loc _sloc), None), _2 ) -# 35629 "parsing/parser.ml" +# 36549 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -35633,10 +36553,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 35640 "parsing/parser.ml" +# 36560 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35692,23 +36612,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 35698 "parsing/parser.ml" +# 36618 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 35704 "parsing/parser.ml" +# 36624 "parsing/parser.ml" in let _loc__4_ = (_startpos__4_, _endpos__4_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2302 "parsing/parser.mly" +# 2364 "parsing/parser.mly" ( unclosed "begin" _loc__1_ "end" _loc__4_ ) -# 35712 "parsing/parser.ml" +# 36632 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -35716,10 +36636,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 35723 "parsing/parser.ml" +# 36643 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35769,9 +36689,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 35775 "parsing/parser.ml" +# 36695 "parsing/parser.ml" in let _2 = @@ -35779,21 +36699,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 35785 "parsing/parser.ml" +# 36705 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 35791 "parsing/parser.ml" +# 36711 "parsing/parser.ml" in -# 2304 "parsing/parser.mly" +# 2366 "parsing/parser.mly" ( Pexp_new(_3), _2 ) -# 35797 "parsing/parser.ml" +# 36717 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -35801,10 +36721,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 35808 "parsing/parser.ml" +# 36728 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35867,21 +36787,21 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 35873 "parsing/parser.ml" +# 36793 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 35879 "parsing/parser.ml" +# 36799 "parsing/parser.ml" in -# 2306 "parsing/parser.mly" +# 2368 "parsing/parser.mly" ( Pexp_pack _4, _3 ) -# 35885 "parsing/parser.ml" +# 36805 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -35889,10 +36809,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 35896 "parsing/parser.ml" +# 36816 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -35970,11 +36890,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 35978 "parsing/parser.ml" +# 36898 "parsing/parser.ml" in let _3 = @@ -35982,24 +36902,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 35988 "parsing/parser.ml" +# 36908 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 35994 "parsing/parser.ml" +# 36914 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2308 "parsing/parser.mly" +# 2370 "parsing/parser.mly" ( Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _4), _6), _3 ) -# 36003 "parsing/parser.ml" +# 36923 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -36007,10 +36927,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36014 "parsing/parser.ml" +# 36934 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36080,23 +37000,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 36086 "parsing/parser.ml" +# 37006 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 36092 "parsing/parser.ml" +# 37012 "parsing/parser.ml" in let _loc__6_ = (_startpos__6_, _endpos__6_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2310 "parsing/parser.mly" +# 2372 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__6_ ) -# 36100 "parsing/parser.ml" +# 37020 "parsing/parser.ml" in let _endpos__1_ = _endpos__6_ in @@ -36104,10 +37024,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2291 "parsing/parser.mly" +# 2353 "parsing/parser.mly" ( let desc, attrs = _1 in mkexp_attrs ~loc:_sloc desc attrs ) -# 36111 "parsing/parser.ml" +# 37031 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36136,30 +37056,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36142 "parsing/parser.ml" +# 37062 "parsing/parser.ml" in -# 2314 "parsing/parser.mly" +# 2376 "parsing/parser.mly" ( Pexp_ident (_1) ) -# 36148 "parsing/parser.ml" +# 37068 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36157 "parsing/parser.ml" +# 37077 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36163 "parsing/parser.ml" +# 37083 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36183,23 +37103,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2316 "parsing/parser.mly" +# 2378 "parsing/parser.mly" ( Pexp_constant _1 ) -# 36189 "parsing/parser.ml" +# 37109 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36197 "parsing/parser.ml" +# 37117 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36203 "parsing/parser.ml" +# 37123 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36228,30 +37148,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36234 "parsing/parser.ml" +# 37154 "parsing/parser.ml" in -# 2318 "parsing/parser.mly" +# 2380 "parsing/parser.mly" ( Pexp_construct(_1, None) ) -# 36240 "parsing/parser.ml" +# 37160 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36249 "parsing/parser.ml" +# 37169 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36255 "parsing/parser.ml" +# 37175 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36275,23 +37195,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2320 "parsing/parser.mly" +# 2382 "parsing/parser.mly" ( Pexp_variant(_1, None) ) -# 36281 "parsing/parser.ml" +# 37201 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36289 "parsing/parser.ml" +# 37209 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36295 "parsing/parser.ml" +# 37215 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36317,9 +37237,9 @@ module Tables = struct } = _menhir_stack in let _2 : (Parsetree.expression) = Obj.magic _2 in let _1 : ( -# 675 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 36323 "parsing/parser.ml" +# 37243 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in @@ -36331,15 +37251,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 36337 "parsing/parser.ml" +# 37257 "parsing/parser.ml" in -# 2322 "parsing/parser.mly" +# 2384 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 36343 "parsing/parser.ml" +# 37263 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -36347,15 +37267,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36353 "parsing/parser.ml" +# 37273 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36359 "parsing/parser.ml" +# 37279 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36388,23 +37308,23 @@ module Tables = struct let _1 = let _1 = let _1 = -# 2323 "parsing/parser.mly" +# 2385 "parsing/parser.mly" ("!") -# 36394 "parsing/parser.ml" +# 37314 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 36402 "parsing/parser.ml" +# 37322 "parsing/parser.ml" in -# 2324 "parsing/parser.mly" +# 2386 "parsing/parser.mly" ( Pexp_apply(_1, [Nolabel,_2]) ) -# 36408 "parsing/parser.ml" +# 37328 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in @@ -36412,15 +37332,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36418 "parsing/parser.ml" +# 37338 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36424 "parsing/parser.ml" +# 37344 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36459,14 +37379,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2571 "parsing/parser.mly" +# 2648 "parsing/parser.mly" ( xs ) -# 36465 "parsing/parser.ml" +# 37385 "parsing/parser.ml" in -# 2326 "parsing/parser.mly" +# 2388 "parsing/parser.mly" ( Pexp_override _2 ) -# 36470 "parsing/parser.ml" +# 37390 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -36474,15 +37394,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36480 "parsing/parser.ml" +# 37400 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36486 "parsing/parser.ml" +# 37406 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36521,16 +37441,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2571 "parsing/parser.mly" +# 2648 "parsing/parser.mly" ( xs ) -# 36527 "parsing/parser.ml" +# 37447 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2328 "parsing/parser.mly" +# 2390 "parsing/parser.mly" ( unclosed "{<" _loc__1_ ">}" _loc__3_ ) -# 36534 "parsing/parser.ml" +# 37454 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -36538,15 +37458,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36544 "parsing/parser.ml" +# 37464 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36550 "parsing/parser.ml" +# 37470 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36577,24 +37497,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2330 "parsing/parser.mly" +# 2392 "parsing/parser.mly" ( Pexp_override [] ) -# 36583 "parsing/parser.ml" +# 37503 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36592 "parsing/parser.ml" +# 37512 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36598 "parsing/parser.ml" +# 37518 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36638,15 +37558,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36644 "parsing/parser.ml" +# 37564 "parsing/parser.ml" in -# 2332 "parsing/parser.mly" +# 2394 "parsing/parser.mly" ( Pexp_field(_1, _3) ) -# 36650 "parsing/parser.ml" +# 37570 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -36654,15 +37574,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36660 "parsing/parser.ml" +# 37580 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36666 "parsing/parser.ml" +# 37586 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36720,24 +37640,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36726 "parsing/parser.ml" +# 37646 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 36735 "parsing/parser.ml" +# 37655 "parsing/parser.ml" in -# 2334 "parsing/parser.mly" +# 2396 "parsing/parser.mly" ( Pexp_open(od, _4) ) -# 36741 "parsing/parser.ml" +# 37661 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -36745,15 +37665,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36751 "parsing/parser.ml" +# 37671 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36757 "parsing/parser.ml" +# 37677 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36806,9 +37726,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2571 "parsing/parser.mly" +# 2648 "parsing/parser.mly" ( xs ) -# 36812 "parsing/parser.ml" +# 37732 "parsing/parser.ml" in let od = let _1 = @@ -36816,18 +37736,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36822 "parsing/parser.ml" +# 37742 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 36831 "parsing/parser.ml" +# 37751 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -36835,10 +37755,10 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2336 "parsing/parser.mly" +# 2398 "parsing/parser.mly" ( (* TODO: review the location of Pexp_override *) Pexp_open(od, mkexp ~loc:_sloc (Pexp_override _4)) ) -# 36842 "parsing/parser.ml" +# 37762 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -36846,15 +37766,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36852 "parsing/parser.ml" +# 37772 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36858 "parsing/parser.ml" +# 37778 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36907,16 +37827,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2571 "parsing/parser.mly" +# 2648 "parsing/parser.mly" ( xs ) -# 36913 "parsing/parser.ml" +# 37833 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2339 "parsing/parser.mly" +# 2401 "parsing/parser.mly" ( unclosed "{<" _loc__3_ ">}" _loc__5_ ) -# 36920 "parsing/parser.ml" +# 37840 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -36924,15 +37844,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 36930 "parsing/parser.ml" +# 37850 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 36936 "parsing/parser.ml" +# 37856 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -36963,9 +37883,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 36969 "parsing/parser.ml" +# 37889 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _2 : unit = Obj.magic _2 in let _1 : (Parsetree.expression) = Obj.magic _1 in @@ -36977,23 +37897,23 @@ module Tables = struct let _3 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 36983 "parsing/parser.ml" +# 37903 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 36991 "parsing/parser.ml" +# 37911 "parsing/parser.ml" in -# 2341 "parsing/parser.mly" +# 2403 "parsing/parser.mly" ( Pexp_send(_1, _3) ) -# 36997 "parsing/parser.ml" +# 37917 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -37001,15 +37921,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37007 "parsing/parser.ml" +# 37927 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37013 "parsing/parser.ml" +# 37933 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37041,9 +37961,9 @@ module Tables = struct } = _menhir_stack in let _3 : (Parsetree.expression) = Obj.magic _3 in let _1_inlined1 : ( -# 686 "parsing/parser.mly" +# 740 "parsing/parser.mly" (string) -# 37047 "parsing/parser.ml" +# 37967 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _1 : (Parsetree.expression) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in @@ -37057,15 +37977,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 844 "parsing/parser.mly" +# 910 "parsing/parser.mly" ( mkoperator ~loc:_sloc _1 ) -# 37063 "parsing/parser.ml" +# 37983 "parsing/parser.ml" in -# 2343 "parsing/parser.mly" +# 2405 "parsing/parser.mly" ( mkinfix _1 _2 _3 ) -# 37069 "parsing/parser.ml" +# 37989 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37073,15 +37993,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37079 "parsing/parser.ml" +# 37999 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37085 "parsing/parser.ml" +# 38005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37105,23 +38025,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2345 "parsing/parser.mly" +# 2407 "parsing/parser.mly" ( Pexp_extension _1 ) -# 37111 "parsing/parser.ml" +# 38031 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37119 "parsing/parser.ml" +# 38039 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37125 "parsing/parser.ml" +# 38045 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37169,18 +38089,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in let _1 = -# 2346 "parsing/parser.mly" +# 2408 "parsing/parser.mly" (Lident "()") -# 37175 "parsing/parser.ml" +# 38095 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37184 "parsing/parser.ml" +# 38104 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -37190,25 +38110,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37196 "parsing/parser.ml" +# 38116 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37205 "parsing/parser.ml" +# 38125 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2347 "parsing/parser.mly" +# 2409 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_loc__3_) (Pexp_construct(_3, None))) ) -# 37212 "parsing/parser.ml" +# 38132 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -37216,15 +38136,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37222 "parsing/parser.ml" +# 38142 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37228 "parsing/parser.ml" +# 38148 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37279,9 +38199,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2349 "parsing/parser.mly" +# 2411 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 37285 "parsing/parser.ml" +# 38205 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37289,15 +38209,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37295 "parsing/parser.ml" +# 38215 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37301 "parsing/parser.ml" +# 38221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37336,25 +38256,25 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2351 "parsing/parser.mly" +# 2413 "parsing/parser.mly" ( let (exten, fields) = _2 in Pexp_record(fields, exten) ) -# 37343 "parsing/parser.ml" +# 38263 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37352 "parsing/parser.ml" +# 38272 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37358 "parsing/parser.ml" +# 38278 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37396,9 +38316,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2354 "parsing/parser.mly" +# 2416 "parsing/parser.mly" ( unclosed "{" _loc__1_ "}" _loc__3_ ) -# 37402 "parsing/parser.ml" +# 38322 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37406,15 +38326,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37412 "parsing/parser.ml" +# 38332 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37418 "parsing/parser.ml" +# 38338 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37473,27 +38393,27 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37479 "parsing/parser.ml" +# 38399 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37488 "parsing/parser.ml" +# 38408 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2356 "parsing/parser.mly" +# 2418 "parsing/parser.mly" ( let (exten, fields) = _4 in Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_record(fields, exten))) ) -# 37497 "parsing/parser.ml" +# 38417 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37501,15 +38421,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37507 "parsing/parser.ml" +# 38427 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37513 "parsing/parser.ml" +# 38433 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37565,9 +38485,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2360 "parsing/parser.mly" +# 2422 "parsing/parser.mly" ( unclosed "{" _loc__3_ "}" _loc__5_ ) -# 37571 "parsing/parser.ml" +# 38491 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37575,15 +38495,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37581 "parsing/parser.ml" +# 38501 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37587 "parsing/parser.ml" +# 38507 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37622,14 +38542,14 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 37628 "parsing/parser.ml" +# 38548 "parsing/parser.ml" in -# 2362 "parsing/parser.mly" +# 2424 "parsing/parser.mly" ( Pexp_array(_2) ) -# 37633 "parsing/parser.ml" +# 38553 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37637,15 +38557,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37643 "parsing/parser.ml" +# 38563 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37649 "parsing/parser.ml" +# 38569 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37684,16 +38604,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 37690 "parsing/parser.ml" +# 38610 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2364 "parsing/parser.mly" +# 2426 "parsing/parser.mly" ( unclosed "[|" _loc__1_ "|]" _loc__3_ ) -# 37697 "parsing/parser.ml" +# 38617 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -37701,15 +38621,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37707 "parsing/parser.ml" +# 38627 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37713 "parsing/parser.ml" +# 38633 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37740,24 +38660,24 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = let _1 = let _1 = -# 2366 "parsing/parser.mly" +# 2428 "parsing/parser.mly" ( Pexp_array [] ) -# 37746 "parsing/parser.ml" +# 38666 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37755 "parsing/parser.ml" +# 38675 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37761 "parsing/parser.ml" +# 38681 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37810,9 +38730,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 37816 "parsing/parser.ml" +# 38736 "parsing/parser.ml" in let od = let _1 = @@ -37820,25 +38740,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37826 "parsing/parser.ml" +# 38746 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37835 "parsing/parser.ml" +# 38755 "parsing/parser.ml" in let _endpos = _endpos__5_ in -# 2368 "parsing/parser.mly" +# 2430 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array(_4))) ) -# 37842 "parsing/parser.ml" +# 38762 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -37846,15 +38766,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37852 "parsing/parser.ml" +# 38772 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37858 "parsing/parser.ml" +# 38778 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37905,26 +38825,26 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 37911 "parsing/parser.ml" +# 38831 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 37920 "parsing/parser.ml" +# 38840 "parsing/parser.ml" in let _endpos = _endpos__4_ in -# 2370 "parsing/parser.mly" +# 2432 "parsing/parser.mly" ( (* TODO: review the location of Pexp_array *) Pexp_open(od, mkexp ~loc:(_startpos__3_, _endpos) (Pexp_array [])) ) -# 37928 "parsing/parser.ml" +# 38848 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -37932,15 +38852,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 37938 "parsing/parser.ml" +# 38858 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 37944 "parsing/parser.ml" +# 38864 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -37993,16 +38913,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 37999 "parsing/parser.ml" +# 38919 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2374 "parsing/parser.mly" +# 2436 "parsing/parser.mly" ( unclosed "[|" _loc__3_ "|]" _loc__5_ ) -# 38006 "parsing/parser.ml" +# 38926 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38010,15 +38930,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38016 "parsing/parser.ml" +# 38936 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38022 "parsing/parser.ml" +# 38942 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38057,15 +38977,15 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 38063 "parsing/parser.ml" +# 38983 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2376 "parsing/parser.mly" +# 2438 "parsing/parser.mly" ( fst (mktailexp _loc__3_ _2) ) -# 38069 "parsing/parser.ml" +# 38989 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38073,15 +38993,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38079 "parsing/parser.ml" +# 38999 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38085 "parsing/parser.ml" +# 39005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38120,16 +39040,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _2 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 38126 "parsing/parser.ml" +# 39046 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2378 "parsing/parser.mly" +# 2440 "parsing/parser.mly" ( unclosed "[" _loc__1_ "]" _loc__3_ ) -# 38133 "parsing/parser.ml" +# 39053 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -38137,15 +39057,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38143 "parsing/parser.ml" +# 39063 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38149 "parsing/parser.ml" +# 39069 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38198,9 +39118,9 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 38204 "parsing/parser.ml" +# 39124 "parsing/parser.ml" in let od = let _1 = @@ -38208,30 +39128,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38214 "parsing/parser.ml" +# 39134 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 38223 "parsing/parser.ml" +# 39143 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _loc__5_ = (_startpos__5_, _endpos__5_) in -# 2380 "parsing/parser.mly" +# 2442 "parsing/parser.mly" ( let list_exp = (* TODO: review the location of list_exp *) let tail_exp, _tail_loc = mktailexp _loc__5_ _4 in mkexp ~loc:(_startpos__3_, _endpos) tail_exp in Pexp_open(od, list_exp) ) -# 38235 "parsing/parser.ml" +# 39155 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38239,15 +39159,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38245 "parsing/parser.ml" +# 39165 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38251 "parsing/parser.ml" +# 39171 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38295,18 +39215,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in let _1 = -# 2385 "parsing/parser.mly" +# 2447 "parsing/parser.mly" (Lident "[]") -# 38301 "parsing/parser.ml" +# 39221 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38310 "parsing/parser.ml" +# 39230 "parsing/parser.ml" in let (_endpos__3_, _startpos__3_) = (_endpos__2_inlined1_, _startpos__1_inlined1_) in @@ -38316,25 +39236,25 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38322 "parsing/parser.ml" +# 39242 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 38331 "parsing/parser.ml" +# 39251 "parsing/parser.ml" in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2386 "parsing/parser.mly" +# 2448 "parsing/parser.mly" ( Pexp_open(od, mkexp ~loc:_loc__3_ (Pexp_construct(_3, None))) ) -# 38338 "parsing/parser.ml" +# 39258 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -38342,15 +39262,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38348 "parsing/parser.ml" +# 39268 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38354 "parsing/parser.ml" +# 39274 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38403,16 +39323,16 @@ module Tables = struct let _v : (Parsetree.expression) = let _1 = let _1 = let _4 = -# 2588 "parsing/parser.mly" +# 2665 "parsing/parser.mly" ( es ) -# 38409 "parsing/parser.ml" +# 39329 "parsing/parser.ml" in let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2389 "parsing/parser.mly" +# 2451 "parsing/parser.mly" ( unclosed "[" _loc__3_ "]" _loc__5_ ) -# 38416 "parsing/parser.ml" +# 39336 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -38420,15 +39340,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38426 "parsing/parser.ml" +# 39346 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38432 "parsing/parser.ml" +# 39352 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38521,11 +39441,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 38529 "parsing/parser.ml" +# 39449 "parsing/parser.ml" in let _5 = @@ -38533,15 +39453,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 38539 "parsing/parser.ml" +# 39459 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 38545 "parsing/parser.ml" +# 39465 "parsing/parser.ml" in let od = @@ -38550,18 +39470,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38556 "parsing/parser.ml" +# 39476 "parsing/parser.ml" in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 1498 "parsing/parser.mly" +# 1569 "parsing/parser.mly" ( let loc = make_loc _loc__1_ in let me = Mod.ident ~loc _1 in Opn.mk ~loc me ) -# 38565 "parsing/parser.ml" +# 39485 "parsing/parser.ml" in let _startpos_od_ = _startpos__1_ in @@ -38569,12 +39489,12 @@ module Tables = struct let _symbolstartpos = _startpos_od_ in let _sloc = (_symbolstartpos, _endpos) in -# 2392 "parsing/parser.mly" +# 2454 "parsing/parser.mly" ( let modexp = mkexp_attrs ~loc:(_startpos__3_, _endpos) (Pexp_constraint (ghexp ~loc:_sloc (Pexp_pack _6), _8)) _5 in Pexp_open(od, modexp) ) -# 38578 "parsing/parser.ml" +# 39498 "parsing/parser.ml" in let _endpos__1_ = _endpos__9_ in @@ -38582,15 +39502,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38588 "parsing/parser.ml" +# 39508 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38594 "parsing/parser.ml" +# 39514 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38675,23 +39595,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 38681 "parsing/parser.ml" +# 39601 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 38687 "parsing/parser.ml" +# 39607 "parsing/parser.ml" in let _loc__8_ = (_startpos__8_, _endpos__8_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2398 "parsing/parser.mly" +# 2460 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__8_ ) -# 38695 "parsing/parser.ml" +# 39615 "parsing/parser.ml" in let _endpos__1_ = _endpos__8_ in @@ -38699,15 +39619,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 850 "parsing/parser.mly" +# 916 "parsing/parser.mly" ( mkexp ~loc:_sloc _1 ) -# 38705 "parsing/parser.ml" +# 39625 "parsing/parser.ml" in -# 2294 "parsing/parser.mly" +# 2356 "parsing/parser.mly" ( _1 ) -# 38711 "parsing/parser.ml" +# 39631 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38736,30 +39656,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38742 "parsing/parser.ml" +# 39662 "parsing/parser.ml" in -# 2668 "parsing/parser.mly" +# 2748 "parsing/parser.mly" ( Ppat_var (_1) ) -# 38748 "parsing/parser.ml" +# 39668 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 38757 "parsing/parser.ml" +# 39677 "parsing/parser.ml" in -# 2669 "parsing/parser.mly" +# 2749 "parsing/parser.mly" ( _1 ) -# 38763 "parsing/parser.ml" +# 39683 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38782,9 +39702,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2670 "parsing/parser.mly" +# 2750 "parsing/parser.mly" ( _1 ) -# 38788 "parsing/parser.ml" +# 39708 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38824,9 +39744,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2675 "parsing/parser.mly" +# 2755 "parsing/parser.mly" ( reloc_pat ~loc:_sloc _2 ) -# 38830 "parsing/parser.ml" +# 39750 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38849,9 +39769,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = -# 2677 "parsing/parser.mly" +# 2757 "parsing/parser.mly" ( _1 ) -# 38855 "parsing/parser.ml" +# 39775 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -38914,9 +39834,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 38920 "parsing/parser.ml" +# 39840 "parsing/parser.ml" in let _3 = @@ -38924,24 +39844,24 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 38930 "parsing/parser.ml" +# 39850 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 38936 "parsing/parser.ml" +# 39856 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2679 "parsing/parser.mly" +# 2759 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_unpack _4) _3 ) -# 38945 "parsing/parser.ml" +# 39865 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39018,11 +39938,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 39026 "parsing/parser.ml" +# 39946 "parsing/parser.ml" in let _4 = @@ -39031,9 +39951,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39037 "parsing/parser.ml" +# 39957 "parsing/parser.ml" in let (_endpos__4_, _startpos__4_) = (_endpos__1_inlined3_, _startpos__1_inlined3_) in @@ -39042,15 +39962,15 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 39048 "parsing/parser.ml" +# 39968 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 39054 "parsing/parser.ml" +# 39974 "parsing/parser.ml" in let _endpos = _endpos__7_ in @@ -39058,11 +39978,11 @@ module Tables = struct let _loc__4_ = (_startpos__4_, _endpos__4_) in let _sloc = (_symbolstartpos, _endpos) in -# 2681 "parsing/parser.mly" +# 2761 "parsing/parser.mly" ( mkpat_attrs ~loc:_sloc (Ppat_constraint(mkpat ~loc:_loc__4_ (Ppat_unpack _4), _6)) _3 ) -# 39066 "parsing/parser.ml" +# 39986 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39086,23 +40006,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2689 "parsing/parser.mly" +# 2769 "parsing/parser.mly" ( Ppat_any ) -# 39092 "parsing/parser.ml" +# 40012 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39100 "parsing/parser.ml" +# 40020 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39106 "parsing/parser.ml" +# 40026 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39126,23 +40046,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2691 "parsing/parser.mly" +# 2771 "parsing/parser.mly" ( Ppat_constant _1 ) -# 39132 "parsing/parser.ml" +# 40052 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39140 "parsing/parser.ml" +# 40060 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39146 "parsing/parser.ml" +# 40066 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39180,24 +40100,24 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2693 "parsing/parser.mly" +# 2773 "parsing/parser.mly" ( Ppat_interval (_1, _3) ) -# 39186 "parsing/parser.ml" +# 40106 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39195 "parsing/parser.ml" +# 40115 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39201 "parsing/parser.ml" +# 40121 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39226,30 +40146,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39232 "parsing/parser.ml" +# 40152 "parsing/parser.ml" in -# 2695 "parsing/parser.mly" +# 2775 "parsing/parser.mly" ( Ppat_construct(_1, None) ) -# 39238 "parsing/parser.ml" +# 40158 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39247 "parsing/parser.ml" +# 40167 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39253 "parsing/parser.ml" +# 40173 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39273,23 +40193,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2697 "parsing/parser.mly" +# 2777 "parsing/parser.mly" ( Ppat_variant(_1, None) ) -# 39279 "parsing/parser.ml" +# 40199 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39287 "parsing/parser.ml" +# 40207 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39293 "parsing/parser.ml" +# 40213 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39326,15 +40246,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39332 "parsing/parser.ml" +# 40252 "parsing/parser.ml" in -# 2699 "parsing/parser.mly" +# 2779 "parsing/parser.mly" ( Ppat_type (_2) ) -# 39338 "parsing/parser.ml" +# 40258 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -39342,15 +40262,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39348 "parsing/parser.ml" +# 40268 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39354 "parsing/parser.ml" +# 40274 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39393,15 +40313,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39399 "parsing/parser.ml" +# 40319 "parsing/parser.ml" in -# 2701 "parsing/parser.mly" +# 2781 "parsing/parser.mly" ( Ppat_open(_1, _3) ) -# 39405 "parsing/parser.ml" +# 40325 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -39409,15 +40329,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39415 "parsing/parser.ml" +# 40335 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39421 "parsing/parser.ml" +# 40341 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39465,18 +40385,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in let _1 = -# 2702 "parsing/parser.mly" +# 2782 "parsing/parser.mly" (Lident "[]") -# 39471 "parsing/parser.ml" +# 40391 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39480 "parsing/parser.ml" +# 40400 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -39485,18 +40405,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39491 "parsing/parser.ml" +# 40411 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2703 "parsing/parser.mly" +# 2783 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 39500 "parsing/parser.ml" +# 40420 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -39504,15 +40424,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39510 "parsing/parser.ml" +# 40430 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39516 "parsing/parser.ml" +# 40436 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39560,18 +40480,18 @@ module Tables = struct let _3 = let (_endpos__2_, _startpos__1_, _2, _1) = (_endpos__2_inlined1_, _startpos__1_inlined1_, _2_inlined1, _1_inlined1) in let _1 = -# 2704 "parsing/parser.mly" +# 2784 "parsing/parser.mly" (Lident "()") -# 39566 "parsing/parser.ml" +# 40486 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39575 "parsing/parser.ml" +# 40495 "parsing/parser.ml" in let _endpos__3_ = _endpos__2_inlined1_ in @@ -39580,18 +40500,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39586 "parsing/parser.ml" +# 40506 "parsing/parser.ml" in let _endpos = _endpos__3_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2705 "parsing/parser.mly" +# 2785 "parsing/parser.mly" ( Ppat_open(_1, mkpat ~loc:_sloc (Ppat_construct(_3, None))) ) -# 39595 "parsing/parser.ml" +# 40515 "parsing/parser.ml" in let _endpos__1_ = _endpos__2_inlined1_ in @@ -39599,15 +40519,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39605 "parsing/parser.ml" +# 40525 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39611 "parsing/parser.ml" +# 40531 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39664,15 +40584,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 39670 "parsing/parser.ml" +# 40590 "parsing/parser.ml" in -# 2707 "parsing/parser.mly" +# 2787 "parsing/parser.mly" ( Ppat_open (_1, _4) ) -# 39676 "parsing/parser.ml" +# 40596 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -39680,15 +40600,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39686 "parsing/parser.ml" +# 40606 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39692 "parsing/parser.ml" +# 40612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39743,9 +40663,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 2709 "parsing/parser.mly" +# 2789 "parsing/parser.mly" ( unclosed "(" _loc__3_ ")" _loc__5_ ) -# 39749 "parsing/parser.ml" +# 40669 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -39753,15 +40673,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39759 "parsing/parser.ml" +# 40679 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39765 "parsing/parser.ml" +# 40685 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39808,9 +40728,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 2711 "parsing/parser.mly" +# 2791 "parsing/parser.mly" ( expecting _loc__4_ "pattern" ) -# 39814 "parsing/parser.ml" +# 40734 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -39818,15 +40738,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39824 "parsing/parser.ml" +# 40744 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39830 "parsing/parser.ml" +# 40750 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39867,9 +40787,9 @@ module Tables = struct let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2713 "parsing/parser.mly" +# 2793 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 39873 "parsing/parser.ml" +# 40793 "parsing/parser.ml" in let _endpos__1_ = _endpos__3_ in @@ -39877,15 +40797,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39883 "parsing/parser.ml" +# 40803 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39889 "parsing/parser.ml" +# 40809 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -39937,24 +40857,24 @@ module Tables = struct let _endpos = _endpos__5_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2715 "parsing/parser.mly" +# 2795 "parsing/parser.mly" ( Ppat_constraint(_2, _4) ) -# 39943 "parsing/parser.ml" +# 40863 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 39952 "parsing/parser.ml" +# 40872 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 39958 "parsing/parser.ml" +# 40878 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40009,9 +40929,9 @@ module Tables = struct let _loc__5_ = (_startpos__5_, _endpos__5_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2717 "parsing/parser.mly" +# 2797 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__5_ ) -# 40015 "parsing/parser.ml" +# 40935 "parsing/parser.ml" in let _endpos__1_ = _endpos__5_ in @@ -40019,15 +40939,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40025 "parsing/parser.ml" +# 40945 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 40031 "parsing/parser.ml" +# 40951 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40074,9 +40994,9 @@ module Tables = struct let _1 = let _loc__4_ = (_startpos__4_, _endpos__4_) in -# 2719 "parsing/parser.mly" +# 2799 "parsing/parser.mly" ( expecting _loc__4_ "type" ) -# 40080 "parsing/parser.ml" +# 41000 "parsing/parser.ml" in let _endpos__1_ = _endpos__4_ in @@ -40084,15 +41004,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40090 "parsing/parser.ml" +# 41010 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 40096 "parsing/parser.ml" +# 41016 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40171,11 +41091,11 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3335 "parsing/parser.mly" +# 3419 "parsing/parser.mly" ( let (lid, cstrs, attrs) = package_type_of_module_type _1 in let descr = Ptyp_package (lid, cstrs) in mktyp ~loc:_sloc ~attrs descr ) -# 40179 "parsing/parser.ml" +# 41099 "parsing/parser.ml" in let _3 = @@ -40183,23 +41103,23 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 40189 "parsing/parser.ml" +# 41109 "parsing/parser.ml" in -# 3758 "parsing/parser.mly" +# 3848 "parsing/parser.mly" ( _1, _2 ) -# 40195 "parsing/parser.ml" +# 41115 "parsing/parser.ml" in let _loc__7_ = (_startpos__7_, _endpos__7_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2722 "parsing/parser.mly" +# 2802 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__7_ ) -# 40203 "parsing/parser.ml" +# 41123 "parsing/parser.ml" in let _endpos__1_ = _endpos__7_ in @@ -40207,15 +41127,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40213 "parsing/parser.ml" +# 41133 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 40219 "parsing/parser.ml" +# 41139 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40239,23 +41159,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.pattern) = let _1 = let _1 = -# 2724 "parsing/parser.mly" +# 2804 "parsing/parser.mly" ( Ppat_extension _1 ) -# 40245 "parsing/parser.ml" +# 41165 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 852 "parsing/parser.mly" +# 918 "parsing/parser.mly" ( mkpat ~loc:_sloc _1 ) -# 40253 "parsing/parser.ml" +# 41173 "parsing/parser.ml" in -# 2685 "parsing/parser.mly" +# 2765 "parsing/parser.mly" ( _1 ) -# 40259 "parsing/parser.ml" +# 41179 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40274,17 +41194,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 40280 "parsing/parser.ml" +# 41200 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3668 "parsing/parser.mly" +# 3756 "parsing/parser.mly" ( _1 ) -# 40288 "parsing/parser.ml" +# 41208 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40303,17 +41223,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 701 "parsing/parser.mly" +# 756 "parsing/parser.mly" (string) -# 40309 "parsing/parser.ml" +# 41229 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3669 "parsing/parser.mly" +# 3757 "parsing/parser.mly" ( _1 ) -# 40317 "parsing/parser.ml" +# 41237 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40336,9 +41256,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3670 "parsing/parser.mly" +# 3758 "parsing/parser.mly" ( "and" ) -# 40342 "parsing/parser.ml" +# 41262 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40361,9 +41281,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3671 "parsing/parser.mly" +# 3759 "parsing/parser.mly" ( "as" ) -# 40367 "parsing/parser.ml" +# 41287 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40386,9 +41306,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3672 "parsing/parser.mly" +# 3760 "parsing/parser.mly" ( "assert" ) -# 40392 "parsing/parser.ml" +# 41312 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40411,9 +41331,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3673 "parsing/parser.mly" +# 3761 "parsing/parser.mly" ( "begin" ) -# 40417 "parsing/parser.ml" +# 41337 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40436,9 +41356,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3674 "parsing/parser.mly" +# 3762 "parsing/parser.mly" ( "class" ) -# 40442 "parsing/parser.ml" +# 41362 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40461,9 +41381,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3675 "parsing/parser.mly" +# 3763 "parsing/parser.mly" ( "constraint" ) -# 40467 "parsing/parser.ml" +# 41387 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40486,9 +41406,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3676 "parsing/parser.mly" +# 3764 "parsing/parser.mly" ( "do" ) -# 40492 "parsing/parser.ml" +# 41412 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40511,9 +41431,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3677 "parsing/parser.mly" +# 3765 "parsing/parser.mly" ( "done" ) -# 40517 "parsing/parser.ml" +# 41437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40536,9 +41456,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3678 "parsing/parser.mly" +# 3766 "parsing/parser.mly" ( "downto" ) -# 40542 "parsing/parser.ml" +# 41462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40561,9 +41481,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3679 "parsing/parser.mly" +# 3767 "parsing/parser.mly" ( "else" ) -# 40567 "parsing/parser.ml" +# 41487 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40586,9 +41506,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3680 "parsing/parser.mly" +# 3768 "parsing/parser.mly" ( "end" ) -# 40592 "parsing/parser.ml" +# 41512 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40611,9 +41531,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3681 "parsing/parser.mly" +# 3769 "parsing/parser.mly" ( "exception" ) -# 40617 "parsing/parser.ml" +# 41537 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40636,9 +41556,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3682 "parsing/parser.mly" +# 3770 "parsing/parser.mly" ( "external" ) -# 40642 "parsing/parser.ml" +# 41562 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40661,9 +41581,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3683 "parsing/parser.mly" +# 3771 "parsing/parser.mly" ( "false" ) -# 40667 "parsing/parser.ml" +# 41587 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40686,9 +41606,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3684 "parsing/parser.mly" +# 3772 "parsing/parser.mly" ( "for" ) -# 40692 "parsing/parser.ml" +# 41612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40711,9 +41631,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3685 "parsing/parser.mly" +# 3773 "parsing/parser.mly" ( "fun" ) -# 40717 "parsing/parser.ml" +# 41637 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40736,9 +41656,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3686 "parsing/parser.mly" +# 3774 "parsing/parser.mly" ( "function" ) -# 40742 "parsing/parser.ml" +# 41662 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40761,9 +41681,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3687 "parsing/parser.mly" +# 3775 "parsing/parser.mly" ( "functor" ) -# 40767 "parsing/parser.ml" +# 41687 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40786,9 +41706,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3688 "parsing/parser.mly" +# 3776 "parsing/parser.mly" ( "if" ) -# 40792 "parsing/parser.ml" +# 41712 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40811,9 +41731,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3689 "parsing/parser.mly" +# 3777 "parsing/parser.mly" ( "in" ) -# 40817 "parsing/parser.ml" +# 41737 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40836,9 +41756,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3690 "parsing/parser.mly" +# 3778 "parsing/parser.mly" ( "include" ) -# 40842 "parsing/parser.ml" +# 41762 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40861,9 +41781,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3691 "parsing/parser.mly" +# 3779 "parsing/parser.mly" ( "inherit" ) -# 40867 "parsing/parser.ml" +# 41787 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40886,9 +41806,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3692 "parsing/parser.mly" +# 3780 "parsing/parser.mly" ( "initializer" ) -# 40892 "parsing/parser.ml" +# 41812 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40911,9 +41831,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3693 "parsing/parser.mly" +# 3781 "parsing/parser.mly" ( "lazy" ) -# 40917 "parsing/parser.ml" +# 41837 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40936,9 +41856,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3694 "parsing/parser.mly" +# 3782 "parsing/parser.mly" ( "let" ) -# 40942 "parsing/parser.ml" +# 41862 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40961,9 +41881,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3695 "parsing/parser.mly" +# 3783 "parsing/parser.mly" ( "match" ) -# 40967 "parsing/parser.ml" +# 41887 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -40986,9 +41906,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3696 "parsing/parser.mly" +# 3784 "parsing/parser.mly" ( "method" ) -# 40992 "parsing/parser.ml" +# 41912 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41011,9 +41931,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3697 "parsing/parser.mly" +# 3785 "parsing/parser.mly" ( "module" ) -# 41017 "parsing/parser.ml" +# 41937 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41036,9 +41956,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3698 "parsing/parser.mly" +# 3786 "parsing/parser.mly" ( "mutable" ) -# 41042 "parsing/parser.ml" +# 41962 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41061,9 +41981,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3699 "parsing/parser.mly" +# 3787 "parsing/parser.mly" ( "new" ) -# 41067 "parsing/parser.ml" +# 41987 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41086,9 +42006,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3700 "parsing/parser.mly" +# 3788 "parsing/parser.mly" ( "nonrec" ) -# 41092 "parsing/parser.ml" +# 42012 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41111,9 +42031,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3701 "parsing/parser.mly" +# 3789 "parsing/parser.mly" ( "object" ) -# 41117 "parsing/parser.ml" +# 42037 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41136,9 +42056,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3702 "parsing/parser.mly" +# 3790 "parsing/parser.mly" ( "of" ) -# 41142 "parsing/parser.ml" +# 42062 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41161,9 +42081,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3703 "parsing/parser.mly" +# 3791 "parsing/parser.mly" ( "open" ) -# 41167 "parsing/parser.ml" +# 42087 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41186,9 +42106,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3704 "parsing/parser.mly" +# 3792 "parsing/parser.mly" ( "or" ) -# 41192 "parsing/parser.ml" +# 42112 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41211,9 +42131,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3705 "parsing/parser.mly" +# 3793 "parsing/parser.mly" ( "private" ) -# 41217 "parsing/parser.ml" +# 42137 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41236,9 +42156,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3706 "parsing/parser.mly" +# 3794 "parsing/parser.mly" ( "rec" ) -# 41242 "parsing/parser.ml" +# 42162 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41261,9 +42181,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3707 "parsing/parser.mly" +# 3795 "parsing/parser.mly" ( "sig" ) -# 41267 "parsing/parser.ml" +# 42187 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41286,9 +42206,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3708 "parsing/parser.mly" +# 3796 "parsing/parser.mly" ( "struct" ) -# 41292 "parsing/parser.ml" +# 42212 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41311,9 +42231,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3709 "parsing/parser.mly" +# 3797 "parsing/parser.mly" ( "then" ) -# 41317 "parsing/parser.ml" +# 42237 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41336,9 +42256,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3710 "parsing/parser.mly" +# 3798 "parsing/parser.mly" ( "to" ) -# 41342 "parsing/parser.ml" +# 42262 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41361,9 +42281,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3711 "parsing/parser.mly" +# 3799 "parsing/parser.mly" ( "true" ) -# 41367 "parsing/parser.ml" +# 42287 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41386,9 +42306,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3712 "parsing/parser.mly" +# 3800 "parsing/parser.mly" ( "try" ) -# 41392 "parsing/parser.ml" +# 42312 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41411,9 +42331,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3713 "parsing/parser.mly" +# 3801 "parsing/parser.mly" ( "type" ) -# 41417 "parsing/parser.ml" +# 42337 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41436,9 +42356,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3714 "parsing/parser.mly" +# 3802 "parsing/parser.mly" ( "val" ) -# 41442 "parsing/parser.ml" +# 42362 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41461,9 +42381,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3715 "parsing/parser.mly" +# 3803 "parsing/parser.mly" ( "virtual" ) -# 41467 "parsing/parser.ml" +# 42387 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41486,9 +42406,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3716 "parsing/parser.mly" +# 3804 "parsing/parser.mly" ( "when" ) -# 41492 "parsing/parser.ml" +# 42412 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41511,9 +42431,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3717 "parsing/parser.mly" +# 3805 "parsing/parser.mly" ( "while" ) -# 41517 "parsing/parser.ml" +# 42437 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41536,9 +42456,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3718 "parsing/parser.mly" +# 3806 "parsing/parser.mly" ( "with" ) -# 41542 "parsing/parser.ml" +# 42462 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41561,9 +42481,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Parsetree.type_exception * string Asttypes.loc option) = -# 3003 "parsing/parser.mly" +# 3083 "parsing/parser.mly" ( _1 ) -# 41567 "parsing/parser.ml" +# 42487 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41637,18 +42557,18 @@ module Tables = struct let _v : (Parsetree.type_exception * string Asttypes.loc option) = let attrs = let _1 = _1_inlined5 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 41643 "parsing/parser.ml" +# 42563 "parsing/parser.ml" in let _endpos_attrs_ = _endpos__1_inlined5_ in let attrs2 = let _1 = _1_inlined4 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 41652 "parsing/parser.ml" +# 42572 "parsing/parser.ml" in let lid = @@ -41657,9 +42577,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 41663 "parsing/parser.ml" +# 42583 "parsing/parser.ml" in let id = @@ -41668,30 +42588,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 41674 "parsing/parser.ml" +# 42594 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 41682 "parsing/parser.ml" +# 42602 "parsing/parser.ml" in let _endpos = _endpos_attrs_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3012 "parsing/parser.mly" +# 3092 "parsing/parser.mly" ( let loc = make_loc _sloc in let docs = symbol_docs _sloc in Te.mk_exception ~attrs (Te.rebind id lid ~attrs:(attrs1 @ attrs2) ~loc ~docs) , ext ) -# 41695 "parsing/parser.ml" +# 42615 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41721,9 +42641,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.expression) = -# 2513 "parsing/parser.mly" +# 2590 "parsing/parser.mly" ( _2 ) -# 41727 "parsing/parser.ml" +# 42647 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41756,9 +42676,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2515 "parsing/parser.mly" +# 2592 "parsing/parser.mly" ( let (l, o, p) = _1 in ghexp ~loc:_sloc (Pexp_fun(l, o, p, _2)) ) -# 41762 "parsing/parser.ml" +# 42682 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41809,17 +42729,17 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__5_ in let _v : (Parsetree.expression) = let _3 = -# 2416 "parsing/parser.mly" +# 2478 "parsing/parser.mly" ( xs ) -# 41815 "parsing/parser.ml" +# 42735 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2517 "parsing/parser.mly" +# 2594 "parsing/parser.mly" ( mk_newtypes ~loc:_sloc _3 _5 ) -# 41823 "parsing/parser.ml" +# 42743 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41846,39 +42766,39 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 41850 "parsing/parser.ml" +# 42770 "parsing/parser.ml" in let xs = let items = -# 887 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( [] ) -# 41856 "parsing/parser.ml" +# 42776 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1372 "parsing/parser.mly" ( items ) -# 41861 "parsing/parser.ml" +# 42781 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 41867 "parsing/parser.ml" +# 42787 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 875 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 41876 "parsing/parser.ml" +# 42796 "parsing/parser.ml" in -# 1294 "parsing/parser.mly" +# 1365 "parsing/parser.mly" ( _1 ) -# 41882 "parsing/parser.ml" +# 42802 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -41919,7 +42839,7 @@ module Tables = struct let ys = # 260 "" ( List.flatten xss ) -# 41923 "parsing/parser.ml" +# 42843 "parsing/parser.ml" in let xs = let items = @@ -41927,65 +42847,65 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 41933 "parsing/parser.ml" +# 42853 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1379 "parsing/parser.mly" ( mkstrexp e attrs ) -# 41938 "parsing/parser.ml" +# 42858 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 887 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 41946 "parsing/parser.ml" +# 42866 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 840 "parsing/parser.mly" +# 906 "parsing/parser.mly" ( mark_rhs_docs _startpos _endpos; _1 ) -# 41956 "parsing/parser.ml" +# 42876 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( x ) -# 41962 "parsing/parser.ml" +# 42882 "parsing/parser.ml" in -# 1301 "parsing/parser.mly" +# 1372 "parsing/parser.mly" ( items ) -# 41968 "parsing/parser.ml" +# 42888 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 41974 "parsing/parser.ml" +# 42894 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 875 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 41983 "parsing/parser.ml" +# 42903 "parsing/parser.ml" in -# 1294 "parsing/parser.mly" +# 1365 "parsing/parser.mly" ( _1 ) -# 41989 "parsing/parser.ml" +# 42909 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42011,9 +42931,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1323 "parsing/parser.mly" +# 1394 "parsing/parser.mly" ( val_of_let_bindings ~loc:_sloc _1 ) -# 42017 "parsing/parser.ml" +# 42937 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42047,9 +42967,9 @@ module Tables = struct let _2 = let _1 = _1_inlined1 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 42053 "parsing/parser.ml" +# 42973 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -42057,10 +42977,10 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1326 "parsing/parser.mly" +# 1397 "parsing/parser.mly" ( let docs = symbol_docs _sloc in Pstr_extension (_1, add_docs_attrs docs _2) ) -# 42064 "parsing/parser.ml" +# 42984 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined1_ in @@ -42068,15 +42988,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 856 "parsing/parser.mly" +# 922 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 42074 "parsing/parser.ml" +# 42994 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42080 "parsing/parser.ml" +# 43000 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42100,23 +43020,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1329 "parsing/parser.mly" +# 1400 "parsing/parser.mly" ( Pstr_attribute _1 ) -# 42106 "parsing/parser.ml" +# 43026 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 856 "parsing/parser.mly" +# 922 "parsing/parser.mly" ( mkstr ~loc:_sloc _1 ) -# 42114 "parsing/parser.ml" +# 43034 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42120 "parsing/parser.ml" +# 43040 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42140,23 +43060,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1333 "parsing/parser.mly" +# 1404 "parsing/parser.mly" ( pstr_primitive _1 ) -# 42146 "parsing/parser.ml" +# 43066 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42154 "parsing/parser.ml" +# 43074 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42160 "parsing/parser.ml" +# 43080 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42180,23 +43100,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1335 "parsing/parser.mly" +# 1406 "parsing/parser.mly" ( pstr_primitive _1 ) -# 42186 "parsing/parser.ml" +# 43106 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42194 "parsing/parser.ml" +# 43114 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42200 "parsing/parser.ml" +# 43120 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42231,26 +43151,26 @@ module Tables = struct let _1 = let _1 = let _1 = -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 42237 "parsing/parser.ml" +# 43157 "parsing/parser.ml" in -# 2847 "parsing/parser.mly" +# 2927 "parsing/parser.mly" ( _1 ) -# 42242 "parsing/parser.ml" +# 43162 "parsing/parser.ml" in -# 2830 "parsing/parser.mly" +# 2910 "parsing/parser.mly" ( _1 ) -# 42248 "parsing/parser.ml" +# 43168 "parsing/parser.ml" in -# 1337 "parsing/parser.mly" +# 1408 "parsing/parser.mly" ( pstr_type _1 ) -# 42254 "parsing/parser.ml" +# 43174 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_bs_, _startpos_a_) in @@ -42258,15 +43178,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42264 "parsing/parser.ml" +# 43184 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42270 "parsing/parser.ml" +# 43190 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42351,16 +43271,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 42357 "parsing/parser.ml" +# 43277 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in let cs = -# 1040 "parsing/parser.mly" +# 1106 "parsing/parser.mly" ( List.rev xs ) -# 42364 "parsing/parser.ml" +# 43284 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in @@ -42368,46 +43288,46 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42374 "parsing/parser.ml" +# 43294 "parsing/parser.ml" in let _4 = -# 3590 "parsing/parser.mly" +# 3676 "parsing/parser.mly" ( Recursive ) -# 42380 "parsing/parser.ml" +# 43300 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 42387 "parsing/parser.ml" +# 43307 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3095 "parsing/parser.mly" +# 3175 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 42399 "parsing/parser.ml" +# 43319 "parsing/parser.ml" in -# 3078 "parsing/parser.mly" +# 3158 "parsing/parser.mly" ( _1 ) -# 42405 "parsing/parser.ml" +# 43325 "parsing/parser.ml" in -# 1339 "parsing/parser.mly" +# 1410 "parsing/parser.mly" ( pstr_typext _1 ) -# 42411 "parsing/parser.ml" +# 43331 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -42415,15 +43335,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42421 "parsing/parser.ml" +# 43341 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42427 "parsing/parser.ml" +# 43347 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42515,16 +43435,16 @@ module Tables = struct let attrs2 = let _1 = _1_inlined4 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 42521 "parsing/parser.ml" +# 43441 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined4_ in let cs = -# 1040 "parsing/parser.mly" +# 1106 "parsing/parser.mly" ( List.rev xs ) -# 42528 "parsing/parser.ml" +# 43448 "parsing/parser.ml" in let tid = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined3_, _startpos__1_inlined3_, _1_inlined3) in @@ -42532,9 +43452,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42538 "parsing/parser.ml" +# 43458 "parsing/parser.ml" in let _4 = @@ -42543,41 +43463,41 @@ module Tables = struct let _startpos = _startpos__1_ in let _loc = (_startpos, _endpos) in -# 3591 "parsing/parser.mly" +# 3678 "parsing/parser.mly" ( not_expecting _loc "nonrec flag" ) -# 42549 "parsing/parser.ml" +# 43469 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 42557 "parsing/parser.ml" +# 43477 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3095 "parsing/parser.mly" +# 3175 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let attrs = attrs1 @ attrs2 in Te.mk tid cs ~params ~priv ~attrs ~docs, ext ) -# 42569 "parsing/parser.ml" +# 43489 "parsing/parser.ml" in -# 3078 "parsing/parser.mly" +# 3158 "parsing/parser.mly" ( _1 ) -# 42575 "parsing/parser.ml" +# 43495 "parsing/parser.ml" in -# 1339 "parsing/parser.mly" +# 1410 "parsing/parser.mly" ( pstr_typext _1 ) -# 42581 "parsing/parser.ml" +# 43501 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined4_ in @@ -42585,15 +43505,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42591 "parsing/parser.ml" +# 43511 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42597 "parsing/parser.ml" +# 43517 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42617,23 +43537,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1341 "parsing/parser.mly" +# 1412 "parsing/parser.mly" ( pstr_exception _1 ) -# 42623 "parsing/parser.ml" +# 43543 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42631 "parsing/parser.ml" +# 43551 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42637 "parsing/parser.ml" +# 43557 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42696,9 +43616,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 42702 "parsing/parser.ml" +# 43622 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -42708,36 +43628,36 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42714 "parsing/parser.ml" +# 43634 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 42722 "parsing/parser.ml" +# 43642 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1367 "parsing/parser.mly" +# 1438 "parsing/parser.mly" ( let docs = symbol_docs _sloc in let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in let body = Mb.mk name body ~attrs ~loc ~docs in Pstr_module body, ext ) -# 42735 "parsing/parser.ml" +# 43655 "parsing/parser.ml" in -# 1343 "parsing/parser.mly" +# 1414 "parsing/parser.mly" ( _1 ) -# 42741 "parsing/parser.ml" +# 43661 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined3_ in @@ -42745,15 +43665,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42751 "parsing/parser.ml" +# 43671 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42757 "parsing/parser.ml" +# 43677 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42832,9 +43752,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 42838 "parsing/parser.ml" +# 43758 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -42844,24 +43764,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 42850 "parsing/parser.ml" +# 43770 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 42858 "parsing/parser.ml" +# 43778 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1402 "parsing/parser.mly" +# 1473 "parsing/parser.mly" ( let loc = make_loc _sloc in let attrs = attrs1 @ attrs2 in @@ -42869,25 +43789,25 @@ module Tables = struct ext, Mb.mk name body ~attrs ~loc ~docs ) -# 42873 "parsing/parser.ml" +# 43793 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 42879 "parsing/parser.ml" +# 43799 "parsing/parser.ml" in -# 1390 "parsing/parser.mly" +# 1461 "parsing/parser.mly" ( _1 ) -# 42885 "parsing/parser.ml" +# 43805 "parsing/parser.ml" in -# 1345 "parsing/parser.mly" +# 1416 "parsing/parser.mly" ( pstr_recmodule _1 ) -# 42891 "parsing/parser.ml" +# 43811 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -42895,15 +43815,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42901 "parsing/parser.ml" +# 43821 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42907 "parsing/parser.ml" +# 43827 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42927,23 +43847,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1347 "parsing/parser.mly" +# 1418 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_modtype body, ext) ) -# 42933 "parsing/parser.ml" +# 43853 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42941 "parsing/parser.ml" +# 43861 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42947 "parsing/parser.ml" +# 43867 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -42967,23 +43887,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1349 "parsing/parser.mly" +# 1420 "parsing/parser.mly" ( let (body, ext) = _1 in (Pstr_open body, ext) ) -# 42973 "parsing/parser.ml" +# 43893 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 42981 "parsing/parser.ml" +# 43901 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 42987 "parsing/parser.ml" +# 43907 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43053,9 +43973,9 @@ module Tables = struct let _1_inlined3 : (Parsetree.attributes) = Obj.magic _1_inlined3 in let body : (Parsetree.class_expr) = Obj.magic body in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 43059 "parsing/parser.ml" +# 43979 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let params : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = Obj.magic params in let virt : (Asttypes.virtual_flag) = Obj.magic virt in @@ -43073,9 +43993,9 @@ module Tables = struct let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 43079 "parsing/parser.ml" +# 43999 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -43085,24 +44005,24 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43091 "parsing/parser.ml" +# 44011 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 43099 "parsing/parser.ml" +# 44019 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1721 "parsing/parser.mly" +# 1811 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in @@ -43110,25 +44030,25 @@ module Tables = struct ext, Ci.mk id body ~virt ~params ~attrs ~loc ~docs ) -# 43114 "parsing/parser.ml" +# 44034 "parsing/parser.ml" in -# 1048 "parsing/parser.mly" +# 1114 "parsing/parser.mly" ( let (x, b) = a in x, b :: bs ) -# 43120 "parsing/parser.ml" +# 44040 "parsing/parser.ml" in -# 1710 "parsing/parser.mly" +# 1800 "parsing/parser.mly" ( _1 ) -# 43126 "parsing/parser.ml" +# 44046 "parsing/parser.ml" in -# 1351 "parsing/parser.mly" +# 1422 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class l, ext) ) -# 43132 "parsing/parser.ml" +# 44052 "parsing/parser.ml" in let _endpos__1_ = _endpos_bs_ in @@ -43136,15 +44056,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43142 "parsing/parser.ml" +# 44062 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 43148 "parsing/parser.ml" +# 44068 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43168,23 +44088,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.structure_item) = let _1 = let _1 = -# 1353 "parsing/parser.mly" +# 1424 "parsing/parser.mly" ( let (ext, l) = _1 in (Pstr_class_type l, ext) ) -# 43174 "parsing/parser.ml" +# 44094 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43182 "parsing/parser.ml" +# 44102 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 43188 "parsing/parser.ml" +# 44108 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43240,38 +44160,38 @@ module Tables = struct let attrs2 = let _1 = _1_inlined2 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 43246 "parsing/parser.ml" +# 44166 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined2_ in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 43255 "parsing/parser.ml" +# 44175 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 1439 "parsing/parser.mly" +# 1510 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Incl.mk thing ~attrs ~loc ~docs, ext ) -# 43269 "parsing/parser.ml" +# 44189 "parsing/parser.ml" in -# 1355 "parsing/parser.mly" +# 1426 "parsing/parser.mly" ( pstr_include _1 ) -# 43275 "parsing/parser.ml" +# 44195 "parsing/parser.ml" in let _endpos__1_ = _endpos__1_inlined2_ in @@ -43279,15 +44199,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 873 "parsing/parser.mly" +# 939 "parsing/parser.mly" ( wrap_mkstr_ext ~loc:_sloc _1 ) -# 43285 "parsing/parser.ml" +# 44205 "parsing/parser.ml" in -# 1357 "parsing/parser.mly" +# 1428 "parsing/parser.mly" ( _1 ) -# 43291 "parsing/parser.ml" +# 44211 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43310,9 +44230,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3653 "parsing/parser.mly" +# 3741 "parsing/parser.mly" ( "-" ) -# 43316 "parsing/parser.ml" +# 44236 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43335,9 +44255,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (string) = -# 3654 "parsing/parser.mly" +# 3742 "parsing/parser.mly" ( "-." ) -# 43341 "parsing/parser.ml" +# 44261 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43390,9 +44310,9 @@ module Tables = struct let _v : (Parsetree.row_field) = let _5 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 43396 "parsing/parser.ml" +# 44316 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined1_ in @@ -43401,18 +44321,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 43405 "parsing/parser.ml" +# 44325 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 43410 "parsing/parser.ml" +# 44330 "parsing/parser.ml" in -# 3365 "parsing/parser.mly" +# 3449 "parsing/parser.mly" ( _1 ) -# 43416 "parsing/parser.ml" +# 44336 "parsing/parser.ml" in let _1 = @@ -43420,20 +44340,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43426 "parsing/parser.ml" +# 44346 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3351 "parsing/parser.mly" +# 3435 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _5 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 _3 _4 ) -# 43437 "parsing/parser.ml" +# 44357 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43465,9 +44385,9 @@ module Tables = struct let _v : (Parsetree.row_field) = let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 43471 "parsing/parser.ml" +# 44391 "parsing/parser.ml" in let _endpos__2_ = _endpos__1_inlined1_ in @@ -43476,20 +44396,20 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43482 "parsing/parser.ml" +# 44402 "parsing/parser.ml" in let _endpos = _endpos__2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3355 "parsing/parser.mly" +# 3439 "parsing/parser.mly" ( let info = symbol_info _endpos in let attrs = add_info_attrs info _2 in Rf.tag ~loc:(make_loc _sloc) ~attrs _1 true [] ) -# 43493 "parsing/parser.ml" +# 44413 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43521,7 +44441,7 @@ module Tables = struct let _v : (Parsetree.toplevel_phrase) = let arg = # 124 "" ( None ) -# 43525 "parsing/parser.ml" +# 44445 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined1_ in let dir = @@ -43530,18 +44450,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43536 "parsing/parser.ml" +# 44456 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 43545 "parsing/parser.ml" +# 44465 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43572,9 +44492,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 689 "parsing/parser.mly" +# 743 "parsing/parser.mly" (string * Location.t * string option) -# 43578 "parsing/parser.ml" +# 44498 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -43585,23 +44505,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3557 "parsing/parser.mly" +# 3643 "parsing/parser.mly" ( let (s, _, _) = _1 in Pdir_string s ) -# 43591 "parsing/parser.ml" +# 44511 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 43599 "parsing/parser.ml" +# 44519 "parsing/parser.ml" in # 126 "" ( Some x ) -# 43605 "parsing/parser.ml" +# 44525 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -43611,18 +44531,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43617 "parsing/parser.ml" +# 44537 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 43626 "parsing/parser.ml" +# 44546 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43653,9 +44573,9 @@ module Tables = struct }; } = _menhir_stack in let _1_inlined2 : ( -# 637 "parsing/parser.mly" +# 691 "parsing/parser.mly" (string * char option) -# 43659 "parsing/parser.ml" +# 44579 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _1_inlined1 : (Asttypes.label) = Obj.magic _1_inlined1 in let _1 : unit = Obj.magic _1 in @@ -43666,23 +44586,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3558 "parsing/parser.mly" +# 3644 "parsing/parser.mly" ( let (n, m) = _1 in Pdir_int (n ,m) ) -# 43672 "parsing/parser.ml" +# 44592 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 43680 "parsing/parser.ml" +# 44600 "parsing/parser.ml" in # 126 "" ( Some x ) -# 43686 "parsing/parser.ml" +# 44606 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -43692,18 +44612,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43698 "parsing/parser.ml" +# 44618 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 43707 "parsing/parser.ml" +# 44627 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43743,23 +44663,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3559 "parsing/parser.mly" +# 3645 "parsing/parser.mly" ( Pdir_ident _1 ) -# 43749 "parsing/parser.ml" +# 44669 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 43757 "parsing/parser.ml" +# 44677 "parsing/parser.ml" in # 126 "" ( Some x ) -# 43763 "parsing/parser.ml" +# 44683 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -43769,18 +44689,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43775 "parsing/parser.ml" +# 44695 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 43784 "parsing/parser.ml" +# 44704 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43820,23 +44740,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3560 "parsing/parser.mly" +# 3646 "parsing/parser.mly" ( Pdir_ident _1 ) -# 43826 "parsing/parser.ml" +# 44746 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 43834 "parsing/parser.ml" +# 44754 "parsing/parser.ml" in # 126 "" ( Some x ) -# 43840 "parsing/parser.ml" +# 44760 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -43846,18 +44766,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43852 "parsing/parser.ml" +# 44772 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 43861 "parsing/parser.ml" +# 44781 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43897,23 +44817,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3561 "parsing/parser.mly" +# 3647 "parsing/parser.mly" ( Pdir_bool false ) -# 43903 "parsing/parser.ml" +# 44823 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 43911 "parsing/parser.ml" +# 44831 "parsing/parser.ml" in # 126 "" ( Some x ) -# 43917 "parsing/parser.ml" +# 44837 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -43923,18 +44843,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 43929 "parsing/parser.ml" +# 44849 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 43938 "parsing/parser.ml" +# 44858 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -43974,23 +44894,23 @@ module Tables = struct let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let x = let _1 = -# 3562 "parsing/parser.mly" +# 3648 "parsing/parser.mly" ( Pdir_bool true ) -# 43980 "parsing/parser.ml" +# 44900 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 878 "parsing/parser.mly" +# 944 "parsing/parser.mly" ( mk_directive_arg ~loc:_sloc _1 ) -# 43988 "parsing/parser.ml" +# 44908 "parsing/parser.ml" in # 126 "" ( Some x ) -# 43994 "parsing/parser.ml" +# 44914 "parsing/parser.ml" in let _endpos_arg_ = _endpos__1_inlined2_ in @@ -44000,18 +44920,18 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 44006 "parsing/parser.ml" +# 44926 "parsing/parser.ml" in let _endpos = _endpos_arg_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3553 "parsing/parser.mly" +# 3639 "parsing/parser.mly" ( mk_directive ~loc:_sloc dir arg ) -# 44015 "parsing/parser.ml" +# 44935 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44047,45 +44967,41 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e_ in let _endpos = _endpos__2_ in - let _v : ( -# 785 "parsing/parser.mly" - (Parsetree.toplevel_phrase) -# 44054 "parsing/parser.ml" - ) = let _1 = + let _v : (Parsetree.toplevel_phrase) = let _1 = let _1 = let _1 = let attrs = -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 44061 "parsing/parser.ml" +# 44977 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1379 "parsing/parser.mly" ( mkstrexp e attrs ) -# 44066 "parsing/parser.ml" +# 44982 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 821 "parsing/parser.mly" +# 887 "parsing/parser.mly" ( text_str _startpos @ [_1] ) -# 44074 "parsing/parser.ml" +# 44990 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 875 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 44083 "parsing/parser.ml" +# 44999 "parsing/parser.ml" in -# 1086 "parsing/parser.mly" +# 1154 "parsing/parser.mly" ( Ptop_def _1 ) -# 44089 "parsing/parser.ml" +# 45005 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44114,29 +45030,25 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_xss_ in let _endpos = _endpos__2_ in - let _v : ( -# 785 "parsing/parser.mly" - (Parsetree.toplevel_phrase) -# 44121 "parsing/parser.ml" - ) = let _1 = + let _v : (Parsetree.toplevel_phrase) = let _1 = let _1 = # 260 "" ( List.flatten xss ) -# 44126 "parsing/parser.ml" +# 45038 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 809 "parsing/parser.mly" +# 875 "parsing/parser.mly" ( extra_str _startpos _endpos _1 ) -# 44134 "parsing/parser.ml" +# 45046 "parsing/parser.ml" in -# 1090 "parsing/parser.mly" +# 1158 "parsing/parser.mly" ( Ptop_def _1 ) -# 44140 "parsing/parser.ml" +# 45052 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44165,14 +45077,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in - let _v : ( -# 785 "parsing/parser.mly" - (Parsetree.toplevel_phrase) -# 44172 "parsing/parser.ml" - ) = -# 1094 "parsing/parser.mly" + let _v : (Parsetree.toplevel_phrase) = +# 1162 "parsing/parser.mly" ( _1 ) -# 44176 "parsing/parser.ml" +# 45084 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44194,14 +45102,10 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in - let _v : ( -# 785 "parsing/parser.mly" - (Parsetree.toplevel_phrase) -# 44201 "parsing/parser.ml" - ) = -# 1097 "parsing/parser.mly" + let _v : (Parsetree.toplevel_phrase) = +# 1165 "parsing/parser.mly" ( raise End_of_file ) -# 44205 "parsing/parser.ml" +# 45109 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44224,9 +45128,9 @@ module Tables = struct let _startpos = _startpos_ty_ in let _endpos = _endpos_ty_ in let _v : (Parsetree.core_type) = -# 3257 "parsing/parser.mly" +# 3341 "parsing/parser.mly" ( ty ) -# 44230 "parsing/parser.ml" +# 45134 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44254,18 +45158,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 44258 "parsing/parser.ml" +# 45162 "parsing/parser.ml" in -# 979 "parsing/parser.mly" +# 1045 "parsing/parser.mly" ( xs ) -# 44263 "parsing/parser.ml" +# 45167 "parsing/parser.ml" in -# 3260 "parsing/parser.mly" +# 3344 "parsing/parser.mly" ( Ptyp_tuple tys ) -# 44269 "parsing/parser.ml" +# 45173 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xs_, _startpos_xs_) in @@ -44273,15 +45177,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 44279 "parsing/parser.ml" +# 45183 "parsing/parser.ml" in -# 3262 "parsing/parser.mly" +# 3346 "parsing/parser.mly" ( _1 ) -# 44285 "parsing/parser.ml" +# 45189 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44311,9 +45215,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2591 "parsing/parser.mly" +# 2668 "parsing/parser.mly" ( (Some _2, None) ) -# 44317 "parsing/parser.ml" +# 45221 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44357,9 +45261,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__4_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2592 "parsing/parser.mly" +# 2669 "parsing/parser.mly" ( (Some _2, Some _4) ) -# 44363 "parsing/parser.ml" +# 45267 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44389,9 +45293,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2593 "parsing/parser.mly" +# 2670 "parsing/parser.mly" ( (None, Some _2) ) -# 44395 "parsing/parser.ml" +# 45299 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44421,9 +45325,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2594 "parsing/parser.mly" +# 2671 "parsing/parser.mly" ( syntax_error() ) -# 44427 "parsing/parser.ml" +# 45331 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44453,9 +45357,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type option * Parsetree.core_type option) = -# 2595 "parsing/parser.mly" +# 2672 "parsing/parser.mly" ( syntax_error() ) -# 44459 "parsing/parser.ml" +# 45363 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44471,9 +45375,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 2921 "parsing/parser.mly" +# 3001 "parsing/parser.mly" ( (Ptype_abstract, Public, None) ) -# 44477 "parsing/parser.ml" +# 45381 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44503,9 +45407,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.type_kind * Asttypes.private_flag * Parsetree.core_type option) = -# 2923 "parsing/parser.mly" +# 3003 "parsing/parser.mly" ( _2 ) -# 44509 "parsing/parser.ml" +# 45413 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44528,9 +45432,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3516 "parsing/parser.mly" +# 3600 "parsing/parser.mly" ( _1 ) -# 44534 "parsing/parser.ml" +# 45438 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44560,9 +45464,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) = -# 2938 "parsing/parser.mly" +# 3018 "parsing/parser.mly" ( _2, _1 ) -# 44566 "parsing/parser.ml" +# 45470 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44578,9 +45482,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 2931 "parsing/parser.mly" +# 3011 "parsing/parser.mly" ( [] ) -# 44584 "parsing/parser.ml" +# 45488 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44603,9 +45507,9 @@ module Tables = struct let _startpos = _startpos_p_ in let _endpos = _endpos_p_ in let _v : ((Parsetree.core_type * (Asttypes.variance * Asttypes.injectivity)) list) = -# 2933 "parsing/parser.mly" +# 3013 "parsing/parser.mly" ( [p] ) -# 44609 "parsing/parser.ml" +# 45513 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44645,18 +45549,18 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 44649 "parsing/parser.ml" +# 45553 "parsing/parser.ml" in -# 951 "parsing/parser.mly" +# 1017 "parsing/parser.mly" ( xs ) -# 44654 "parsing/parser.ml" +# 45558 "parsing/parser.ml" in -# 2935 "parsing/parser.mly" +# 3015 "parsing/parser.mly" ( ps ) -# 44660 "parsing/parser.ml" +# 45564 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44687,24 +45591,24 @@ module Tables = struct let _endpos = _endpos_tyvar_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 2943 "parsing/parser.mly" +# 3023 "parsing/parser.mly" ( Ptyp_var tyvar ) -# 44693 "parsing/parser.ml" +# 45597 "parsing/parser.ml" in let _endpos__1_ = _endpos_tyvar_ in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 44702 "parsing/parser.ml" +# 45606 "parsing/parser.ml" in -# 2946 "parsing/parser.mly" +# 3026 "parsing/parser.mly" ( _1 ) -# 44708 "parsing/parser.ml" +# 45612 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44728,23 +45632,23 @@ module Tables = struct let _endpos = _endpos__1_ in let _v : (Parsetree.core_type) = let _1 = let _1 = -# 2945 "parsing/parser.mly" +# 3025 "parsing/parser.mly" ( Ptyp_any ) -# 44734 "parsing/parser.ml" +# 45638 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 854 "parsing/parser.mly" +# 920 "parsing/parser.mly" ( mktyp ~loc:_sloc _1 ) -# 44742 "parsing/parser.ml" +# 45646 "parsing/parser.ml" in -# 2946 "parsing/parser.mly" +# 3026 "parsing/parser.mly" ( _1 ) -# 44748 "parsing/parser.ml" +# 45652 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44760,9 +45664,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2950 "parsing/parser.mly" +# 3030 "parsing/parser.mly" ( NoVariance, NoInjectivity ) -# 44766 "parsing/parser.ml" +# 45670 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44785,9 +45689,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2951 "parsing/parser.mly" +# 3031 "parsing/parser.mly" ( Covariant, NoInjectivity ) -# 44791 "parsing/parser.ml" +# 45695 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44810,9 +45714,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2952 "parsing/parser.mly" +# 3032 "parsing/parser.mly" ( Contravariant, NoInjectivity ) -# 44816 "parsing/parser.ml" +# 45720 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44835,9 +45739,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2953 "parsing/parser.mly" +# 3033 "parsing/parser.mly" ( NoVariance, Injective ) -# 44841 "parsing/parser.ml" +# 45745 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44867,9 +45771,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2954 "parsing/parser.mly" +# 3034 "parsing/parser.mly" ( Covariant, Injective ) -# 44873 "parsing/parser.ml" +# 45777 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44899,9 +45803,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2954 "parsing/parser.mly" +# 3034 "parsing/parser.mly" ( Covariant, Injective ) -# 44905 "parsing/parser.ml" +# 45809 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44931,9 +45835,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2955 "parsing/parser.mly" +# 3035 "parsing/parser.mly" ( Contravariant, Injective ) -# 44937 "parsing/parser.ml" +# 45841 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44963,9 +45867,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.variance * Asttypes.injectivity) = -# 2955 "parsing/parser.mly" +# 3035 "parsing/parser.mly" ( Contravariant, Injective ) -# 44969 "parsing/parser.ml" +# 45873 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -44984,20 +45888,20 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 629 "parsing/parser.mly" +# 683 "parsing/parser.mly" (string) -# 44990 "parsing/parser.ml" +# 45894 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2957 "parsing/parser.mly" +# 3037 "parsing/parser.mly" ( if _1 = "+!" then Covariant, Injective else if _1 = "-!" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 45001 "parsing/parser.ml" +# 45905 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45016,20 +45920,20 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 675 "parsing/parser.mly" +# 729 "parsing/parser.mly" (string) -# 45022 "parsing/parser.ml" +# 45926 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.variance * Asttypes.injectivity) = let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 2961 "parsing/parser.mly" +# 3041 "parsing/parser.mly" ( if _1 = "!+" then Covariant, Injective else if _1 = "!-" then Contravariant, Injective else expecting _loc__1_ "type_variance" ) -# 45033 "parsing/parser.ml" +# 45937 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45058,48 +45962,44 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_xss_ in let _endpos = _endpos__2_ in - let _v : ( -# 787 "parsing/parser.mly" - (Parsetree.toplevel_phrase list) -# 45065 "parsing/parser.ml" - ) = let _1 = + let _v : (Parsetree.toplevel_phrase list) = let _1 = let _1 = let ys = # 260 "" ( List.flatten xss ) -# 45071 "parsing/parser.ml" +# 45971 "parsing/parser.ml" in let xs = let _1 = -# 887 "parsing/parser.mly" +# 953 "parsing/parser.mly" ( [] ) -# 45077 "parsing/parser.ml" +# 45977 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1185 "parsing/parser.mly" ( _1 ) -# 45082 "parsing/parser.ml" +# 45982 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 45088 "parsing/parser.ml" +# 45988 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_xss_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 813 "parsing/parser.mly" +# 879 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 45097 "parsing/parser.ml" +# 45997 "parsing/parser.ml" in -# 1110 "parsing/parser.mly" +# 1178 "parsing/parser.mly" ( _1 ) -# 45103 "parsing/parser.ml" +# 46003 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45142,16 +46042,12 @@ module Tables = struct let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos_e_ in let _endpos = _endpos__2_ in - let _v : ( -# 787 "parsing/parser.mly" - (Parsetree.toplevel_phrase list) -# 45149 "parsing/parser.ml" - ) = let _1 = + let _v : (Parsetree.toplevel_phrase list) = let _1 = let _1 = let ys = # 260 "" ( List.flatten xss ) -# 45155 "parsing/parser.ml" +# 46051 "parsing/parser.ml" in let xs = let _1 = @@ -45159,61 +46055,61 @@ module Tables = struct let _1 = let _1 = let attrs = -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 45165 "parsing/parser.ml" +# 46061 "parsing/parser.ml" in -# 1308 "parsing/parser.mly" +# 1379 "parsing/parser.mly" ( mkstrexp e attrs ) -# 45170 "parsing/parser.ml" +# 46066 "parsing/parser.ml" in -# 831 "parsing/parser.mly" +# 897 "parsing/parser.mly" ( Ptop_def [_1] ) -# 45176 "parsing/parser.ml" +# 46072 "parsing/parser.ml" in let _startpos__1_ = _startpos_e_ in let _startpos = _startpos__1_ in -# 829 "parsing/parser.mly" +# 895 "parsing/parser.mly" ( text_def _startpos @ [_1] ) -# 45184 "parsing/parser.ml" +# 46080 "parsing/parser.ml" in -# 889 "parsing/parser.mly" +# 955 "parsing/parser.mly" ( x ) -# 45190 "parsing/parser.ml" +# 46086 "parsing/parser.ml" in -# 1117 "parsing/parser.mly" +# 1185 "parsing/parser.mly" ( _1 ) -# 45196 "parsing/parser.ml" +# 46092 "parsing/parser.ml" in # 267 "" ( xs @ ys ) -# 45202 "parsing/parser.ml" +# 46098 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos_xss_, _startpos_e_) in let _endpos = _endpos__1_ in let _startpos = _startpos__1_ in -# 813 "parsing/parser.mly" +# 879 "parsing/parser.mly" ( extra_def _startpos _endpos _1 ) -# 45211 "parsing/parser.ml" +# 46107 "parsing/parser.ml" in -# 1110 "parsing/parser.mly" +# 1178 "parsing/parser.mly" ( _1 ) -# 45217 "parsing/parser.ml" +# 46113 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45250,9 +46146,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__3_ in let _v : (Asttypes.label) = -# 3435 "parsing/parser.mly" +# 3519 "parsing/parser.mly" ( _2 ) -# 45256 "parsing/parser.ml" +# 46152 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45291,9 +46187,9 @@ module Tables = struct let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in let _loc__1_ = (_startpos__1_, _endpos__1_) in -# 3436 "parsing/parser.mly" +# 3520 "parsing/parser.mly" ( unclosed "(" _loc__1_ ")" _loc__3_ ) -# 45297 "parsing/parser.ml" +# 46193 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45324,9 +46220,9 @@ module Tables = struct let _endpos = _endpos__2_ in let _v : (Asttypes.label) = let _loc__2_ = (_startpos__2_, _endpos__2_) in -# 3437 "parsing/parser.mly" +# 3521 "parsing/parser.mly" ( expecting _loc__2_ "operator" ) -# 45330 "parsing/parser.ml" +# 46226 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45364,9 +46260,9 @@ module Tables = struct let _endpos = _endpos__3_ in let _v : (Asttypes.label) = let _loc__3_ = (_startpos__3_, _endpos__3_) in -# 3438 "parsing/parser.mly" +# 3522 "parsing/parser.mly" ( expecting _loc__3_ "module-expr" ) -# 45370 "parsing/parser.ml" +# 46266 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45385,17 +46281,17 @@ module Tables = struct MenhirLib.EngineTypes.next = _menhir_stack; } = _menhir_stack in let _1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 45391 "parsing/parser.ml" +# 46287 "parsing/parser.ml" ) = Obj.magic _1 in let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3441 "parsing/parser.mly" +# 3525 "parsing/parser.mly" ( _1 ) -# 45399 "parsing/parser.ml" +# 46295 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45418,9 +46314,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.label) = -# 3442 "parsing/parser.mly" +# 3526 "parsing/parser.mly" ( _1 ) -# 45424 "parsing/parser.ml" +# 46320 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45443,9 +46339,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Longident.t) = -# 3510 "parsing/parser.mly" +# 3594 "parsing/parser.mly" ( _1 ) -# 45449 "parsing/parser.ml" +# 46345 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45490,9 +46386,9 @@ module Tables = struct let ty : (Parsetree.core_type) = Obj.magic ty in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 45496 "parsing/parser.ml" +# 46392 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let mutable_ : (Asttypes.mutable_flag) = Obj.magic mutable_ in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -45504,33 +46400,33 @@ module Tables = struct Parsetree.attributes) = let label = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 45510 "parsing/parser.ml" +# 46406 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45518 "parsing/parser.ml" +# 46414 "parsing/parser.ml" in let attrs = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 45524 "parsing/parser.ml" +# 46420 "parsing/parser.ml" in let _1 = -# 3646 "parsing/parser.mly" +# 3734 "parsing/parser.mly" ( Fresh ) -# 45529 "parsing/parser.ml" +# 46425 "parsing/parser.ml" in -# 1861 "parsing/parser.mly" +# 1951 "parsing/parser.mly" ( (label, mutable_, Cfk_virtual ty), attrs ) -# 45534 "parsing/parser.ml" +# 46430 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45575,9 +46471,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 45581 "parsing/parser.ml" +# 46477 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -45589,33 +46485,33 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 45595 "parsing/parser.ml" +# 46491 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45603 "parsing/parser.ml" +# 46499 "parsing/parser.ml" in let _2 = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 45609 "parsing/parser.ml" +# 46505 "parsing/parser.ml" in let _1 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 45614 "parsing/parser.ml" +# 46510 "parsing/parser.ml" in -# 1863 "parsing/parser.mly" +# 1953 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 45619 "parsing/parser.ml" +# 46515 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45666,9 +46562,9 @@ module Tables = struct let _6 : (Parsetree.expression) = Obj.magic _6 in let _5 : unit = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 45672 "parsing/parser.ml" +# 46568 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -45681,36 +46577,36 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 45687 "parsing/parser.ml" +# 46583 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45695 "parsing/parser.ml" +# 46591 "parsing/parser.ml" in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 45703 "parsing/parser.ml" +# 46599 "parsing/parser.ml" in let _1 = -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 45709 "parsing/parser.ml" +# 46605 "parsing/parser.ml" in -# 1863 "parsing/parser.mly" +# 1953 "parsing/parser.mly" ( (_4, _3, Cfk_concrete (_1, _6)), _2 ) -# 45714 "parsing/parser.ml" +# 46610 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45762,9 +46658,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _5 in let _1_inlined1 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 45768 "parsing/parser.ml" +# 46664 "parsing/parser.ml" ) = Obj.magic _1_inlined1 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1 : (Parsetree.attributes) = Obj.magic _1 in @@ -45776,30 +46672,30 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 45782 "parsing/parser.ml" +# 46678 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45790 "parsing/parser.ml" +# 46686 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined1_ in let _2 = -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 45797 "parsing/parser.ml" +# 46693 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_, _startpos__1_) in let _1 = -# 3649 "parsing/parser.mly" +# 3737 "parsing/parser.mly" ( Fresh ) -# 45803 "parsing/parser.ml" +# 46699 "parsing/parser.ml" in let (_endpos__1_, _startpos__1_) = (_endpos__0_, _endpos__0_) in let _endpos = _endpos__7_ in @@ -45815,11 +46711,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1866 "parsing/parser.mly" +# 1956 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 45823 "parsing/parser.ml" +# 46719 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -45877,9 +46773,9 @@ module Tables = struct let _6 : unit = Obj.magic _6 in let _5 : (Parsetree.core_type option * Parsetree.core_type option) = Obj.magic _5 in let _1_inlined2 : ( -# 651 "parsing/parser.mly" +# 705 "parsing/parser.mly" (string) -# 45883 "parsing/parser.ml" +# 46779 "parsing/parser.ml" ) = Obj.magic _1_inlined2 in let _3 : (Asttypes.mutable_flag) = Obj.magic _3 in let _1_inlined1 : (Parsetree.attributes) = Obj.magic _1_inlined1 in @@ -45892,33 +46788,33 @@ module Tables = struct Parsetree.attributes) = let _4 = let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined2_, _startpos__1_inlined2_, _1_inlined2) in let _1 = -# 3409 "parsing/parser.mly" +# 3493 "parsing/parser.mly" ( _1 ) -# 45898 "parsing/parser.ml" +# 46794 "parsing/parser.ml" in let _endpos = _endpos__1_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 45906 "parsing/parser.ml" +# 46802 "parsing/parser.ml" in let _startpos__4_ = _startpos__1_inlined2_ in let _2 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 45915 "parsing/parser.ml" +# 46811 "parsing/parser.ml" in let (_endpos__2_, _startpos__2_) = (_endpos__1_inlined1_, _startpos__1_inlined1_) in let _1 = -# 3650 "parsing/parser.mly" +# 3738 "parsing/parser.mly" ( Override ) -# 45922 "parsing/parser.ml" +# 46818 "parsing/parser.ml" in let _endpos = _endpos__7_ in let _symbolstartpos = if _startpos__1_ != _endpos__1_ then @@ -45933,11 +46829,11 @@ module Tables = struct _startpos__4_ in let _sloc = (_symbolstartpos, _endpos) in -# 1866 "parsing/parser.mly" +# 1956 "parsing/parser.mly" ( let e = mkexp_constraint ~loc:_sloc _7 _5 in (_4, _3, Cfk_concrete (_1, e)), _2 ) -# 45941 "parsing/parser.ml" +# 46837 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46004,9 +46900,9 @@ module Tables = struct let _v : (Parsetree.value_description * string Asttypes.loc option) = let attrs2 = let _1 = _1_inlined3 in -# 3743 "parsing/parser.mly" +# 3831 "parsing/parser.mly" ( _1 ) -# 46010 "parsing/parser.ml" +# 46906 "parsing/parser.ml" in let _endpos_attrs2_ = _endpos__1_inlined3_ in @@ -46016,30 +46912,30 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46022 "parsing/parser.ml" +# 46918 "parsing/parser.ml" in let attrs1 = let _1 = _1_inlined1 in -# 3747 "parsing/parser.mly" +# 3835 "parsing/parser.mly" ( _1 ) -# 46030 "parsing/parser.ml" +# 46926 "parsing/parser.ml" in let _endpos = _endpos_attrs2_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 2792 "parsing/parser.mly" +# 2872 "parsing/parser.mly" ( let attrs = attrs1 @ attrs2 in let loc = make_loc _sloc in let docs = symbol_docs _sloc in Val.mk id ty ~attrs ~loc ~docs, ext ) -# 46043 "parsing/parser.ml" +# 46939 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46055,9 +46951,9 @@ module Tables = struct let _startpos = _menhir_stack.MenhirLib.EngineTypes.endp in let _endpos = _startpos in let _v : (Asttypes.virtual_flag) = -# 3610 "parsing/parser.mly" +# 3698 "parsing/parser.mly" ( Concrete ) -# 46061 "parsing/parser.ml" +# 46957 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46080,9 +46976,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.virtual_flag) = -# 3611 "parsing/parser.mly" +# 3699 "parsing/parser.mly" ( Virtual ) -# 46086 "parsing/parser.ml" +# 46982 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46105,9 +47001,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.mutable_flag) = -# 3634 "parsing/parser.mly" +# 3722 "parsing/parser.mly" ( Immutable ) -# 46111 "parsing/parser.ml" +# 47007 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46137,9 +47033,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 3635 "parsing/parser.mly" +# 3723 "parsing/parser.mly" ( Mutable ) -# 46143 "parsing/parser.ml" +# 47039 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46169,9 +47065,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.mutable_flag) = -# 3636 "parsing/parser.mly" +# 3724 "parsing/parser.mly" ( Mutable ) -# 46175 "parsing/parser.ml" +# 47071 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46194,9 +47090,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3641 "parsing/parser.mly" +# 3729 "parsing/parser.mly" ( Public ) -# 46200 "parsing/parser.ml" +# 47096 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46226,9 +47122,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3642 "parsing/parser.mly" +# 3730 "parsing/parser.mly" ( Private ) -# 46232 "parsing/parser.ml" +# 47128 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46258,9 +47154,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3643 "parsing/parser.mly" +# 3731 "parsing/parser.mly" ( Private ) -# 46264 "parsing/parser.ml" +# 47160 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46322,27 +47218,27 @@ module Tables = struct let xs = # 253 "" ( List.rev xs ) -# 46326 "parsing/parser.ml" +# 47222 "parsing/parser.ml" in -# 901 "parsing/parser.mly" +# 967 "parsing/parser.mly" ( xs ) -# 46331 "parsing/parser.ml" +# 47227 "parsing/parser.ml" in -# 2892 "parsing/parser.mly" +# 2972 "parsing/parser.mly" ( _1 ) -# 46337 "parsing/parser.ml" +# 47233 "parsing/parser.ml" in let _endpos__6_ = _endpos_xs_ in let _5 = let _1 = _1_inlined2 in -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 46346 "parsing/parser.ml" +# 47242 "parsing/parser.ml" in let _3 = @@ -46351,16 +47247,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46357 "parsing/parser.ml" +# 47253 "parsing/parser.ml" in let _endpos = _endpos__6_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3128 "parsing/parser.mly" +# 3208 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_type (_3, @@ -46370,7 +47266,7 @@ module Tables = struct ~manifest:_5 ~priv:_4 ~loc:(make_loc _sloc))) ) -# 46374 "parsing/parser.ml" +# 47270 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46423,9 +47319,9 @@ module Tables = struct let _v : (Parsetree.with_constraint) = let _5 = let _1 = _1_inlined2 in -# 3205 "parsing/parser.mly" +# 3289 "parsing/parser.mly" ( _1 ) -# 46429 "parsing/parser.ml" +# 47325 "parsing/parser.ml" in let _endpos__5_ = _endpos__1_inlined2_ in @@ -46435,16 +47331,16 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46441 "parsing/parser.ml" +# 47337 "parsing/parser.ml" in let _endpos = _endpos__5_ in let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 3141 "parsing/parser.mly" +# 3221 "parsing/parser.mly" ( let lident = loc_last _3 in Pwith_typesubst (_3, @@ -46452,7 +47348,7 @@ module Tables = struct ~params:_2 ~manifest:_5 ~loc:(make_loc _sloc))) ) -# 46456 "parsing/parser.ml" +# 47352 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46501,9 +47397,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46507 "parsing/parser.ml" +# 47403 "parsing/parser.ml" in let _2 = @@ -46512,15 +47408,15 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46518 "parsing/parser.ml" +# 47414 "parsing/parser.ml" in -# 3149 "parsing/parser.mly" +# 3229 "parsing/parser.mly" ( Pwith_module (_2, _4) ) -# 46524 "parsing/parser.ml" +# 47420 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46569,9 +47465,9 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46575 "parsing/parser.ml" +# 47471 "parsing/parser.ml" in let _2 = @@ -46580,15 +47476,143 @@ module Tables = struct let _symbolstartpos = _startpos__1_ in let _sloc = (_symbolstartpos, _endpos) in -# 817 "parsing/parser.mly" +# 883 "parsing/parser.mly" ( mkrhs _1 _sloc ) -# 46586 "parsing/parser.ml" +# 47482 "parsing/parser.ml" in -# 3151 "parsing/parser.mly" +# 3231 "parsing/parser.mly" ( Pwith_modsubst (_2, _4) ) -# 46592 "parsing/parser.ml" +# 47488 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = rhs; + MenhirLib.EngineTypes.startp = _startpos_rhs_; + MenhirLib.EngineTypes.endp = _endpos_rhs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let rhs : (Parsetree.module_type) = Obj.magic rhs in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_rhs_ in + let _v : (Parsetree.with_constraint) = let l = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 883 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 47546 "parsing/parser.ml" + + in + +# 3233 "parsing/parser.mly" + ( Pwith_modtype (l, rhs) ) +# 47552 "parsing/parser.ml" + in + { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = Obj.repr _v; + MenhirLib.EngineTypes.startp = _startpos; + MenhirLib.EngineTypes.endp = _endpos; + MenhirLib.EngineTypes.next = _menhir_stack; + }); + (fun _menhir_env -> + let _menhir_stack = _menhir_env.MenhirLib.EngineTypes.stack in + let { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = rhs; + MenhirLib.EngineTypes.startp = _startpos_rhs_; + MenhirLib.EngineTypes.endp = _endpos_rhs_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _4; + MenhirLib.EngineTypes.startp = _startpos__4_; + MenhirLib.EngineTypes.endp = _endpos__4_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _1_inlined1; + MenhirLib.EngineTypes.startp = _startpos__1_inlined1_; + MenhirLib.EngineTypes.endp = _endpos__1_inlined1_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _; + MenhirLib.EngineTypes.semv = _2; + MenhirLib.EngineTypes.startp = _startpos__2_; + MenhirLib.EngineTypes.endp = _endpos__2_; + MenhirLib.EngineTypes.next = { + MenhirLib.EngineTypes.state = _menhir_s; + MenhirLib.EngineTypes.semv = _1; + MenhirLib.EngineTypes.startp = _startpos__1_; + MenhirLib.EngineTypes.endp = _endpos__1_; + MenhirLib.EngineTypes.next = _menhir_stack; + }; + }; + }; + }; + } = _menhir_stack in + let rhs : (Parsetree.module_type) = Obj.magic rhs in + let _4 : unit = Obj.magic _4 in + let _1_inlined1 : (Longident.t) = Obj.magic _1_inlined1 in + let _2 : unit = Obj.magic _2 in + let _1 : unit = Obj.magic _1 in + let _endpos__0_ = _menhir_stack.MenhirLib.EngineTypes.endp in + let _startpos = _startpos__1_ in + let _endpos = _endpos_rhs_ in + let _v : (Parsetree.with_constraint) = let l = + let (_endpos__1_, _startpos__1_, _1) = (_endpos__1_inlined1_, _startpos__1_inlined1_, _1_inlined1) in + let _endpos = _endpos__1_ in + let _symbolstartpos = _startpos__1_ in + let _sloc = (_symbolstartpos, _endpos) in + +# 883 "parsing/parser.mly" + ( mkrhs _1 _sloc ) +# 47610 "parsing/parser.ml" + + in + +# 3235 "parsing/parser.mly" + ( Pwith_modtypesubst (l, rhs) ) +# 47616 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46611,9 +47635,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__1_ in let _v : (Asttypes.private_flag) = -# 3154 "parsing/parser.mly" +# 3238 "parsing/parser.mly" ( Public ) -# 46617 "parsing/parser.ml" +# 47641 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46643,9 +47667,9 @@ module Tables = struct let _startpos = _startpos__1_ in let _endpos = _endpos__2_ in let _v : (Asttypes.private_flag) = -# 3155 "parsing/parser.mly" +# 3239 "parsing/parser.mly" ( Private ) -# 46649 "parsing/parser.ml" +# 47673 "parsing/parser.ml" in { MenhirLib.EngineTypes.state = _menhir_s; @@ -46673,222 +47697,118 @@ end let use_file = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1809 lexer lexbuf) : ( -# 787 "parsing/parser.mly" - (Parsetree.toplevel_phrase list) -# 46680 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1828 lexer lexbuf) : (Parsetree.toplevel_phrase list)) and toplevel_phrase = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1789 lexer lexbuf) : ( -# 785 "parsing/parser.mly" - (Parsetree.toplevel_phrase) -# 46688 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1808 lexer lexbuf) : (Parsetree.toplevel_phrase)) and parse_val_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1783 lexer lexbuf) : ( -# 797 "parsing/parser.mly" - (Longident.t) -# 46696 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1802 lexer lexbuf) : (Longident.t)) and parse_pattern = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1779 lexer lexbuf) : ( -# 793 "parsing/parser.mly" - (Parsetree.pattern) -# 46704 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1798 lexer lexbuf) : (Parsetree.pattern)) and parse_mty_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1775 lexer lexbuf) : ( -# 799 "parsing/parser.mly" - (Longident.t) -# 46712 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1794 lexer lexbuf) : (Longident.t)) and parse_mod_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1771 lexer lexbuf) : ( -# 803 "parsing/parser.mly" - (Longident.t) -# 46720 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1790 lexer lexbuf) : (Longident.t)) and parse_mod_ext_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1767 lexer lexbuf) : ( -# 801 "parsing/parser.mly" - (Longident.t) -# 46728 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1786 lexer lexbuf) : (Longident.t)) and parse_expression = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1763 lexer lexbuf) : ( -# 791 "parsing/parser.mly" - (Parsetree.expression) -# 46736 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1782 lexer lexbuf) : (Parsetree.expression)) and parse_core_type = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1759 lexer lexbuf) : ( -# 789 "parsing/parser.mly" - (Parsetree.core_type) -# 46744 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1778 lexer lexbuf) : (Parsetree.core_type)) and parse_constr_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1755 lexer lexbuf) : ( -# 795 "parsing/parser.mly" - (Longident.t) -# 46752 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1774 lexer lexbuf) : (Longident.t)) and parse_any_longident = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1737 lexer lexbuf) : ( -# 805 "parsing/parser.mly" - (Longident.t) -# 46760 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1756 lexer lexbuf) : (Longident.t)) and interface = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 1733 lexer lexbuf) : ( -# 783 "parsing/parser.mly" - (Parsetree.signature) -# 46768 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 1752 lexer lexbuf) : (Parsetree.signature)) and implementation = fun lexer lexbuf -> - (Obj.magic (MenhirInterpreter.entry 0 lexer lexbuf) : ( -# 781 "parsing/parser.mly" - (Parsetree.structure) -# 46776 "parsing/parser.ml" - )) + (Obj.magic (MenhirInterpreter.entry `Simplified 0 lexer lexbuf) : (Parsetree.structure)) module Incremental = struct let use_file = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1809 initial_position) : ( -# 787 "parsing/parser.mly" - (Parsetree.toplevel_phrase list) -# 46786 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1828 initial_position) : (Parsetree.toplevel_phrase list) MenhirInterpreter.checkpoint) and toplevel_phrase = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1789 initial_position) : ( -# 785 "parsing/parser.mly" - (Parsetree.toplevel_phrase) -# 46794 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1808 initial_position) : (Parsetree.toplevel_phrase) MenhirInterpreter.checkpoint) and parse_val_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1783 initial_position) : ( -# 797 "parsing/parser.mly" - (Longident.t) -# 46802 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1802 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_pattern = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1779 initial_position) : ( -# 793 "parsing/parser.mly" - (Parsetree.pattern) -# 46810 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1798 initial_position) : (Parsetree.pattern) MenhirInterpreter.checkpoint) and parse_mty_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1775 initial_position) : ( -# 799 "parsing/parser.mly" - (Longident.t) -# 46818 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1794 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_mod_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1771 initial_position) : ( -# 803 "parsing/parser.mly" - (Longident.t) -# 46826 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1790 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_mod_ext_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1767 initial_position) : ( -# 801 "parsing/parser.mly" - (Longident.t) -# 46834 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1786 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_expression = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1763 initial_position) : ( -# 791 "parsing/parser.mly" - (Parsetree.expression) -# 46842 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1782 initial_position) : (Parsetree.expression) MenhirInterpreter.checkpoint) and parse_core_type = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1759 initial_position) : ( -# 789 "parsing/parser.mly" - (Parsetree.core_type) -# 46850 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1778 initial_position) : (Parsetree.core_type) MenhirInterpreter.checkpoint) and parse_constr_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1755 initial_position) : ( -# 795 "parsing/parser.mly" - (Longident.t) -# 46858 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1774 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and parse_any_longident = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1737 initial_position) : ( -# 805 "parsing/parser.mly" - (Longident.t) -# 46866 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1756 initial_position) : (Longident.t) MenhirInterpreter.checkpoint) and interface = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 1733 initial_position) : ( -# 783 "parsing/parser.mly" - (Parsetree.signature) -# 46874 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 1752 initial_position) : (Parsetree.signature) MenhirInterpreter.checkpoint) and implementation = fun initial_position -> - (Obj.magic (MenhirInterpreter.start 0 initial_position) : ( -# 781 "parsing/parser.mly" - (Parsetree.structure) -# 46882 "parsing/parser.ml" - ) MenhirInterpreter.checkpoint) + (Obj.magic (MenhirInterpreter.start 0 initial_position) : (Parsetree.structure) MenhirInterpreter.checkpoint) end -# 3777 "parsing/parser.mly" +# 3867 "parsing/parser.mly" -# 46890 "parsing/parser.ml" +# 47810 "parsing/parser.ml" # 269 "" -# 46895 "parsing/parser.ml" +# 47815 "parsing/parser.ml" diff --git a/boot/ocamlc b/boot/ocamlc index f7592f19..7874a890 100755 Binary files a/boot/ocamlc and b/boot/ocamlc differ diff --git a/boot/ocamllex b/boot/ocamllex index 175a81ea..5a3705cb 100755 Binary files a/boot/ocamllex and b/boot/ocamllex differ diff --git a/build-aux/ax_pthread.m4 b/build-aux/ax_pthread.m4 index 5fbf9fe0..1598d077 100644 --- a/build-aux/ax_pthread.m4 +++ b/build-aux/ax_pthread.m4 @@ -55,6 +55,7 @@ # # Copyright (c) 2008 Steven G. Johnson # Copyright (c) 2011 Daniel Richard G. +# Copyright (c) 2019 Marc Stevens # # This program is free software: you can redistribute it and/or modify it # under the terms of the GNU General Public License as published by the @@ -82,7 +83,7 @@ # modified version of the Autoconf Macro, you may extend this special # exception to the GPL to apply to your modified version as well. -#serial 24 +#serial 27 AU_ALIAS([ACX_PTHREAD], [AX_PTHREAD]) AC_DEFUN([AX_PTHREAD], [ @@ -123,10 +124,12 @@ fi # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" @@ -194,14 +197,47 @@ case $host_os in # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). - ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac +# Are we compiling with Clang? + +AC_CACHE_CHECK([whether $CC is Clang], + [ax_cv_PTHREAD_CLANG], + [ax_cv_PTHREAD_CLANG=no + # Note that Autoconf sets GCC=yes for Clang as well as GCC + if test "x$GCC" = "xyes"; then + AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], + [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ +# if defined(__clang__) && defined(__llvm__) + AX_PTHREAD_CC_IS_CLANG +# endif + ], + [ax_cv_PTHREAD_CLANG=yes]) + fi + ]) +ax_pthread_clang="$ax_cv_PTHREAD_CLANG" + + # GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC + AS_IF([test "x$GCC" = "xyes"], - [ax_pthread_flags="-pthread -pthreads $ax_pthread_flags"]) + [ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags"]) + +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first + +AS_IF([test "x$ax_pthread_clang" = "xyes"], + [ax_pthread_flags="-pthread,-lpthread -pthread"]) + # The presence of a feature test macro requesting re-entrant function # definitions is, on some systems, a strong hint that pthreads support is @@ -224,25 +260,86 @@ AS_IF([test "x$ax_pthread_check_macro" = "x--"], [ax_pthread_check_cond=0], [ax_pthread_check_cond="!defined($ax_pthread_check_macro)"]) -# Are we compiling with Clang? -AC_CACHE_CHECK([whether $CC is Clang], - [ax_cv_PTHREAD_CLANG], - [ax_cv_PTHREAD_CLANG=no - # Note that Autoconf sets GCC=yes for Clang as well as GCC - if test "x$GCC" = "xyes"; then - AC_EGREP_CPP([AX_PTHREAD_CC_IS_CLANG], - [/* Note: Clang 2.7 lacks __clang_[a-z]+__ */ -# if defined(__clang__) && defined(__llvm__) - AX_PTHREAD_CC_IS_CLANG -# endif - ], - [ax_cv_PTHREAD_CLANG=yes]) - fi - ]) -ax_pthread_clang="$ax_cv_PTHREAD_CLANG" +if test "x$ax_pthread_ok" = "xno"; then +for ax_pthread_try_flag in $ax_pthread_flags; do + + case $ax_pthread_try_flag in + none) + AC_MSG_CHECKING([whether pthreads work without any flags]) + ;; + + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + AC_MSG_CHECKING([whether pthreads work with "$PTHREAD_CFLAGS" and "$PTHREAD_LIBS"]) + ;; + + -*) + AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) + PTHREAD_CFLAGS="$ax_pthread_try_flag" + ;; + + pthread-config) + AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) + AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) + PTHREAD_CFLAGS="`pthread-config --cflags`" + PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" + ;; + + *) + AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) + PTHREAD_LIBS="-l$ax_pthread_try_flag" + ;; + esac + + ax_pthread_save_CFLAGS="$CFLAGS" + ax_pthread_save_LIBS="$LIBS" + CFLAGS="$CFLAGS $PTHREAD_CFLAGS" + LIBS="$PTHREAD_LIBS $LIBS" + + # Check for various functions. We must include pthread.h, + # since some functions may be macros. (On the Sequent, we + # need a special flag -Kthread to make this header compile.) + # We check for pthread_join because it is in -lpthread on IRIX + # while pthread_create is in libc. We check for pthread_attr_init + # due to DEC craziness with -lpthreads. We check for + # pthread_cleanup_push because it is one of the few pthread + # functions on Solaris that doesn't have a non-functional libc stub. + # We try pthread_create on general principles. + + AC_LINK_IFELSE([AC_LANG_PROGRAM([#include +# if $ax_pthread_check_cond +# error "$ax_pthread_check_macro must be defined" +# endif + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } + static void *start_routine(void *a) { return a; }], + [pthread_t th; pthread_attr_t attr; + pthread_create(&th, 0, start_routine, 0); + pthread_join(th, 0); + pthread_attr_init(&attr); + pthread_cleanup_push(routine, 0); + pthread_cleanup_pop(0) /* ; */])], + [ax_pthread_ok=yes], + []) + + CFLAGS="$ax_pthread_save_CFLAGS" + LIBS="$ax_pthread_save_LIBS" + + AC_MSG_RESULT([$ax_pthread_ok]) + AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) + + PTHREAD_LIBS="" + PTHREAD_CFLAGS="" +done +fi -ax_pthread_clang_warning=no # Clang needs special handling, because older versions handle the -pthread # option in a rather... idiosyncratic way @@ -261,11 +358,6 @@ if test "x$ax_pthread_clang" = "xyes"; then # -pthread does define _REENTRANT, and while the Darwin headers # ignore this macro, third-party headers might not.) - PTHREAD_CFLAGS="-pthread" - PTHREAD_LIBS= - - ax_pthread_ok=yes - # However, older versions of Clang make a point of warning the user # that, in an invocation where only linking and no compilation is # taking place, the -pthread option has no effect ("argument unused @@ -320,78 +412,7 @@ if test "x$ax_pthread_clang" = "xyes"; then fi # $ax_pthread_clang = yes -if test "x$ax_pthread_ok" = "xno"; then -for ax_pthread_try_flag in $ax_pthread_flags; do - - case $ax_pthread_try_flag in - none) - AC_MSG_CHECKING([whether pthreads work without any flags]) - ;; - - -mt,pthread) - AC_MSG_CHECKING([whether pthreads work with -mt -lpthread]) - PTHREAD_CFLAGS="-mt" - PTHREAD_LIBS="-lpthread" - ;; - - -*) - AC_MSG_CHECKING([whether pthreads work with $ax_pthread_try_flag]) - PTHREAD_CFLAGS="$ax_pthread_try_flag" - ;; - - pthread-config) - AC_CHECK_PROG([ax_pthread_config], [pthread-config], [yes], [no]) - AS_IF([test "x$ax_pthread_config" = "xno"], [continue]) - PTHREAD_CFLAGS="`pthread-config --cflags`" - PTHREAD_LIBS="`pthread-config --ldflags` `pthread-config --libs`" - ;; - *) - AC_MSG_CHECKING([for the pthreads library -l$ax_pthread_try_flag]) - PTHREAD_LIBS="-l$ax_pthread_try_flag" - ;; - esac - - ax_pthread_save_CFLAGS="$CFLAGS" - ax_pthread_save_LIBS="$LIBS" - CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$PTHREAD_LIBS $LIBS" - - # Check for various functions. We must include pthread.h, - # since some functions may be macros. (On the Sequent, we - # need a special flag -Kthread to make this header compile.) - # We check for pthread_join because it is in -lpthread on IRIX - # while pthread_create is in libc. We check for pthread_attr_init - # due to DEC craziness with -lpthreads. We check for - # pthread_cleanup_push because it is one of the few pthread - # functions on Solaris that doesn't have a non-functional libc stub. - # We try pthread_create on general principles. - - AC_LINK_IFELSE([AC_LANG_PROGRAM([#include -# if $ax_pthread_check_cond -# error "$ax_pthread_check_macro must be defined" -# endif - static void routine(void *a) { a = 0; } - static void *start_routine(void *a) { return a; }], - [pthread_t th; pthread_attr_t attr; - pthread_create(&th, 0, start_routine, 0); - pthread_join(th, 0); - pthread_attr_init(&attr); - pthread_cleanup_push(routine, 0); - pthread_cleanup_pop(0) /* ; */])], - [ax_pthread_ok=yes], - []) - - CFLAGS="$ax_pthread_save_CFLAGS" - LIBS="$ax_pthread_save_LIBS" - - AC_MSG_RESULT([$ax_pthread_ok]) - AS_IF([test "x$ax_pthread_ok" = "xyes"], [break]) - - PTHREAD_LIBS="" - PTHREAD_CFLAGS="" -done -fi # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then @@ -438,7 +459,8 @@ if test "x$ax_pthread_ok" = "xyes"; then AC_CACHE_CHECK([for PTHREAD_PRIO_INHERIT], [ax_cv_PTHREAD_PRIO_INHERIT], [AC_LINK_IFELSE([AC_LANG_PROGRAM([[#include ]], - [[int i = PTHREAD_PRIO_INHERIT;]])], + [[int i = PTHREAD_PRIO_INHERIT; + return i;]])], [ax_cv_PTHREAD_PRIO_INHERIT=yes], [ax_cv_PTHREAD_PRIO_INHERIT=no]) ]) diff --git a/bytecomp/bytegen.ml b/bytecomp/bytegen.ml index 49314565..9a153355 100644 --- a/bytecomp/bytegen.ml +++ b/bytecomp/bytegen.ml @@ -109,7 +109,7 @@ let rec is_tailcall = function from the tail call optimization? *) let preserve_tailcall_for_prim = function - Pidentity | Popaque | Pdirapply | Prevapply | Psequor | Psequand -> + | Popaque | Psequor | Psequand -> true | Pbytes_to_string | Pbytes_of_string | Pignore | Pgetglobal _ | Psetglobal _ | Pmakeblock _ | Pfield _ | Pfield_computed | Psetfield _ @@ -524,7 +524,7 @@ module Storer = let rec comp_expr env exp sz cont = if sz > !max_stack_used then max_stack_used := sz; match exp with - Lvar id -> + Lvar id | Lmutvar id -> begin try let pos = Ident.find_same id env.ce_stack in Kacc(sz - pos) :: cont @@ -560,7 +560,7 @@ let rec comp_expr env exp sz cont = end end | Lsend(kind, met, obj, args, _) -> - let args = if kind = Cached then List.tl args else args in + assert (kind <> Cached); let nargs = List.length args + 1 in let getmethod, args' = if kind = Self then (Kgetmethod, met::obj::args) else @@ -591,7 +591,8 @@ let rec comp_expr env exp sz cont = Stack.push to_compile functions_to_compile; comp_args env (List.map (fun n -> Lvar n) fv) sz (Kclosure(lbl, List.length fv) :: cont) - | Llet(_str, _k, id, arg, body) -> + | Llet(_, _k, id, arg, body) + | Lmutlet(_k, id, arg, body) -> comp_expr env arg sz (Kpush :: comp_expr (add_var id (sz+1) env) body (sz+1) (add_pop 1 cont)) @@ -670,21 +671,10 @@ let rec comp_expr env exp sz cont = in comp_init env sz decl_size end - | Lprim((Pidentity | Popaque), [arg], _) -> + | Lprim(Popaque, [arg], _) -> comp_expr env arg sz cont | Lprim(Pignore, [arg], _) -> comp_expr env arg sz (add_const_unit cont) - | Lprim(Pdirapply, [func;arg], loc) - | Lprim(Prevapply, [arg;func], loc) -> - let exp = Lapply{ - ap_loc=loc; - ap_func=func; - ap_args=[arg]; - ap_tailcall=Default_tailcall; - ap_inlined=Default_inline; - ap_specialised=Default_specialise; - } in - comp_expr env exp sz cont | Lprim(Pnot, [arg], _) -> let newcont = match cont with diff --git a/bytecomp/bytelink.ml b/bytecomp/bytelink.ml index fd5bd490..d8423e54 100644 --- a/bytecomp/bytelink.ml +++ b/bytecomp/bytelink.ml @@ -30,6 +30,7 @@ type error = | Cannot_open_dll of filepath | Required_module_unavailable of modname * modname | Camlheader of string * filepath + | Wrong_link_order of (modname * modname) list exception Error of error @@ -87,6 +88,8 @@ let add_ccobjs origin l = (* First pass: determine which units are needed *) let missing_globals = ref Ident.Map.empty +let provided_globals = ref Ident.Set.empty +let badly_ordered_dependencies : (string * string) list ref = ref [] let is_required (rel, _pos) = match rel with @@ -96,6 +99,9 @@ let is_required (rel, _pos) = let add_required compunit = let add id = + if Ident.Set.mem id !provided_globals then + badly_ordered_dependencies := + ((Ident.name id), compunit.cu_name) :: !badly_ordered_dependencies; missing_globals := Ident.Map.add id compunit.cu_name !missing_globals in List.iter add (Symtable.required_globals compunit.cu_reloc); @@ -104,7 +110,8 @@ let add_required compunit = let remove_required (rel, _pos) = match rel with Reloc_setglobal id -> - missing_globals := Ident.Map.remove id !missing_globals + missing_globals := Ident.Map.remove id !missing_globals; + provided_globals := Ident.Set.add id !provided_globals; | _ -> () let scan_file obj_name tolink = @@ -473,7 +480,8 @@ let link_bytecode_as_c tolink outfile with_main = \nextern \"C\" {\ \n#endif\ \n#include \ -\n#include \n"; +\n#include \ +\n#include \n"; output_string outchan "static int caml_code[] = {\n"; Symtable.init(); clear_crc_interfaces (); @@ -516,7 +524,7 @@ let link_bytecode_as_c tolink outfile with_main = \n caml_sections, sizeof(caml_sections),\ \n /* pooling */ 0,\ \n argv);\ -\n caml_sys_exit(Val_int(0));\ +\n caml_do_exit(0);\ \n return 0; /* not reached */\ \n}\n" end else begin @@ -562,7 +570,7 @@ let link_bytecode_as_c tolink outfile with_main = \n}\ \n#endif\n"; ); - if !Clflags.debug then + if not with_main && !Clflags.debug then output_cds_file ((Filename.chop_extension outfile) ^ ".cds") (* Build a custom runtime *) @@ -627,7 +635,11 @@ let link objfiles output_name = match Ident.Map.bindings missing_modules with | [] -> () | (id, cu_name) :: _ -> - raise (Error (Required_module_unavailable (Ident.name id, cu_name))) + match !badly_ordered_dependencies with + | [] -> + raise (Error (Required_module_unavailable (Ident.name id, cu_name))) + | l -> + raise (Error (Wrong_link_order l)) end; Clflags.ccobjs := !Clflags.ccobjs @ !lib_ccobjs; (* put user's libs last *) Clflags.all_ccopts := !lib_ccopts @ !Clflags.all_ccopts; @@ -763,6 +775,12 @@ let report_error ppf = function fprintf ppf "Module `%s' is unavailable (required by `%s')" s m | Camlheader (msg, header) -> fprintf ppf "System error while copying file %s: %s" header msg + | Wrong_link_order l -> + let depends_on ppf (dep, depending) = + fprintf ppf "%s depends on %s" depending dep + in + fprintf ppf "@[Wrong link order: %a@]" + (pp_print_list ~pp_sep:(fun ppf () -> fprintf ppf ",@ ") depends_on) l let () = Location.register_error_of_exn diff --git a/bytecomp/bytelink.mli b/bytecomp/bytelink.mli index 82f851e6..2c8090c3 100644 --- a/bytecomp/bytelink.mli +++ b/bytecomp/bytelink.mli @@ -35,6 +35,7 @@ type error = | Cannot_open_dll of filepath | Required_module_unavailable of modname * modname | Camlheader of string * filepath + | Wrong_link_order of (modname * modname) list exception Error of error diff --git a/compilerlibs/Makefile.compilerlibs b/compilerlibs/Makefile.compilerlibs index 315add7e..fbdff6c8 100644 --- a/compilerlibs/Makefile.compilerlibs +++ b/compilerlibs/Makefile.compilerlibs @@ -24,153 +24,238 @@ # linked in the archive, but they are marked as dependencies to ensure # that they are consistent with the interface digests in the archives. -UTILS=utils/config.cmo utils/build_path_prefix_map.cmo utils/misc.cmo \ - utils/identifiable.cmo utils/numbers.cmo utils/arg_helper.cmo \ - utils/clflags.cmo utils/profile.cmo utils/local_store.cmo \ - utils/load_path.cmo \ - utils/terminfo.cmo utils/ccomp.cmo utils/warnings.cmo \ - utils/consistbl.cmo utils/strongly_connected_components.cmo \ - utils/targetint.cmo utils/int_replace_polymorphic_compare.cmo \ - utils/domainstate.cmo utils/binutils.cmo -UTILS_CMI= - -PARSING=parsing/location.cmo parsing/longident.cmo \ - parsing/docstrings.cmo parsing/syntaxerr.cmo \ +UTILS = \ + utils/config.cmo \ + utils/build_path_prefix_map.cmo \ + utils/misc.cmo \ + utils/identifiable.cmo \ + utils/numbers.cmo \ + utils/arg_helper.cmo \ + utils/clflags.cmo \ + utils/profile.cmo \ + utils/local_store.cmo \ + utils/load_path.cmo \ + utils/terminfo.cmo \ + utils/ccomp.cmo \ + utils/warnings.cmo \ + utils/consistbl.cmo \ + utils/strongly_connected_components.cmo \ + utils/targetint.cmo \ + utils/int_replace_polymorphic_compare.cmo \ + utils/domainstate.cmo \ + utils/binutils.cmo \ + utils/lazy_backtrack.cmo \ + utils/diffing.cmo +UTILS_CMI = + +PARSING = \ + parsing/location.cmo \ + parsing/longident.cmo \ + parsing/docstrings.cmo \ + parsing/syntaxerr.cmo \ parsing/ast_helper.cmo \ parsing/pprintast.cmo \ - parsing/camlinternalMenhirLib.cmo parsing/parser.cmo \ - parsing/lexer.cmo parsing/parse.cmo parsing/printast.cmo \ - parsing/ast_mapper.cmo parsing/ast_iterator.cmo parsing/attr_helper.cmo \ - parsing/builtin_attributes.cmo parsing/ast_invariants.cmo parsing/depend.cmo -PARSING_CMI=\ + parsing/camlinternalMenhirLib.cmo \ + parsing/parser.cmo \ + parsing/lexer.cmo \ + parsing/parse.cmo \ + parsing/printast.cmo \ + parsing/ast_mapper.cmo \ + parsing/ast_iterator.cmo \ + parsing/attr_helper.cmo \ + parsing/builtin_attributes.cmo \ + parsing/ast_invariants.cmo \ + parsing/depend.cmo +PARSING_CMI = \ parsing/asttypes.cmi \ parsing/parsetree.cmi -TYPING=typing/ident.cmo typing/path.cmo \ - typing/primitive.cmo typing/type_immediacy.cmo typing/types.cmo \ - typing/btype.cmo typing/oprint.cmo \ - typing/subst.cmo typing/predef.cmo \ - typing/datarepr.cmo file_formats/cmi_format.cmo \ - typing/persistent_env.cmo typing/env.cmo \ - typing/typedtree.cmo typing/printtyped.cmo typing/ctype.cmo \ - typing/printtyp.cmo typing/includeclass.cmo \ - typing/mtype.cmo typing/envaux.cmo typing/includecore.cmo \ - typing/tast_iterator.cmo typing/tast_mapper.cmo typing/stypes.cmo \ - file_formats/cmt_format.cmo typing/cmt2annot.cmo typing/untypeast.cmo \ - typing/includemod.cmo typing/typetexp.cmo typing/printpat.cmo \ - typing/patterns.cmo typing/parmatch.cmo \ - typing/typedecl_properties.cmo typing/typedecl_variance.cmo \ - typing/typedecl_unboxed.cmo typing/typedecl_immediacy.cmo \ +TYPING = \ + typing/ident.cmo \ + typing/path.cmo \ + typing/primitive.cmo \ + typing/type_immediacy.cmo \ + typing/types.cmo \ + typing/btype.cmo \ + typing/oprint.cmo \ + typing/subst.cmo \ + typing/predef.cmo \ + typing/datarepr.cmo \ + file_formats/cmi_format.cmo \ + typing/persistent_env.cmo \ + typing/env.cmo \ + typing/errortrace.cmo \ + typing/typedtree.cmo \ + typing/signature_group.cmo \ + typing/printtyped.cmo \ + typing/ctype.cmo \ + typing/printtyp.cmo \ + typing/includeclass.cmo \ + typing/mtype.cmo \ + typing/envaux.cmo \ + typing/includecore.cmo \ + typing/tast_iterator.cmo \ + typing/tast_mapper.cmo \ + typing/stypes.cmo \ + file_formats/cmt_format.cmo \ + typing/cmt2annot.cmo \ + typing/untypeast.cmo \ + typing/includemod.cmo \ + typing/includemod_errorprinter.cmo \ + typing/typetexp.cmo \ + typing/printpat.cmo \ + typing/patterns.cmo \ + typing/parmatch.cmo \ + typing/typedecl_properties.cmo \ + typing/typedecl_variance.cmo \ + typing/typedecl_unboxed.cmo \ + typing/typedecl_immediacy.cmo \ typing/typedecl_separability.cmo \ - typing/typedecl.cmo typing/typeopt.cmo \ - typing/rec_check.cmo typing/typecore.cmo typing/typeclass.cmo \ + typing/typedecl.cmo \ + typing/typeopt.cmo \ + typing/rec_check.cmo \ + typing/typecore.cmo \ + typing/typeclass.cmo \ typing/typemod.cmo -TYPING_CMI=\ +TYPING_CMI = \ typing/annot.cmi \ typing/outcometree.cmi -LAMBDA=lambda/debuginfo.cmo \ - lambda/lambda.cmo lambda/printlambda.cmo \ - lambda/switch.cmo lambda/matching.cmo \ - lambda/translobj.cmo lambda/translattribute.cmo \ - lambda/translprim.cmo lambda/translcore.cmo \ - lambda/translclass.cmo lambda/translmod.cmo \ - lambda/simplif.cmo lambda/runtimedef.cmo -LAMBDA_CMI= - -COMP=\ - bytecomp/meta.cmo bytecomp/opcodes.cmo \ - bytecomp/bytesections.cmo bytecomp/dll.cmo \ +LAMBDA = \ + lambda/debuginfo.cmo \ + lambda/lambda.cmo \ + lambda/printlambda.cmo \ + lambda/switch.cmo \ + lambda/matching.cmo \ + lambda/translobj.cmo \ + lambda/translattribute.cmo \ + lambda/translprim.cmo \ + lambda/translcore.cmo \ + lambda/translclass.cmo \ + lambda/translmod.cmo \ + lambda/simplif.cmo \ + lambda/runtimedef.cmo +LAMBDA_CMI = + +COMP = \ + bytecomp/meta.cmo \ + bytecomp/opcodes.cmo \ + bytecomp/bytesections.cmo \ + bytecomp/dll.cmo \ bytecomp/symtable.cmo \ - driver/pparse.cmo driver/compenv.cmo \ - driver/main_args.cmo driver/compmisc.cmo \ + driver/pparse.cmo \ + driver/compenv.cmo \ + driver/main_args.cmo \ + driver/compmisc.cmo \ driver/makedepend.cmo \ driver/compile_common.cmo -COMP_CMI=\ +COMP_CMI = \ file_formats/cmo_format.cmi \ file_formats/cmx_format.cmi \ file_formats/cmxs_format.cmi # All file format descriptions (including cmx{,s}) are in the # ocamlcommon library so that ocamlobjinfo can depend on them. -COMMON_CMI=$(UTILS_CMI) $(PARSING_CMI) $(TYPING_CMI) $(LAMBDA_CMI) $(COMP_CMI) +COMMON_CMI = $(UTILS_CMI) $(PARSING_CMI) $(TYPING_CMI) $(LAMBDA_CMI) $(COMP_CMI) -COMMON=$(UTILS) $(PARSING) $(TYPING) $(LAMBDA) $(COMP) +COMMON = $(UTILS) $(PARSING) $(TYPING) $(LAMBDA) $(COMP) -BYTECOMP=bytecomp/instruct.cmo bytecomp/bytegen.cmo \ - bytecomp/printinstr.cmo bytecomp/emitcode.cmo \ - bytecomp/bytelink.cmo bytecomp/bytelibrarian.cmo bytecomp/bytepackager.cmo \ - driver/errors.cmo driver/compile.cmo driver/maindriver.cmo -BYTECOMP_CMI= +BYTECOMP = \ + bytecomp/instruct.cmo \ + bytecomp/bytegen.cmo \ + bytecomp/printinstr.cmo \ + bytecomp/emitcode.cmo \ + bytecomp/bytelink.cmo \ + bytecomp/bytelibrarian.cmo \ + bytecomp/bytepackager.cmo \ + driver/errors.cmo \ + driver/compile.cmo \ + driver/maindriver.cmo +BYTECOMP_CMI = -INTEL_ASM=\ +INTEL_ASM = \ asmcomp/x86_proc.cmo \ asmcomp/x86_dsl.cmo \ asmcomp/x86_gas.cmo \ asmcomp/x86_masm.cmo -INTEL_ASM_CMI=\ +INTEL_ASM_CMI = \ asmcomp/x86_ast.cmi -ARCH_SPECIFIC_ASMCOMP= -ARCH_SPECIFIC_ASMCOMP_CMI= +ARCH_SPECIFIC_ASMCOMP = +ARCH_SPECIFIC_ASMCOMP_CMI = ifeq ($(ARCH),i386) -ARCH_SPECIFIC_ASMCOMP=$(INTEL_ASM) -ARCH_SPECIFIC_ASMCOMP_CMI=$(INTEL_ASM_CMI) +ARCH_SPECIFIC_ASMCOMP = $(INTEL_ASM) +ARCH_SPECIFIC_ASMCOMP_CMI = $(INTEL_ASM_CMI) endif ifeq ($(ARCH),amd64) -ARCH_SPECIFIC_ASMCOMP=$(INTEL_ASM) -ARCH_SPECIFIC_ASMCOMP_CMI=$(INTEL_ASM_CMI) +ARCH_SPECIFIC_ASMCOMP = $(INTEL_ASM) +ARCH_SPECIFIC_ASMCOMP_CMI = $(INTEL_ASM_CMI) endif -ASMCOMP=\ +ASMCOMP = \ $(ARCH_SPECIFIC_ASMCOMP) \ asmcomp/arch.cmo \ - asmcomp/cmm.cmo asmcomp/printcmm.cmo \ - asmcomp/reg.cmo asmcomp/debug/reg_with_debug_info.cmo \ - asmcomp/debug/reg_availability_set.cmo \ - asmcomp/mach.cmo asmcomp/proc.cmo \ + asmcomp/cmm.cmo \ + asmcomp/printcmm.cmo \ + asmcomp/reg.cmo \ + asmcomp/mach.cmo \ + asmcomp/proc.cmo \ asmcomp/afl_instrument.cmo \ asmcomp/strmatch.cmo \ asmcomp/cmmgen_state.cmo \ asmcomp/cmm_helpers.cmo \ asmcomp/cmmgen.cmo \ + asmcomp/cmm_invariants.cmo \ asmcomp/interval.cmo \ - asmcomp/printmach.cmo asmcomp/selectgen.cmo \ + asmcomp/printmach.cmo \ + asmcomp/dataflow.cmo \ + asmcomp/polling.cmo \ + asmcomp/selectgen.cmo \ asmcomp/selection.cmo \ asmcomp/comballoc.cmo \ - asmcomp/CSEgen.cmo asmcomp/CSE.cmo \ + asmcomp/CSEgen.cmo \ + asmcomp/CSE.cmo \ asmcomp/liveness.cmo \ - asmcomp/spill.cmo asmcomp/split.cmo \ - asmcomp/interf.cmo asmcomp/coloring.cmo \ + asmcomp/spill.cmo \ + asmcomp/split.cmo \ + asmcomp/interf.cmo \ + asmcomp/coloring.cmo \ asmcomp/linscan.cmo \ - asmcomp/reloadgen.cmo asmcomp/reload.cmo \ + asmcomp/reloadgen.cmo \ + asmcomp/reload.cmo \ asmcomp/deadcode.cmo \ - asmcomp/linear.cmo asmcomp/printlinear.cmo asmcomp/linearize.cmo \ + asmcomp/linear.cmo \ + asmcomp/printlinear.cmo \ + asmcomp/linearize.cmo \ file_formats/linear_format.cmo \ - asmcomp/debug/available_regs.cmo \ - asmcomp/debug/compute_ranges_intf.cmo \ - asmcomp/debug/compute_ranges.cmo \ - asmcomp/schedgen.cmo asmcomp/scheduling.cmo \ + asmcomp/schedgen.cmo \ + asmcomp/scheduling.cmo \ asmcomp/branch_relaxation_intf.cmo \ asmcomp/branch_relaxation.cmo \ - asmcomp/emitaux.cmo asmcomp/emit.cmo asmcomp/asmgen.cmo \ - asmcomp/asmlink.cmo asmcomp/asmlibrarian.cmo asmcomp/asmpackager.cmo \ - driver/opterrors.cmo driver/optcompile.cmo driver/optmaindriver.cmo -ASMCOMP_CMI=$(ARCH_SPECIFIC_ASMCOMP_CMI) + asmcomp/emitaux.cmo \ + asmcomp/emit.cmo \ + asmcomp/asmgen.cmo \ + asmcomp/asmlink.cmo \ + asmcomp/asmlibrarian.cmo \ + asmcomp/asmpackager.cmo \ + driver/opterrors.cmo \ + driver/optcompile.cmo \ + driver/optmaindriver.cmo +ASMCOMP_CMI = $(ARCH_SPECIFIC_ASMCOMP_CMI) # Files under middle_end/ are not to reference files under asmcomp/. # This ensures that the middle end can be linked (e.g. for objinfo) even when # the native code compiler is not present for some particular target. -MIDDLE_END_CLOSURE=\ +MIDDLE_END_CLOSURE = \ middle_end/closure/closure.cmo \ middle_end/closure/closure_middle_end.cmo -MIDDLE_END_CLOSURE_CMI= +MIDDLE_END_CLOSURE_CMI = # Owing to dependencies through [Compilenv], which would be # difficult to remove, some of the lower parts of Flambda (anything that is # saved in a .cmx file) have to be included in the [MIDDLE_END] stanza, below. -MIDDLE_END_FLAMBDA=\ +MIDDLE_END_FLAMBDA = \ middle_end/flambda/import_approx.cmo \ middle_end/flambda/lift_code.cmo \ middle_end/flambda/closure_conversion_aux.cmo \ @@ -209,11 +294,11 @@ MIDDLE_END_FLAMBDA=\ middle_end/flambda/un_anf.cmo \ middle_end/flambda/flambda_to_clambda.cmo \ middle_end/flambda/flambda_middle_end.cmo -MIDDLE_END_FLAMBDA_CMI=\ +MIDDLE_END_FLAMBDA_CMI = \ middle_end/flambda/inlining_decision_intf.cmi \ middle_end/flambda/simplify_boxed_integer_ops_intf.cmi -MIDDLE_END=\ +MIDDLE_END = \ middle_end/internal_variable_names.cmo \ middle_end/linkage_name.cmo \ middle_end/compilation_unit.cmo \ @@ -253,22 +338,65 @@ MIDDLE_END=\ middle_end/compilenv.cmo \ $(MIDDLE_END_CLOSURE) \ $(MIDDLE_END_FLAMBDA) -MIDDLE_END_CMI=\ +MIDDLE_END_CMI = \ middle_end/backend_intf.cmi \ $(MIDDLE_END_CLOSURE_CMI) \ $(MIDDLE_END_FLAMBDA_CMI) -OPTCOMP=$(MIDDLE_END) $(ASMCOMP) -OPTCOMP_CMI=$(MIDDLE_END_CMI) $(ASMCOMP_CMI) - -TOPLEVEL=toplevel/genprintval.cmo toplevel/toploop.cmo \ - toplevel/trace.cmo toplevel/topdirs.cmo toplevel/topmain.cmo -TOPLEVEL_CMI= - -OPTTOPLEVEL=toplevel/genprintval.cmo toplevel/opttoploop.cmo \ - toplevel/opttopdirs.cmo toplevel/opttopmain.cmo -OPTTOPLEVEL_CMI= +OPTCOMP = $(MIDDLE_END) $(ASMCOMP) +OPTCOMP_CMI = $(MIDDLE_END_CMI) $(ASMCOMP_CMI) + +TOPLEVEL = \ + toplevel/genprintval.cmo \ + toplevel/topcommon.cmo \ + toplevel/byte/topeval.cmo \ + toplevel/byte/trace.cmo \ + toplevel/toploop.cmo \ + toplevel/topdirs.cmo \ + toplevel/byte/topmain.cmo +TOPLEVEL_CMI = \ + toplevel/topcommon.cmi \ + toplevel/byte/topeval.cmi \ + toplevel/byte/trace.cmi \ + toplevel/toploop.cmi \ + toplevel/topdirs.cmi \ + toplevel/byte/topmain.cmi + +OPTTOPLEVEL = \ + toplevel/genprintval.cmo \ + toplevel/topcommon.cmo \ + toplevel/native/topeval.cmo \ + toplevel/native/trace.cmo \ + toplevel/toploop.cmo \ + toplevel/topdirs.cmo \ + toplevel/native/topmain.cmo +OPTTOPLEVEL_CMI = \ + toplevel/topcommon.cmi \ + toplevel/native/topeval.cmi \ + toplevel/native/trace.cmi \ + toplevel/toploop.cmi \ + toplevel/topdirs.cmi \ + toplevel/native/topmain.cmi + +TOPLEVEL_SHARED_MLIS = topeval.mli trace.mli topmain.mli +TOPLEVEL_SHARED_CMIS = $(TOPLEVEL_SHARED_MLIS:%.mli=%.cmi) +TOPLEVEL_SHARED_ARTEFACTS = $(TOPLEVEL_SHARED_MLIS) $(TOPLEVEL_SHARED_CMIS) + +$(addprefix toplevel/byte/, $(TOPLEVEL_SHARED_CMIS)):\ +toplevel/byte/%.cmi: toplevel/%.cmi + cp $< toplevel/$*.mli $(@D) + +$(addprefix toplevel/native/, $(TOPLEVEL_SHARED_CMIS)):\ +toplevel/native/%.cmi: toplevel/%.cmi + cp $< toplevel/$*.mli $(@D) + +beforedepend:: + cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) byte/ + cd toplevel ; cp $(TOPLEVEL_SHARED_MLIS) native/ +partialclean:: + cd toplevel/byte ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) + cd toplevel/native ; rm -f $(TOPLEVEL_SHARED_ARTEFACTS) $(COMMON:.cmo=.cmx) $(BYTECOMP:.cmo=.cmx) $(OPTCOMP:.cmo=.cmx): ocamlopt$(EXE) $(OPTTOPLEVEL:.cmo=.cmx): ocamlopt$(EXE) @@ -322,12 +450,12 @@ partialclean:: compilerlibs/ocamltoplevel.cma: $(TOPLEVEL_CMI) $(TOPLEVEL) - $(CAMLC) -a -o $@ $(TOPLEVEL) + $(CAMLC) -a -o $@ -I toplevel/byte $(TOPLEVEL) partialclean:: rm -f compilerlibs/ocamltoplevel.cma -compilerlibs/ocamlopttoplevel.cmxa: $(OPTTOPLEVEL_CMI) $(OPTTOPLEVEL:.cmo=.cmx) - $(CAMLOPT) -a -o $@ $(OPTTOPLEVEL:.cmo=.cmx) +compilerlibs/ocamltoplevel.cmxa: $(OPTTOPLEVEL_CMI) $(OPTTOPLEVEL:.cmo=.cmx) + $(CAMLOPT) -a -o $@ -I toplevel/native $(OPTTOPLEVEL:.cmo=.cmx) partialclean:: - rm -f compilerlibs/ocamlopttoplevel.cmxa \ - compilerlibs/ocamlopttoplevel.a compilerlibs/ocamlopttoplevel.lib + rm -f compilerlibs/ocamltoplevel.cmxa \ + compilerlibs/ocamltoplevel.a compilerlibs/ocamltoplevel.lib diff --git a/configure b/configure index 81a77e3b..961232fc 100755 --- a/configure +++ b/configure @@ -56,7 +56,7 @@ if test -e '.git' ; then : fi fi # Guess values for system-dependent variables and create Makefiles. -# Generated by GNU Autoconf 2.69 for OCaml 4.12.1. +# Generated by GNU Autoconf 2.69 for OCaml 4.13.0. # # Report bugs to . # @@ -646,8 +646,8 @@ MAKEFLAGS= # Identity of this package. PACKAGE_NAME='OCaml' PACKAGE_TARNAME='ocaml' -PACKAGE_VERSION='4.12.1' -PACKAGE_STRING='OCaml 4.12.1' +PACKAGE_VERSION='4.13.0' +PACKAGE_STRING='OCaml 4.13.0' PACKAGE_BUGREPORT='caml-list@inria.fr' PACKAGE_URL='http://www.ocaml.org' @@ -695,11 +695,11 @@ PTHREAD_LIBS PTHREAD_CC ax_pthread_config rlwrap -SYSTEM_AS DIRECT_LD INSTALL_DATA INSTALL_SCRIPT INSTALL_PROGRAM +flexlink ac_ct_DEP_CC DEP_CC CPP @@ -760,6 +760,7 @@ afl function_sections flat_float_array windows_unicode +cmm_invariants flambda_invariants flambda frame_pointers @@ -776,10 +777,9 @@ asm_cfi_supported AS endianness ASPP -x_libraries -x_includes -pthread_link ocamltest +documentation_tool_cmd +documentation_tool ocamldoc with_camltex with_debugger @@ -787,6 +787,7 @@ as_has_debug_prefix_map cc_has_debug_prefix_map otherlibraries has_monotonic_clock +instrumented_runtime_libs instrumented_runtime debug_runtime cmxs @@ -799,7 +800,8 @@ RANLIB AR shebangscripts long_shebang -iflexdir +bootstrapping_flexdll +flexdir ocamlc_cppflags ocamlc_cflags nativecclibs @@ -889,17 +891,20 @@ enable_str_lib enable_unix_lib enable_bigarray_lib enable_ocamldoc +with_odoc enable_ocamltest enable_frame_pointers enable_naked_pointers enable_naked_pointers_checker enable_spacetime enable_cfi +enable_imprecise_c99_float_ops enable_installing_source_artifacts enable_installing_bytecode_programs enable_native_compiler enable_flambda enable_flambda_invariants +enable_cmm_invariants with_target_bindir enable_reserved_header_bits enable_stdlib_manpages @@ -908,6 +913,7 @@ enable_force_safe_string enable_flat_float_array enable_function_sections with_afl +with_flexdll enable_shared enable_static with_pic @@ -1473,7 +1479,7 @@ if test "$ac_init_help" = "long"; then # Omit some internal or obsolete options to make the list less imposing. # This message is too long to be a string in the A/UX 3.1 sh. cat <<_ACEOF -\`configure' configures OCaml 4.12.1 to adapt to many kinds of systems. +\`configure' configures OCaml 4.13.0 to adapt to many kinds of systems. Usage: $0 [OPTION]... [VAR=VALUE]... @@ -1539,7 +1545,7 @@ fi if test -n "$ac_init_help"; then case $ac_init_help in - short | recursive ) echo "Configuration of OCaml 4.12.1:";; + short | recursive ) echo "Configuration of OCaml 4.13.0:";; esac cat <<\_ACEOF @@ -1566,6 +1572,10 @@ Optional Features: --enable-naked-pointers-checker enable the naked pointers checker --disable-cfi disable the CFI directives in assembly files + --enable-imprecise-c99-float-ops + enables potentially imprecise replacement + implementations of C99 float ops if unavailable on + this platform --enable-installing-source-artifacts install *.cmt* and *.mli files --enable-installing-bytecode-programs @@ -1575,6 +1585,7 @@ Optional Features: --enable-flambda enable flambda optimizations --enable-flambda-invariants enable invariants checks in flambda + --enable-cmm-invariants enable invariants checks in Cmm --enable-reserved-header-bits=BITS reserve BITS (between 0 and 31) bits in block headers for profiling info @@ -1596,8 +1607,10 @@ Optional Features: Optional Packages: --with-PACKAGE[=ARG] use PACKAGE [ARG=yes] --without-PACKAGE do not use PACKAGE (same as --with-PACKAGE=no) + --with-odoc build documentation with odoc --with-target-bindir location of binary programs on target system --with-afl use the AFL fuzzer + --with-flexdll bootstrap FlexDLL from the given sources --with-pic[=PKGS] try to use only PIC/non-PIC objects [default=use both] --with-aix-soname=aix|svr4|both @@ -1606,6 +1619,7 @@ Optional Packages: --with-gnu-ld assume the C compiler uses GNU ld [default=no] --with-sysroot[=DIR] Search for dependent libraries within DIR (or the compiler's sysroot if not specified). + --with-odoc Some influential environment variables: AS which assembler to use @@ -1695,7 +1709,7 @@ fi test -n "$ac_init_help" && exit $ac_status if $ac_init_version; then cat <<\_ACEOF -OCaml configure 4.12.1 +OCaml configure 4.13.0 generated by GNU Autoconf 2.69 Copyright (C) 2012 Free Software Foundation, Inc. @@ -2404,7 +2418,7 @@ cat >config.log <<_ACEOF This file contains any messages produced by compilers while running configure, to aid debugging if configure makes a mistake. -It was created by OCaml $as_me 4.12.1, which was +It was created by OCaml $as_me 4.13.0, which was generated by GNU Autoconf 2.69. Invocation command line was $ $0 $@ @@ -2753,8 +2767,8 @@ ac_compiler_gnu=$ac_cv_c_compiler_gnu -{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.12.1" >&5 -$as_echo "$as_me: Configuring OCaml version 4.12.1" >&6;} +{ $as_echo "$as_me:${as_lineno-$LINENO}: Configuring OCaml version 4.13.0" >&5 +$as_echo "$as_me: Configuring OCaml version 4.13.0" >&6;} # Configuration variables @@ -2768,11 +2782,13 @@ programs_man_section=1 libraries_man_section=3 # Command to build executalbes -# In general this command is supposed to use the CFLAGs-related variables -# ($OC_CFLAGS and $CFLAGS), but at the moment they are not taken into -# account on Windows, because flexlink, which is used to build -# executables on this platform, can not handle them. -mkexe="\$(CC) \$(OC_CFLAGS) \$(CFLAGS) \$(OC_LDFLAGS)" +# In general this command is supposed to use the CFLAGs- and LDFLAGS- +# related variables (OC_CFLAGS and OC_LDFLAGS for ocaml-specific +# flags, CFLAGS and LDFLAGS for generic flags chosen by the user), but +# at the moment they are not taken into account on Windows, because +# flexlink, which is used to build executables on this platform, can +# not handle them. +mkexe="\$(CC) \$(OC_CFLAGS) \$(CFLAGS) \$(OC_LDFLAGS) \$(LDFLAGS)" # Flags for building executable files with debugging symbols mkexedebugflag="-g" @@ -2786,14 +2802,14 @@ oc_ldflags="" oc_dll_ldflags="" with_sharedlibs=true ostype="Unix" -iflexdir="" SO="so" toolchain="cc" profinfo=false profinfo_width=0 extralibs= instrumented_runtime=false -instrumented_runtime_ldlibs="" +instrumented_runtime_libs="" +bootstrapping_flexdll=false # Information about the package @@ -2835,7 +2851,7 @@ ac_configure="$SHELL $ac_aux_dir/configure" # Please don't use this var. -VERSION=4.12.1 +VERSION=4.13.0 # Note: This is present for the flexdll bootstrap where it exposed as the old @@ -2888,6 +2904,8 @@ VERSION=4.12.1 + + @@ -3161,6 +3179,14 @@ else fi + +# Check whether --with-odoc was given. +if test "${with_odoc+set}" = set; then : + withval=$with_odoc; +fi + + + # Check whether --enable-ocamltest was given. if test "${enable_ocamltest+set}" = set; then : enableval=$enable_ocamltest; @@ -3197,6 +3223,12 @@ if test "${enable_cfi+set}" = set; then : fi +# Check whether --enable-imprecise-c99-float-ops was given. +if test "${enable_imprecise_c99_float_ops+set}" = set; then : + enableval=$enable_imprecise_c99_float_ops; +fi + + # Check whether --enable-installing-source-artifacts was given. if test "${enable_installing_source_artifacts+set}" = set; then : enableval=$enable_installing_source_artifacts; @@ -3226,6 +3258,12 @@ if test "${enable_flambda_invariants+set}" = set; then : fi +# Check whether --enable-cmm-invariants was given. +if test "${enable_cmm_invariants+set}" = set; then : + enableval=$enable_cmm_invariants; +fi + + # Check whether --with-target-bindir was given. if test "${with_target_bindir+set}" = set; then : @@ -3316,6 +3354,15 @@ if test "${with_afl+set}" = set; then : fi + +# Check whether --with-flexdll was given. +if test "${with_flexdll+set}" = set; then : + withval=$with_flexdll; if test x"$withval" = 'xyes'; then : + with_flexdll=flexdll +fi +fi + + if test x"$enable_unix_lib" = "xno"; then : if test x"$enable_debugger" = "xyes"; then : as_fn_error $? "replay debugger requires the unix library" "$LINENO" 5 @@ -12491,7 +12538,8 @@ if ac_fn_c_try_cpp "$LINENO"; then : if ${ocaml_cv_cc_vendor+:} false; then : $as_echo_n "(cached) " >&6 else - ocaml_cv_cc_vendor=`grep '^[a-z]' conftest.i | tr -s ' ' '-'` + ocaml_cv_cc_vendor=`grep '^[a-z]' conftest.i | tr -s ' ' '-' \ + | tr -d '\r'` fi else @@ -12505,6 +12553,38 @@ rm -f conftest.err conftest.i conftest.$ac_ext $as_echo "$ocaml_cv_cc_vendor" >&6; } +## In cross-compilation mode, can we run executables produced? +# At the moment, it's required, but the fact is used in C99 function detection + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether host executables can be run in the build" >&5 +$as_echo_n "checking whether host executables can be run in the build... " >&6; } + old_cross_compiling="$cross_compiling" + cross_compiling='no' + if test "$cross_compiling" = yes; then : + # autoconf displays a warning if this parameter is missing, but + # cross-compilation mode was disabled above. + assert=false +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main (void) {return 0;} +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + host_runnable=true +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + host_runnable=false +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + cross_compiling="$old_cross_compiling" + + # Determine how to call the C preprocessor directly. # Most of the time, calling the C preprocessor through the C compiler is # desirable and even important. @@ -12647,7 +12727,7 @@ case $ocaml_cv_cc_vendor in #( cc_warnings='-Wall -Wdeclaration-after-statement' ;; esac -case $enable_warn_error,4.12.1 in #( +case $enable_warn_error,4.13.0 in #( yes,*|,*+dev*) : cc_warnings="$cc_warnings $warn_error_flag" ;; #( *) : @@ -12765,234 +12845,532 @@ esac if test x"$enable_shared" = "xno"; then : with_sharedlibs=false -fi - -case $CC,$host in #( - *,*-*-darwin*) : - mkexe="$mkexe -Wl,-no_compact_unwind"; - $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h - ;; #( - *,*-*-haiku*) : - mathlib="" ;; #( - *,*-*-cygwin*) : - case $target in #( - i686-*) : - flavor=cygwin ;; #( - x86_64-*) : - flavor=cygwin64 ;; #( - *) : - as_fn_error $? "unknown cygwin variant" "$LINENO" 5 ;; -esac - common_cppflags="$common_cppflags -U_WIN32" - if $with_sharedlibs; then : - flexlink="flexlink -chain $flavor -merge-manifest -stack 16777216" - flexdir=`$flexlink -where | tr -d '\015'` - if test -z "$flexdir"; then : - { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexlink not found: native shared libraries won't be available. - " >&5 -$as_echo "$as_me: WARNING: flexlink not found: native shared libraries won't be available. - " >&2;} - with_sharedlibs=false -else - iflexdir="-I\"$flexdir\"" - mkexe="$flexlink -exe" - mkexedebugflag="-link -g" - -fi - -fi - if ! $with_sharedlibs; then : - mkexe="$mkexe -Wl,--stack,16777216" - oc_ldflags="-Wl,--stack,16777216" - -fi - ostype="Cygwin" ;; #( - *,*-*-mingw32) : - if $with_sharedlibs; then : case $host in #( - i686-*-*) : - flexdll_chain="mingw"; oc_dll_ldflags="-static-libgcc" ;; #( - x86_64-*-*) : - flexdll_chain="mingw64" ;; #( + *-pc-windows|*-w64-mingw32) : + as_fn_error $? "Cannot build native Win32 with --disable-shared" "$LINENO" 5 ;; #( *) : ;; esac - flexlink="flexlink -chain $flexdll_chain -merge-manifest -stack 16777216" - flexdir=`$flexlink -where | tr -d '\015'` - if test -z "$flexdir"; then : - flexdir='$(ROOTDIR)/flexdll' -fi - iflexdir="-I\"$flexdir\"" - mkexedebugflag="-link -g" fi - ostype="Win32" - toolchain="mingw" - mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' - oc_ldflags='-municode' - SO="dll" ;; #( - *,*-pc-windows) : - toolchain=msvc - ostype="Win32" - mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' - oc_ldflags='/ENTRY:wmainCRTStartup' - case $host in #( + +# Define flexlink chain and flags correctly for the different Windows ports +case $host in #( + i686-*-cygwin) : + flexdll_chain='cygwin' + flexlink_flags="-chain $flexdll_chain -merge-manifest -stack 16777216" ;; #( + x86_64-*-cygwin) : + flexdll_chain='cygwin64' + flexlink_flags="-chain $flexdll_chain -merge-manifest -stack 16777216" ;; #( + *-*-cygwin*) : + as_fn_error $? "unknown cygwin variant" "$LINENO" 5 ;; #( + i686-w64-mingw32) : + flexdll_chain='mingw' + flexlink_flags="-chain $flexdll_chain -stack 16777216" ;; #( + x86_64-w64-mingw32) : + flexdll_chain='mingw64' + flexlink_flags="-chain $flexdll_chain -stack 33554432" ;; #( i686-pc-windows) : - flexdll_chain=msvc ;; #( + flexdll_chain='msvc' + flexlink_flags="-merge-manifest -stack 16777216" ;; #( x86_64-pc-windows) : - flexdll_chain=msvc64 ;; #( + flexdll_chain='msvc64' + flexlink_flags="-x64 -merge-manifest -stack 33554432" ;; #( *) : ;; esac - if $with_sharedlibs; then : - flexlink="flexlink -chain $flexdll_chain -merge-manifest -stack 16777216" - flexdir=`$flexlink -where | tr -d '\015'` - if test -z "$flexdir"; then : - flexdir='$(ROOTDIR)/flexdll' + +if test x"$enable_shared" != 'xno'; then : + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for flexdll sources" >&5 +$as_echo_n "checking for flexdll sources... " >&6; } + if test x"$with_flexdll" = "xno"; then : + flexdir='' + { $as_echo "$as_me:${as_lineno-$LINENO}: result: disabled" >&5 +$as_echo "disabled" >&6; } +else + flexmsg='' + case $target in #( + *-*-cygwin*|*-w64-mingw32|*-pc-windows) : + if test x"$with_flexdll" = 'x' -o x"$with_flexdll" = 'xflexdll'; then : + if test -f 'flexdll/flexdll.h'; then : + flexdir=flexdll + iflexdir='$(ROOTDIR)/flexdll' + with_flexdll="$iflexdir" +else + if test x"$with_flexdll" != 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +$as_echo "requested but not available" >&6; } + as_fn_error $? "exiting" "$LINENO" 5 +fi +fi +else + rm -rf flexdll-sources + if test -f "$with_flexdll/flexdll.h"; then : + mkdir -p flexdll-sources + cp -r "$with_flexdll"/* flexdll-sources/ + flexdir='flexdll-sources' + iflexdir='$(ROOTDIR)/flexdll-sources' + flexmsg=" (from $with_flexdll)" +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not available" >&5 +$as_echo "requested but not available" >&6; } + as_fn_error $? "exiting" "$LINENO" 5 fi - iflexdir="-I\"$flexdir\"" - mkexedebugflag='' +fi + if test x"$flexdir" = 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $iflexdir$flexmsg" >&5 +$as_echo "$iflexdir$flexmsg" >&6; } + bootstrapping_flexdll=true + # The submodule should be searched *before* any other -I paths + internal_cppflags="-I $iflexdir $internal_cppflags" fi ;; #( - *,x86_64-*-linux*) : - $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h - ;; #( - xlc*,powerpc-ibm-aix*) : - mkexe="$mkexe " - oc_ldflags="-brtl -bexpfull" - $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h - ;; #( - gcc*,powerpc-*-linux*) : - oc_ldflags="-mbss-plt" ;; #( *) : - ;; + if test x"$with_flexdll" != 'x'; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: requested but not supported" >&5 +$as_echo "requested but not supported" >&6; } + as_fn_error $? "exiting" "$LINENO" 5 +fi ;; esac +fi - -## Program to use to install files -# Find a good install program. We prefer a C program (faster), -# so one script is as good as another. But avoid the broken or -# incompatible versions: -# SysV /etc/install, /usr/sbin/install -# SunOS /usr/etc/install -# IRIX /sbin/install -# AIX /bin/install -# AmigaOS /C/install, which installs bootblocks on floppy discs -# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag -# AFS /usr/afsws/bin/install, which mishandles nonexistent args -# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" -# OS/2's system install, which has a completely different semantic -# ./install, which can be erroneously created by make from ./install.sh. -# Reject install programs that cannot install multiple files. -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 -$as_echo_n "checking for a BSD-compatible install... " >&6; } -if test -z "$INSTALL"; then -if ${ac_cv_path_install+:} false; then : + # Extract the first word of "flexlink", so it can be a program name with args. +set dummy flexlink; ac_word=$2 +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 +$as_echo_n "checking for $ac_word... " >&6; } +if ${ac_cv_prog_flexlink+:} false; then : $as_echo_n "(cached) " >&6 else - as_save_IFS=$IFS; IFS=$PATH_SEPARATOR + if test -n "$flexlink"; then + ac_cv_prog_flexlink="$flexlink" # Let the user override the test. +else +as_save_IFS=$IFS; IFS=$PATH_SEPARATOR for as_dir in $PATH do IFS=$as_save_IFS test -z "$as_dir" && as_dir=. - # Account for people who put trailing slashes in PATH elements. -case $as_dir/ in #(( - ./ | .// | /[cC]/* | \ - /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ - ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ - /usr/ucb/* ) ;; - *) - # OSF1 and SCO ODT 3.0 have their own names for install. - # Don't use installbsd from OSF since it installs stuff as root - # by default. - for ac_prog in ginstall scoinst install; do - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then - if test $ac_prog = install && - grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # AIX install. It has an incompatible calling convention. - : - elif test $ac_prog = install && - grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then - # program-specific install script used by HP pwplus--don't use. - : - else - rm -rf conftest.one conftest.two conftest.dir - echo one > conftest.one - echo two > conftest.two - mkdir conftest.dir - if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && - test -s conftest.one && test -s conftest.two && - test -s conftest.dir/conftest.one && - test -s conftest.dir/conftest.two - then - ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" - break 3 - fi - fi - fi - done - done - ;; -esac - + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then + ac_cv_prog_flexlink="flexlink" + $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 + break 2 + fi +done done IFS=$as_save_IFS -rm -rf conftest.one conftest.two conftest.dir - fi - if test "${ac_cv_path_install+set}" = set; then - INSTALL=$ac_cv_path_install - else - # As a last resort, use the slow shell script. Don't cache a - # value for INSTALL within a source directory, because that will - # break other packages using the cache if that directory is - # removed, or if the value is a relative name. - INSTALL=$ac_install_sh - fi fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 -$as_echo "$INSTALL" >&6; } +flexlink=$ac_cv_prog_flexlink +if test -n "$flexlink"; then + { $as_echo "$as_me:${as_lineno-$LINENO}: result: $flexlink" >&5 +$as_echo "$flexlink" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi -# Use test -z because SunOS4 sh mishandles braces in ${var-val}. -# It thinks the first close brace ends the variable substitution. -test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' -test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' -test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + if test -n "$flexlink" -a -z "$flexdir"; then : -# Checks for libraries -## Mathematical library -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 -$as_echo_n "checking for cos in -lm... " >&6; } -if ${ac_cv_lib_m_cos+:} false; then : - $as_echo_n "(cached) " >&6 -else - ac_check_lib_save_LIBS=$LIBS -LIBS="-lm $LIBS" -cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ + saved_CC="$CC" + saved_CFLAGS="$CFLAGS" + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_ac_ext="$ac_ext" + saved_ac_compile="$ac_compile" + # Move the content of confdefs.h to another file so it does not + # get included + mv confdefs.h confdefs.h.bak + touch confdefs.h -/* Override any GCC internal prototype to avoid an error. - Use char because int might match the return type of a GCC - builtin and then its argument prototype would still apply. */ -#ifdef __cplusplus -extern "C" -#endif -char cos (); -int -main () -{ -return cos (); - ; - return 0; -} + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether $flexlink works" >&5 +$as_echo_n "checking whether $flexlink works... " >&6; } + + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int answer = 42; _ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_cv_lib_m_cos=yes -else +if ac_fn_c_try_compile "$LINENO"; then : + # Create conftest1.$ac_objext as a symlink on Cygwin to ensure that native + # flexlink can cope. The reverse test is unnecessary (a Cygwin-compiled + # flexlink can read anything). + mv conftest.$ac_objext conftest1.$ac_objext + case $host in #( + *-pc-cygwin) : + ln -s conftest1.$ac_objext conftest2.$ac_objext ;; #( + *) : + cp conftest1.$ac_objext conftest2.$ac_objext ;; +esac + + CC="$flexlink -chain $flexdll_chain -exe" + LIBS="conftest2.$ac_objext" + CPPFLAGS="$internal_cppflags $CPPFLAGS" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main() { return 0; } +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + as_fn_error $? "$flexlink does not work" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: unexpected compile error" >&5 +$as_echo "unexpected compile error" >&6; } + as_fn_error $? "error calling the C compiler" "$LINENO" 5 +fi +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext + + + # Restore the content of confdefs.h + mv confdefs.h.bak confdefs.h + ac_compile="$saved_ac_compile" + ac_ext="$saved_ac_ext" + CPPFLAGS="$saved_CPPFLAGS" + CFLAGS="$saved_CFLAGS" + CC="$saved_CC" + LIBS="$saved_LIBS" + + + + case $host in #( + *-w64-mingw32|*-pc-windows) : + flexlink_where="$(cmd /c "$flexlink" -where 2>/dev/null)" + if test -z "$flexlink_where"; then : + as_fn_error $? "$flexlink is not executable from a native Win32 process" "$LINENO" 5 + +fi ;; #( + *) : + ;; +esac + +fi + + + + saved_CC="$CC" + saved_CFLAGS="$CFLAGS" + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_ac_ext="$ac_ext" + saved_ac_compile="$ac_compile" + # Move the content of confdefs.h to another file so it does not + # get included + mv confdefs.h confdefs.h.bak + touch confdefs.h + + + if test -n "$flexdir"; then : + CPPFLAGS="-I $flexdir $CPPFLAGS" +fi + have_flexdll_h=no + ac_fn_c_check_header_mongrel "$LINENO" "flexdll.h" "ac_cv_header_flexdll_h" "$ac_includes_default" +if test "x$ac_cv_header_flexdll_h" = xyes; then : + have_flexdll_h=yes +else + have_flexdll_h=no +fi + + + if test x"$have_flexdll_h" = 'xno'; then : + if test -n "$flexdir"; then : + as_fn_error $? "$flexdir/flexdll.h appears unusable" "$LINENO" 5 +fi +fi + + + # Restore the content of confdefs.h + mv confdefs.h.bak confdefs.h + ac_compile="$saved_ac_compile" + ac_ext="$saved_ac_ext" + CPPFLAGS="$saved_CPPFLAGS" + CFLAGS="$saved_CFLAGS" + CC="$saved_CC" + LIBS="$saved_LIBS" + + + + if test -n "$flexlink" -a x"$have_flexdll_h" = 'xno'; then : + + + saved_CC="$CC" + saved_CFLAGS="$CFLAGS" + saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" + saved_ac_ext="$ac_ext" + saved_ac_compile="$ac_compile" + # Move the content of confdefs.h to another file so it does not + # get included + mv confdefs.h confdefs.h.bak + touch confdefs.h + + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking if \"$flexlink -where\" includes flexdll.h" >&5 +$as_echo_n "checking if \"$flexlink -where\" includes flexdll.h... " >&6; } + flexlink_where="$($flexlink -where | tr -d '\r')" + CPPFLAGS="$CPPFLAGS -I \"$flexlink_where\"" + cat > conftest.c <<"EOF" +#include +int main (void) {return 0;} +EOF + cat > conftest.Makefile </dev/null 2>/dev/null; then : + have_flexdll_h=yes + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } +fi + + + # Restore the content of confdefs.h + mv confdefs.h.bak confdefs.h + ac_compile="$saved_ac_compile" + ac_ext="$saved_ac_ext" + CPPFLAGS="$saved_CPPFLAGS" + CFLAGS="$saved_CFLAGS" + CC="$saved_CC" + LIBS="$saved_LIBS" + + + if test "x$have_flexdll_h" = 'xyes'; then : + internal_cppflags="$internal_cppflags -I \"$flexlink_where\"" +fi + +fi + +fi + +if test x"$have_flexdll_h" = 'xno'; then : + case $host in #( + *-*-cygwin*) : + if $with_sharedlibs; then : + with_sharedlibs=false + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexdll.h not found: shared library support disabled." >&5 +$as_echo "$as_me: WARNING: flexdll.h not found: shared library support disabled." >&2;} + +fi ;; #( + *-w64-mingw32|*-pc-windows) : + as_fn_error $? "flexdll.h is required for native Win32" "$LINENO" 5 ;; #( + *) : + ;; +esac +fi + +if test -z "$flexdir" -o x"$have_flexdll_h" = 'xno'; then : + case $host in #( + *-*-cygwin*) : + if $with_sharedlibs; then : + if test -z "$flexlink"; then : + with_sharedlibs=false + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: flexlink/flexdll.h not found: shared library support disabled." >&5 +$as_echo "$as_me: WARNING: flexlink/flexdll.h not found: shared library support disabled." >&2;} + +fi +fi ;; #( + *-w64-mingw32|*-pc-windows) : + if test -z "$flexlink"; then : + as_fn_error $? "flexlink is required for native Win32" "$LINENO" 5 +fi ;; #( + *) : + ;; +esac +fi + +case $CC,$host in #( + *,*-*-darwin*) : + mkexe="$mkexe -Wl,-no_compact_unwind"; + $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h + ;; #( + *,*-*-haiku*) : + mathlib="" ;; #( + *,*-*-cygwin*) : + common_cppflags="$common_cppflags -U_WIN32" + if $with_sharedlibs; then : + mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' + mkexedebugflag="-link -g" +else + mkexe="$mkexe -Wl,--stack,16777216" + oc_ldflags="-Wl,--stack,16777216" + +fi + ostype="Cygwin" ;; #( + *,*-*-mingw32) : + case $host in #( + i686-*-*) : + oc_dll_ldflags="-static-libgcc" ;; #( + *) : + ;; +esac + mkexedebugflag="-link -g" + ostype="Win32" + toolchain="mingw" + mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' + oc_ldflags='-municode' + SO="dll" ;; #( + *,*-pc-windows) : + toolchain=msvc + ostype="Win32" + mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' + oc_ldflags='/ENTRY:wmainCRTStartup' + mkexedebugflag='' ;; #( + *,x86_64-*-linux*) : + $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h + ;; #( + xlc*,powerpc-ibm-aix*) : + mkexe="$mkexe " + oc_ldflags="-brtl -bexpfull" + $as_echo "#define HAS_ARCH_CODE32 1" >>confdefs.h + ;; #( + gcc*,powerpc-*-linux*) : + oc_ldflags="-mbss-plt" ;; #( + *) : + ;; +esac + + +## Program to use to install files +# Find a good install program. We prefer a C program (faster), +# so one script is as good as another. But avoid the broken or +# incompatible versions: +# SysV /etc/install, /usr/sbin/install +# SunOS /usr/etc/install +# IRIX /sbin/install +# AIX /bin/install +# AmigaOS /C/install, which installs bootblocks on floppy discs +# AIX 4 /usr/bin/installbsd, which doesn't work without a -g flag +# AFS /usr/afsws/bin/install, which mishandles nonexistent args +# SVR4 /usr/ucb/install, which tries to use the nonexistent group "staff" +# OS/2's system install, which has a completely different semantic +# ./install, which can be erroneously created by make from ./install.sh. +# Reject install programs that cannot install multiple files. +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for a BSD-compatible install" >&5 +$as_echo_n "checking for a BSD-compatible install... " >&6; } +if test -z "$INSTALL"; then +if ${ac_cv_path_install+:} false; then : + $as_echo_n "(cached) " >&6 +else + as_save_IFS=$IFS; IFS=$PATH_SEPARATOR +for as_dir in $PATH +do + IFS=$as_save_IFS + test -z "$as_dir" && as_dir=. + # Account for people who put trailing slashes in PATH elements. +case $as_dir/ in #(( + ./ | .// | /[cC]/* | \ + /etc/* | /usr/sbin/* | /usr/etc/* | /sbin/* | /usr/afsws/bin/* | \ + ?:[\\/]os2[\\/]install[\\/]* | ?:[\\/]OS2[\\/]INSTALL[\\/]* | \ + /usr/ucb/* ) ;; + *) + # OSF1 and SCO ODT 3.0 have their own names for install. + # Don't use installbsd from OSF since it installs stuff as root + # by default. + for ac_prog in ginstall scoinst install; do + for ac_exec_ext in '' $ac_executable_extensions; do + if as_fn_executable_p "$as_dir/$ac_prog$ac_exec_ext"; then + if test $ac_prog = install && + grep dspmsg "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # AIX install. It has an incompatible calling convention. + : + elif test $ac_prog = install && + grep pwplus "$as_dir/$ac_prog$ac_exec_ext" >/dev/null 2>&1; then + # program-specific install script used by HP pwplus--don't use. + : + else + rm -rf conftest.one conftest.two conftest.dir + echo one > conftest.one + echo two > conftest.two + mkdir conftest.dir + if "$as_dir/$ac_prog$ac_exec_ext" -c conftest.one conftest.two "`pwd`/conftest.dir" && + test -s conftest.one && test -s conftest.two && + test -s conftest.dir/conftest.one && + test -s conftest.dir/conftest.two + then + ac_cv_path_install="$as_dir/$ac_prog$ac_exec_ext -c" + break 3 + fi + fi + fi + done + done + ;; +esac + + done +IFS=$as_save_IFS + +rm -rf conftest.one conftest.two conftest.dir + +fi + if test "${ac_cv_path_install+set}" = set; then + INSTALL=$ac_cv_path_install + else + # As a last resort, use the slow shell script. Don't cache a + # value for INSTALL within a source directory, because that will + # break other packages using the cache if that directory is + # removed, or if the value is a relative name. + INSTALL=$ac_install_sh + fi +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $INSTALL" >&5 +$as_echo "$INSTALL" >&6; } + +# Use test -z because SunOS4 sh mishandles braces in ${var-val}. +# It thinks the first close brace ends the variable substitution. +test -z "$INSTALL_PROGRAM" && INSTALL_PROGRAM='${INSTALL}' + +test -z "$INSTALL_SCRIPT" && INSTALL_SCRIPT='${INSTALL}' + +test -z "$INSTALL_DATA" && INSTALL_DATA='${INSTALL} -m 644' + + +# Checks for libraries + +## Mathematical library +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for cos in -lm" >&5 +$as_echo_n "checking for cos in -lm... " >&6; } +if ${ac_cv_lib_m_cos+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_check_lib_save_LIBS=$LIBS +LIBS="-lm $LIBS" +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char cos (); +int +main () +{ +return cos (); + ; + return 0; +} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_cv_lib_m_cos=yes +else ac_cv_lib_m_cos=no fi rm -f core conftest.err conftest.$ac_objext \ @@ -13651,8 +14029,9 @@ natdynlinkopts="" if test x"$enable_shared" != "xno"; then : case $host in #( *-apple-darwin*) : - mksharedlib="$CC -shared -flat_namespace -undefined suppress \ - -Wl,-no_compact_unwind" + mksharedlib="$CC -shared \ + -flat_namespace -undefined suppress -Wl,-no_compact_unwind \ + \$(LDFLAGS)" shared_libraries_supported=true ;; #( *-*-mingw32) : mksharedlib='$(FLEXLINK)' @@ -13668,13 +14047,13 @@ fi mkmaindll='$(FLEXLINK) -maindll' shared_libraries_supported=$with_sharedlibs ;; #( *-*-cygwin*) : - mksharedlib="$flexlink" - mkmaindll="$flexlink -maindll" - shared_libraries_supported=true ;; #( + mksharedlib='$(FLEXLINK)' + mkmaindll='$(FLEXLINK) -maindll' + shared_libraries_supported=$with_sharedlibs ;; #( powerpc-ibm-aix*) : case $ocaml_cv_cc_vendor in #( xlc*) : - mksharedlib="$CC -qmkshrobj -G" + mksharedlib="$CC -qmkshrobj -G \$(LDFLAGS)" shared_libraries_supported=true ;; #( *) : ;; @@ -13690,9 +14069,9 @@ esac ;; #( sharedlib_cflags="-fPIC" case $CC,$host in #( gcc*,powerpc-*-linux*) : - mksharedlib="$CC -shared -mbss-plt" ;; #( + mksharedlib="$CC -shared -mbss-plt \$(LDFLAGS)" ;; #( *) : - mksharedlib="$CC -shared" ;; + mksharedlib="$CC -shared \$(LDFLAGS)" ;; esac oc_ldflags="$oc_ldflags -Wl,-E" rpath="-Wl,-rpath," @@ -13712,7 +14091,7 @@ fi natdynlink=false -if test x"$enable_shared" != "xno"; then : +if test x"$shared_libraries_supported" = 'xtrue'; then : case "$host" in #( *-*-cygwin*) : natdynlink=true ;; #( @@ -13885,19 +14264,20 @@ else fi; system=elf ;; #( s390x*-*-linux*) : arch=s390x; model=z10; system=elf ;; #( - armv6*-*-linux-gnueabihf) : + # expected to match "gnueabihf" as well as "musleabihf" + armv6*-*-linux-*eabihf) : arch=arm; model=armv6; system=linux_eabihf ;; #( - armv7*-*-linux-gnueabihf) : + armv7*-*-linux-*eabihf) : arch=arm; model=armv7; system=linux_eabihf ;; #( - armv8*-*-linux-gnueabihf) : + armv8*-*-linux-*eabihf) : arch=arm; model=armv8; system=linux_eabihf ;; #( - armv8*-*-linux-gnueabi) : + armv8*-*-linux-*eabi) : arch=arm; model=armv8; system=linux_eabi ;; #( - armv7*-*-linux-gnueabi) : + armv7*-*-linux-*eabi) : arch=arm; model=armv7; system=linux_eabi ;; #( - armv6t2*-*-linux-gnueabi) : + armv6t2*-*-linux-*eabi) : arch=arm; model=armv6t2; system=linux_eabi ;; #( - armv6*-*-linux-gnueabi) : + armv6*-*-linux-*eabi) : arch=arm; model=armv6; system=linux_eabi ;; #( armv6*-*-freebsd*) : arch=arm; model=armv6; system=freebsd ;; #( @@ -13905,13 +14285,13 @@ fi; system=elf ;; #( arch=arm; model=armv6; system=netbsd ;; #( earmv7*-*-netbsd*) : arch=arm; model=armv7; system=netbsd ;; #( - armv5te*-*-linux-gnueabi) : + armv5te*-*-linux-*eabi) : arch=arm; model=armv5te; system=linux_eabi ;; #( - armv5*-*-linux-gnueabi) : + armv5*-*-linux-*eabi) : arch=arm; model=armv5; system=linux_eabi ;; #( - arm*-*-linux-gnueabihf) : + arm*-*-linux-*eabihf) : arch=arm; system=linux_eabihf ;; #( - arm*-*-linux-gnueabi) : + arm*-*-linux-*eabi) : arch=arm; system=linux_eabi ;; #( arm*-*-openbsd*) : arch=arm; system=bsd ;; #( @@ -14112,7 +14492,8 @@ case $arch in #( ;; #( *) : case $host in #( - *-linux-musl) : + # expected to match "*-linux-musl" as well as "*-linux-musleabi*" + *-linux-musl*) : # Alpine and other musl-based Linux distributions common_cflags="-no-pie $common_cflags" ;; #( *) : @@ -14122,177 +14503,52 @@ esac # Assembler -if test -n "$host_alias"; then : +if test -n "$target_alias"; then : + toolpref="${target_alias}-" + as_target="$target" + as_cpu="$target_cpu" +else + if test -n "$host_alias"; then : toolpref="${host_alias}-" + as_target="$host" + as_cpu="$host_cpu" else toolpref="" + as_target="$build" + as_cpu="$build_cpu" fi - -# We first compute default values for as and aspp -# If values have been given by the user then they take precedence over -# those just computed -# One may want to check whether the user provided values first -# and only compute values if none has been provided - -if test -n "$ac_tool_prefix"; then - # Extract the first word of "${ac_tool_prefix}as", so it can be a program name with args. -set dummy ${ac_tool_prefix}as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_SYSTEM_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$SYSTEM_AS"; then - ac_cv_prog_SYSTEM_AS="$SYSTEM_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_SYSTEM_AS="${ac_tool_prefix}as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -SYSTEM_AS=$ac_cv_prog_SYSTEM_AS -if test -n "$SYSTEM_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $SYSTEM_AS" >&5 -$as_echo "$SYSTEM_AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } fi +# Finding the assembler +# The OCaml build system distinguishes two different assemblers: +# 1. AS, used to assemble the code generated by the ocamlopt native compiler +# 2. ASPP, to assemble other assembly files that may require preprocessing +# In general, "$CC -c" is used as a default value for both AS and ASPP. +# On a few platforms (Windows) both values are overriden. +# On other platforms, (Linux with GCC) the assembler AS is called directly +# to avoiding forking a C compiler process for each compilation by ocamlopt. +# Both AS and ASPP can be overriden by the user. -fi -if test -z "$ac_cv_prog_SYSTEM_AS"; then - ac_ct_SYSTEM_AS=$SYSTEM_AS - # Extract the first word of "as", so it can be a program name with args. -set dummy as; ac_word=$2 -{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for $ac_word" >&5 -$as_echo_n "checking for $ac_word... " >&6; } -if ${ac_cv_prog_ac_ct_SYSTEM_AS+:} false; then : - $as_echo_n "(cached) " >&6 -else - if test -n "$ac_ct_SYSTEM_AS"; then - ac_cv_prog_ac_ct_SYSTEM_AS="$ac_ct_SYSTEM_AS" # Let the user override the test. -else -as_save_IFS=$IFS; IFS=$PATH_SEPARATOR -for as_dir in $PATH -do - IFS=$as_save_IFS - test -z "$as_dir" && as_dir=. - for ac_exec_ext in '' $ac_executable_extensions; do - if as_fn_executable_p "$as_dir/$ac_word$ac_exec_ext"; then - ac_cv_prog_ac_ct_SYSTEM_AS="as" - $as_echo "$as_me:${as_lineno-$LINENO}: found $as_dir/$ac_word$ac_exec_ext" >&5 - break 2 - fi -done - done -IFS=$as_save_IFS - -fi -fi -ac_ct_SYSTEM_AS=$ac_cv_prog_ac_ct_SYSTEM_AS -if test -n "$ac_ct_SYSTEM_AS"; then - { $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_ct_SYSTEM_AS" >&5 -$as_echo "$ac_ct_SYSTEM_AS" >&6; } -else - { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 -$as_echo "no" >&6; } -fi - - if test "x$ac_ct_SYSTEM_AS" = x; then - SYSTEM_AS="" - else - case $cross_compiling:$ac_tool_warned in -yes:) -{ $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: using cross tools not prefixed with host triplet" >&5 -$as_echo "$as_me: WARNING: using cross tools not prefixed with host triplet" >&2;} -ac_tool_warned=yes ;; -esac - SYSTEM_AS=$ac_ct_SYSTEM_AS - fi -else - SYSTEM_AS="$ac_cv_prog_SYSTEM_AS" -fi +default_as="$CC -c" +default_aspp="$CC -c" - -case "$arch,$system" in #( - i386,win32) : - default_as="ml -nologo -coff -Cp -c -Fo" ;; #( - amd64,win64) : - default_as="ml64 -nologo -Cp -c -Fo" ;; #( - amd64,macosx) : - case $ocaml_cv_cc_vendor in #( - clang-*) : - default_as='clang -arch x86_64 -Wno-trigraphs -c' - default_aspp='clang -arch x86_64 -Wno-trigraphs -c' ;; #( - *) : - default_as="${toolpref}as -arch x86_64" - default_aspp="${toolpref}gcc -arch x86_64 -c" ;; -esac ;; #( - amd64,solaris) : - case $ocaml_cv_cc_vendor in #( - sunc-*) : - if test x"$SYSTEM_AS" = "x"; then : - as_fn_error $? "GNU as assembler is required." "$LINENO" 5 -else - default_as="${toolpref}as --64" - default_aspp="${toolpref}cc -m64 -c" -fi ;; #( - gcc-*) : - if test x"$SYSTEM_AS" = "x"; then : - default_as="${toolpref}gcc -m64 -c" - default_aspp="${toolpref}gcc -m64 -c" -else - default_as="${toolpref}as --64" - default_aspp="${toolpref}gcc -m64 -c" -fi ;; #( +case $as_target,$ocaml_cv_cc_vendor in #( + *-*-linux*,gcc-*) : + case $as_cpu in #( + x86_64|arm*|aarch64*|i[3-6]86|riscv*) : + default_as="${toolpref}as" ;; #( *) : ;; esac ;; #( - power,elf) : - case $model in #( - ppc64le) : - default_as="${toolpref}as -a64 -mpower8" - default_aspp="${toolpref}gcc -m64 -mcpu=powerpc64le -c" ;; #( - ppc64) : - default_as="${toolpref}as -a64 -mppc64" - default_aspp="${toolpref}gcc -m64 -c" ;; #( - ppc) : - default_as="${toolpref}as -mppc" - default_aspp="${toolpref}gcc -m32 -c" ;; #( - *) : - ;; -esac ;; #( - s390x,elf) : - default_as="${toolpref}as -m 64 -march=$model" - default_aspp="${toolpref}gcc -c -Wa,-march=$model" ;; #( - *,freebsd) : - default_as="${toolpref}cc -c -Wno-trigraphs" - default_aspp="${toolpref}cc -c -Wno-trigraphs" ;; #( - *,dragonfly) : - default_as="${toolpref}as" - default_aspp="${toolpref}cc -c" ;; #( - amd64,*|arm,*|arm64,*|i386,*|riscv,*) : - case $ocaml_cv_cc_vendor in #( - clang-*) : - default_as="${toolpref}clang -c -Wno-trigraphs" - default_aspp="${toolpref}clang -c -Wno-trigraphs" ;; #( - *) : - default_as="${toolpref}as" - default_aspp="${toolpref}gcc -c" ;; -esac ;; #( + i686-pc-windows,*) : + default_as="ml -nologo -coff -Cp -c -Fo" + default_aspp="$default_as" ;; #( + x86_64-pc-windows,*) : + default_as="ml64 -nologo -Cp -c -Fo" + default_aspp="$default_as" ;; #( + *-*-darwin*,clang-*) : + default_as="$default_as -Wno-trigraphs" + default_aspp="$default_as" ;; #( *) : ;; esac @@ -14397,67 +14653,206 @@ fi ## Check for C99 float ops -# Note: this was disabled on Windows but the autoconf-generated script -# does find the function it is looking for. -# however the fma test does not pass so we disable the feature -# for the moment, to be backward-compatible +has_c99_float_ops=true +for ac_func in expm1 log1p hypot fma exp2 log2 cbrt acosh asinh atanh erf erfc trunc round copysign +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF -case $host in #( - *-*-mingw32|*-pc-windows) : - ;; #( +else + has_c99_float_ops=false +fi +done + + +if $has_c99_float_ops; then : + $as_echo "#define HAS_C99_FLOAT_OPS 1" >>confdefs.h + + # Check whether round works (known bug in mingw-w64) + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether round works" >&5 +$as_echo_n "checking whether round works... " >&6; } + + old_cross_compiling="$cross_compiling" + if test "x$host_runnable" = 'xtrue'; then : + cross_compiling='no' +fi + if test "$cross_compiling" = yes; then : + case $target in #( + x86_64-w64-mingw32) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 +$as_echo "cross-compiling; assume not" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 +$as_echo "cross-compiling; assume yes" >&6; } + $as_echo "#define HAS_WORKING_ROUND 1" >>confdefs.h + ;; +esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int main (void) { + static volatile double d = 0.49999999999999994449; + return (fpclassify(round(d)) != FP_ZERO); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAS_WORKING_ROUND 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + case $enable_imprecise_c99_float_ops,$target in #( + no,*) : + hard_error=true ;; #( + yes,*) : + hard_error=false ;; #( + *,x86_64-w64-mingw32) : + hard_error=false ;; #( + *) : + hard_error=true ;; +esac + if test x"$hard_error" = "xtrue"; then : + as_fn_error $? "round does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 +else + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: round does not work; emulation enabled" >&5 +$as_echo "$as_me: WARNING: round does not work; emulation enabled" >&2;} +fi +fi +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext +fi + + cross_compiling="$old_cross_compiling" + + + # Check whether fma works (regressed in mingw-w64 8.0.0; present, but broken, + # in VS2013-2017 and present but unimplemented in Cygwin64) + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether fma works" >&5 +$as_echo_n "checking whether fma works... " >&6; } + + old_cross_compiling="$cross_compiling" + if test "x$host_runnable" = 'xtrue'; then : + cross_compiling='no' +fi + if test "$cross_compiling" = yes; then : + case $target in #( + x86_64-w64-mingw32|x86_64-*-cygwin*) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume not" >&5 +$as_echo "cross-compiling; assume not" >&6; } ;; #( + *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: cross-compiling; assume yes" >&5 +$as_echo "cross-compiling; assume yes" >&6; } + $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h + ;; +esac +else + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +#include +int main (void) { + /* Tests 264-266 from testsuite/tests/fma/fma.ml. These tests trigger the + broken implementations of Cygwin64, mingw-w64 (x86_64) and VS2013-2017. + The static volatile variables aim to thwart GCC's constant folding. */ + static volatile double x, y, z; + double t264, t265, t266; + x = 0x3.bd5b7dde5fddap-496; + y = 0x3.bd5b7dde5fddap-496; + z = -0xd.fc352bc352bap-992; + t264 = fma(x, y, z); + x = 0x3.bd5b7dde5fddap-504; + y = 0x3.bd5b7dde5fddap-504; + z = -0xd.fc352bc352bap-1008; + t265 = fma(x, y, z); + x = 0x8p-540; + y = 0x4p-540; + z = 0x4p-1076; + t266 = fma(x, y, z); + return (!(t264 == 0x1.0989687cp-1044 || + t264 == 0x0.000004277ca1fp-1022 || /* Acceptable emulated values */ + t264 == 0x0.00000428p-1022) + || !(t265 == 0x1.0988p-1060 || + t265 == 0x0.0000000004278p-1022 || /* Acceptable emulated values */ + t265 == 0x0.000000000428p-1022) + || !(t266 == 0x8p-1076)); +} + +_ACEOF +if ac_fn_c_try_run "$LINENO"; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 +$as_echo "yes" >&6; } + $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h + +else + { $as_echo "$as_me:${as_lineno-$LINENO}: result: no" >&5 +$as_echo "no" >&6; } + case $enable_imprecise_c99_float_ops,$target in #( + no,*) : + hard_error=true ;; #( + yes,*) : + hard_error=false ;; #( + *,x86_64-w64-mingw32|*,x86_64-*-cygwin*) : + hard_error=false ;; #( *) : - has_c99_float_ops=true - ac_fn_c_check_func "$LINENO" "expm1" "ac_cv_func_expm1" -if test "x$ac_cv_func_expm1" = xyes; then : - + case $ocaml_cv_cc_vendor in #( + msvc-*) : + if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1920 ; then : + hard_error=false else - has_c99_float_ops=false -fi - - if $has_c99_float_ops; then : - ac_fn_c_check_func "$LINENO" "log1p" "ac_cv_func_log1p" -if test "x$ac_cv_func_log1p" = xyes; then : - + hard_error=true +fi ;; #( + *) : + hard_error=true ;; +esac ;; +esac + if test x"$hard_error" = "xtrue"; then : + as_fn_error $? "fma does not work, enable emulation with --enable-imprecise-c99-float-ops" "$LINENO" 5 else - has_c99_float_ops=false + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: fma does not work; emulation enabled" >&5 +$as_echo "$as_me: WARNING: fma does not work; emulation enabled" >&2;} fi - fi - if $has_c99_float_ops; then : - ac_fn_c_check_func "$LINENO" "hypot" "ac_cv_func_hypot" -if test "x$ac_cv_func_hypot" = xyes; then : - -else - has_c99_float_ops=false +rm -f core *.core core.conftest.* gmon.out bb.out conftest$ac_exeext \ + conftest.$ac_objext conftest.beam conftest.$ac_ext fi -fi - if $has_c99_float_ops; then : - ac_fn_c_check_func "$LINENO" "fma" "ac_cv_func_fma" -if test "x$ac_cv_func_fma" = xyes; then : + cross_compiling="$old_cross_compiling" - case $target in #( - x86_64-*-cygwin) : - ;; #( + +else + if test x"$enable_imprecise_c99_float_ops" != "xyes" ; then : + case $enable_imprecise_c99_float_ops,$ocaml_cv_cc_vendor in #( + no,*) : + hard_error=true ;; #( + ,msvc-*) : + if test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 ; then : + hard_error=false +else + hard_error=true +fi ;; #( *) : - $as_echo "#define HAS_WORKING_FMA 1" >>confdefs.h - ;; + hard_error=true ;; esac + if test x"$hard_error" = 'xtrue'; then : + as_fn_error $? "C99 float ops unavailable, enable replacements with --enable-imprecise-c99-float-ops" "$LINENO" 5 else - has_c99_float_ops=false + { $as_echo "$as_me:${as_lineno-$LINENO}: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&5 +$as_echo "$as_me: WARNING: C99 float ops unavailable, replacements enabled (ancient Visual Studio)" >&2;} fi - fi - if $has_c99_float_ops; then : - ac_fn_c_check_func "$LINENO" "copysign" "ac_cv_func_copysign" -if test "x$ac_cv_func_copysign" = xyes; then : - $as_echo "#define HAS_C99_FLOAT_OPS 1" >>confdefs.h - fi -fi ;; -esac - ## getrusage ac_fn_c_check_func "$LINENO" "getrusage" "ac_cv_func_getrusage" if test "x$ac_cv_func_getrusage" = xyes; then : @@ -14659,9 +15054,9 @@ fi instrumented_runtime=true if test "x$ac_cv_search_clock_gettime" = "xnone required"; then : - instrumented_runtime_ldlibs="" + instrumented_runtime_libs="" else - instrumented_runtime_ldlibs=$ac_cv_search_clock_gettime + instrumented_runtime_libs=$ac_cv_search_clock_gettime fi ;; #( @@ -14688,51 +15083,255 @@ fi ## TODO: check whether the different libraries are really useful -sockets=false +sockets=true case $host in #( *-*-mingw32|*-pc-windows) : cclibs="$cclibs -lws2_32" - sockets=true ;; #( + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ + +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' ws2_32; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_socket+:} false; then : + break +fi +done +if ${ac_cv_search_socket+:} false; then : + +else + ac_cv_search_socket=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" + +fi + ;; #( *-*-haiku) : cclibs="$cclibs -lnetwork" - sockets=true ;; #( - *-*-solaris*) : - cclibs="$cclibs -lsocket -lnsl" - sockets=true ;; #( - *) : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ - ac_fn_c_check_func "$LINENO" "socket" "ac_cv_func_socket" -if test "x$ac_cv_func_socket" = xyes; then : +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' network; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_socket+:} false; then : + break +fi +done +if ${ac_cv_search_socket+:} false; then : +else + ac_cv_search_socket=no fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" - ac_fn_c_check_func "$LINENO" "socketpair" "ac_cv_func_socketpair" -if test "x$ac_cv_func_socketpair" = xyes; then : +fi + ;; #( + *-*-solaris*) : + cclibs="$cclibs -lsocket -lnsl" + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing socket" >&5 +$as_echo_n "checking for library containing socket... " >&6; } +if ${ac_cv_search_socket+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char socket (); +int +main () +{ +return socket (); + ; + return 0; +} +_ACEOF +for ac_lib in '' socket; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_socket=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_socket+:} false; then : + break fi +done +if ${ac_cv_search_socket+:} false; then : - ac_fn_c_check_func "$LINENO" "bind" "ac_cv_func_bind" -if test "x$ac_cv_func_bind" = xyes; then : +else + ac_cv_search_socket=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_socket" >&5 +$as_echo "$ac_cv_search_socket" >&6; } +ac_res=$ac_cv_search_socket +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi - ac_fn_c_check_func "$LINENO" "listen" "ac_cv_func_listen" -if test "x$ac_cv_func_listen" = xyes; then : + { $as_echo "$as_me:${as_lineno-$LINENO}: checking for library containing inet_ntop" >&5 +$as_echo_n "checking for library containing inet_ntop... " >&6; } +if ${ac_cv_search_inet_ntop+:} false; then : + $as_echo_n "(cached) " >&6 +else + ac_func_search_save_LIBS=$LIBS +cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +/* Override any GCC internal prototype to avoid an error. + Use char because int might match the return type of a GCC + builtin and then its argument prototype would still apply. */ +#ifdef __cplusplus +extern "C" +#endif +char inet_ntop (); +int +main () +{ +return inet_ntop (); + ; + return 0; +} +_ACEOF +for ac_lib in '' nsl; do + if test -z "$ac_lib"; then + ac_res="none required" + else + ac_res=-l$ac_lib + LIBS="-l$ac_lib $ac_func_search_save_LIBS" + fi + if ac_fn_c_try_link "$LINENO"; then : + ac_cv_search_inet_ntop=$ac_res +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext + if ${ac_cv_search_inet_ntop+:} false; then : + break fi +done +if ${ac_cv_search_inet_ntop+:} false; then : - ac_fn_c_check_func "$LINENO" "accept" "ac_cv_func_accept" -if test "x$ac_cv_func_accept" = xyes; then : +else + ac_cv_search_inet_ntop=no +fi +rm conftest.$ac_ext +LIBS=$ac_func_search_save_LIBS +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_search_inet_ntop" >&5 +$as_echo "$ac_cv_search_inet_ntop" >&6; } +ac_res=$ac_cv_search_inet_ntop +if test "$ac_res" != no; then : + test "$ac_res" = "none required" || LIBS="$ac_res $LIBS" fi + ;; #( + *) : - ac_fn_c_check_func "$LINENO" "connect" "ac_cv_func_connect" -if test "x$ac_cv_func_connect" = xyes; then : + for ac_func in socket socketpair bind listen accept connect +do : + as_ac_var=`$as_echo "ac_cv_func_$ac_func" | $as_tr_sh` +ac_fn_c_check_func "$LINENO" "$ac_func" "$as_ac_var" +if eval test \"x\$"$as_ac_var"\" = x"yes"; then : + cat >>confdefs.h <<_ACEOF +#define `$as_echo "HAVE_$ac_func" | $as_tr_cpp` 1 +_ACEOF +else + sockets=false fi +done - sockets=true ;; esac @@ -14742,15 +15341,26 @@ if $sockets; then : fi -## socklen_t in sys/socket.h +## socklen_t -ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include +case $host in #( + *-*-mingw32|*-pc-windows) : + ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include " if test "x$ac_cv_type_socklen_t" = xyes; then : $as_echo "#define HAS_SOCKLEN_T 1" >>confdefs.h fi + ;; #( + *) : + ac_fn_c_check_type "$LINENO" "socklen_t" "ac_cv_type_socklen_t" "#include +" +if test "x$ac_cv_type_socklen_t" = xyes; then : + $as_echo "#define HAS_SOCKLEN_T 1" >>confdefs.h +fi + ;; +esac ac_fn_c_check_func "$LINENO" "inet_aton" "ac_cv_func_inet_aton" if test "x$ac_cv_func_inet_aton" = xyes; then : @@ -14763,7 +15373,18 @@ fi ipv6=true -ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" " +case $host in #( + *-*-mingw32|*-pc-windows) : + ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" "#include +" +if test "x$ac_cv_type_struct_sockaddr_in6" = xyes; then : + +else + ipv6=false +fi + ;; #( + *) : + ac_fn_c_check_type "$LINENO" "struct sockaddr_in6" "ac_cv_type_struct_sockaddr_in6" " #include #include #include @@ -14776,6 +15397,8 @@ else ipv6=false fi + ;; +esac if $ipv6; then : ac_fn_c_check_func "$LINENO" "getaddrinfo" "ac_cv_func_getaddrinfo" @@ -14949,6 +15572,13 @@ fi fi +ac_fn_c_check_func "$LINENO" "realpath" "ac_cv_func_realpath" +if test "x$ac_cv_func_realpath" = xyes; then : + $as_echo "#define HAS_REALPATH 1" >>confdefs.h + +fi + + # wait ac_fn_c_check_func "$LINENO" "waitpid" "ac_cv_func_waitpid" if test "x$ac_cv_func_waitpid" = xyes; then : @@ -15197,7 +15827,7 @@ esac ## shared library support if $shared_libraries_supported; then : case $host in #( - *-*-mingw32|*-pc-windows) : + *-*-mingw32|*-pc-windows|*-*-cygwin*) : supports_shared_libraries=$shared_libraries_supported; DLLIBS="" ;; #( *) : ac_fn_c_check_func "$LINENO" "dlopen" "ac_cv_func_dlopen" @@ -15924,7 +16554,7 @@ $as_echo_n "checking whether stack overflows can be detected... " >&6; } case $arch,$system in #( i386,linux_elf|amd64,linux|amd64,macosx \ - |amd64,openbsd|i386,bsd_elf) : + |amd64,openbsd|i386,bsd_elf|arm64,linux|arm64,macosx) : $as_echo "#define HAS_STACK_OVERFLOW_DETECTION 1" >>confdefs.h { $as_echo "$as_me:${as_lineno-$LINENO}: result: yes" >&5 @@ -16017,10 +16647,12 @@ fi # (e.g. DEC) have both -lpthread and -lpthreads, where one of the # libraries is broken (non-POSIX). -# Create a list of thread flags to try. Items starting with a "-" are -# C compiler flags, and other items are library names, except for "none" -# which indicates that we try without any flags at all, and "pthread-config" -# which is a program returning the flags for the Pth emulation library. +# Create a list of thread flags to try. Items with a "," contain both +# C compiler flags (before ",") and linker flags (after ","). Other items +# starting with a "-" are C compiler flags, and remaining items are +# library names, except for "none" which indicates that we try without +# any flags at all, and "pthread-config" which is a program returning +# the flags for the Pth emulation library. ax_pthread_flags="pthreads none -Kthread -pthread -pthreads -mthreads pthread --thread-safe -mt pthread-config" @@ -16096,38 +16728,9 @@ rm -f conftest* # that too in a future libc.) So we'll check first for the # standard Solaris way of linking pthreads (-mt -lpthread). - ax_pthread_flags="-mt,pthread pthread $ax_pthread_flags" - ;; -esac - -# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - -if test "x$GCC" = "xyes"; then : - ax_pthread_flags="-pthread -pthreads $ax_pthread_flags" -fi - -# The presence of a feature test macro requesting re-entrant function -# definitions is, on some systems, a strong hint that pthreads support is -# correctly enabled - -case $host_os in - darwin* | hpux* | linux* | osf* | solaris*) - ax_pthread_check_macro="_REENTRANT" - ;; - - aix*) - ax_pthread_check_macro="_THREAD_SAFE" - ;; - - *) - ax_pthread_check_macro="--" + ax_pthread_flags="-mt,-lpthread pthread $ax_pthread_flags" ;; esac -if test "x$ax_pthread_check_macro" = "x--"; then : - ax_pthread_check_cond=0 -else - ax_pthread_check_cond="!defined($ax_pthread_check_macro)" -fi # Are we compiling with Clang? @@ -16160,107 +16763,51 @@ fi $as_echo "$ax_cv_PTHREAD_CLANG" >&6; } ax_pthread_clang="$ax_cv_PTHREAD_CLANG" -ax_pthread_clang_warning=no - -# Clang needs special handling, because older versions handle the -pthread -# option in a rather... idiosyncratic way -if test "x$ax_pthread_clang" = "xyes"; then +# GCC generally uses -pthread, or -pthreads on some platforms (e.g. SPARC) - # Clang takes -pthread; it has never supported any other flag +# Note that for GCC and Clang -pthread generally implies -lpthread, +# except when -nostdlib is passed. +# This is problematic using libtool to build C++ shared libraries with pthread: +# [1] https://gcc.gnu.org/bugzilla/show_bug.cgi?id=25460 +# [2] https://bugzilla.redhat.com/show_bug.cgi?id=661333 +# [3] https://bugs.debian.org/cgi-bin/bugreport.cgi?bug=468555 +# To solve this, first try -pthread together with -lpthread for GCC - # (Note 1: This will need to be revisited if a system that Clang - # supports has POSIX threads in a separate library. This tends not - # to be the way of modern systems, but it's conceivable.) +if test "x$GCC" = "xyes"; then : + ax_pthread_flags="-pthread,-lpthread -pthread -pthreads $ax_pthread_flags" +fi - # (Note 2: On some systems, notably Darwin, -pthread is not needed - # to get POSIX threads support; the API is always present and - # active. We could reasonably leave PTHREAD_CFLAGS empty. But - # -pthread does define _REENTRANT, and while the Darwin headers - # ignore this macro, third-party headers might not.) +# Clang takes -pthread (never supported any other flag), but we'll try with -lpthread first - PTHREAD_CFLAGS="-pthread" - PTHREAD_LIBS= +if test "x$ax_pthread_clang" = "xyes"; then : + ax_pthread_flags="-pthread,-lpthread -pthread" +fi - ax_pthread_ok=yes - # However, older versions of Clang make a point of warning the user - # that, in an invocation where only linking and no compilation is - # taking place, the -pthread option has no effect ("argument unused - # during compilation"). They expect -pthread to be passed in only - # when source code is being compiled. - # - # Problem is, this is at odds with the way Automake and most other - # C build frameworks function, which is that the same flags used in - # compilation (CFLAGS) are also used in linking. Many systems - # supported by AX_PTHREAD require exactly this for POSIX threads - # support, and in fact it is often not straightforward to specify a - # flag that is used only in the compilation phase and not in - # linking. Such a scenario is extremely rare in practice. - # - # Even though use of the -pthread flag in linking would only print - # a warning, this can be a nuisance for well-run software projects - # that build with -Werror. So if the active version of Clang has - # this misfeature, we search for an option to squash it. +# The presence of a feature test macro requesting re-entrant function +# definitions is, on some systems, a strong hint that pthreads support is +# correctly enabled - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 -$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } -if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : - $as_echo_n "(cached) " >&6 -else - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown - # Create an alternate version of $ac_link that compiles and - # links in two steps (.c -> .o, .o -> exe) instead of one - # (.c -> exe), because the warning occurs only in the second - # step - ax_pthread_save_ac_link="$ac_link" - ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' - ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` - ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" - ax_pthread_save_CFLAGS="$CFLAGS" - for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do - if test "x$ax_pthread_try" = "xunknown"; then : - break -fi - CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" - ac_link="$ax_pthread_save_ac_link" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(void){return 0;} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - ac_link="$ax_pthread_2step_ac_link" - cat confdefs.h - <<_ACEOF >conftest.$ac_ext -/* end confdefs.h. */ -int main(void){return 0;} -_ACEOF -if ac_fn_c_try_link "$LINENO"; then : - break -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext +case $host_os in + darwin* | hpux* | linux* | osf* | solaris*) + ax_pthread_check_macro="_REENTRANT" + ;; -fi -rm -f core conftest.err conftest.$ac_objext \ - conftest$ac_exeext conftest.$ac_ext - done - ac_link="$ax_pthread_save_ac_link" - CFLAGS="$ax_pthread_save_CFLAGS" - if test "x$ax_pthread_try" = "x"; then : - ax_pthread_try=no -fi - ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + aix*) + ax_pthread_check_macro="_THREAD_SAFE" + ;; + *) + ax_pthread_check_macro="--" + ;; +esac +if test "x$ax_pthread_check_macro" = "x--"; then : + ax_pthread_check_cond=0 +else + ax_pthread_check_cond="!defined($ax_pthread_check_macro)" fi -{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 -$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } - - case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in - no | unknown) ;; - *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; - esac -fi # $ax_pthread_clang = yes if test "x$ax_pthread_ok" = "xno"; then for ax_pthread_try_flag in $ax_pthread_flags; do @@ -16271,11 +16818,11 @@ for ax_pthread_try_flag in $ax_pthread_flags; do $as_echo_n "checking whether pthreads work without any flags... " >&6; } ;; - -mt,pthread) - { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with -mt -lpthread" >&5 -$as_echo_n "checking whether pthreads work with -mt -lpthread... " >&6; } - PTHREAD_CFLAGS="-mt" - PTHREAD_LIBS="-lpthread" + *,*) + PTHREAD_CFLAGS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\1/"` + PTHREAD_LIBS=`echo $ax_pthread_try_flag | sed "s/^\(.*\),\(.*\)$/\2/"` + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"" >&5 +$as_echo_n "checking whether pthreads work with \"$PTHREAD_CFLAGS\" and \"$PTHREAD_LIBS\"... " >&6; } ;; -*) @@ -16358,7 +16905,13 @@ $as_echo_n "checking for the pthreads library -l$ax_pthread_try_flag... " >&6; } # if $ax_pthread_check_cond # error "$ax_pthread_check_macro must be defined" # endif - static void routine(void *a) { a = 0; } + static void *some_global = NULL; + static void routine(void *a) + { + /* To avoid any unused-parameter or + unused-but-set-parameter warning. */ + some_global = a; + } static void *start_routine(void *a) { return a; } int main () @@ -16393,6 +16946,104 @@ fi done fi + +# Clang needs special handling, because older versions handle the -pthread +# option in a rather... idiosyncratic way + +if test "x$ax_pthread_clang" = "xyes"; then + + # Clang takes -pthread; it has never supported any other flag + + # (Note 1: This will need to be revisited if a system that Clang + # supports has POSIX threads in a separate library. This tends not + # to be the way of modern systems, but it's conceivable.) + + # (Note 2: On some systems, notably Darwin, -pthread is not needed + # to get POSIX threads support; the API is always present and + # active. We could reasonably leave PTHREAD_CFLAGS empty. But + # -pthread does define _REENTRANT, and while the Darwin headers + # ignore this macro, third-party headers might not.) + + # However, older versions of Clang make a point of warning the user + # that, in an invocation where only linking and no compilation is + # taking place, the -pthread option has no effect ("argument unused + # during compilation"). They expect -pthread to be passed in only + # when source code is being compiled. + # + # Problem is, this is at odds with the way Automake and most other + # C build frameworks function, which is that the same flags used in + # compilation (CFLAGS) are also used in linking. Many systems + # supported by AX_PTHREAD require exactly this for POSIX threads + # support, and in fact it is often not straightforward to specify a + # flag that is used only in the compilation phase and not in + # linking. Such a scenario is extremely rare in practice. + # + # Even though use of the -pthread flag in linking would only print + # a warning, this can be a nuisance for well-run software projects + # that build with -Werror. So if the active version of Clang has + # this misfeature, we search for an option to squash it. + + { $as_echo "$as_me:${as_lineno-$LINENO}: checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread" >&5 +$as_echo_n "checking whether Clang needs flag to prevent \"argument unused\" warning when linking with -pthread... " >&6; } +if ${ax_cv_PTHREAD_CLANG_NO_WARN_FLAG+:} false; then : + $as_echo_n "(cached) " >&6 +else + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG=unknown + # Create an alternate version of $ac_link that compiles and + # links in two steps (.c -> .o, .o -> exe) instead of one + # (.c -> exe), because the warning occurs only in the second + # step + ax_pthread_save_ac_link="$ac_link" + ax_pthread_sed='s/conftest\.\$ac_ext/conftest.$ac_objext/g' + ax_pthread_link_step=`$as_echo "$ac_link" | sed "$ax_pthread_sed"` + ax_pthread_2step_ac_link="($ac_compile) && (echo ==== >&5) && ($ax_pthread_link_step)" + ax_pthread_save_CFLAGS="$CFLAGS" + for ax_pthread_try in '' -Qunused-arguments -Wno-unused-command-line-argument unknown; do + if test "x$ax_pthread_try" = "xunknown"; then : + break +fi + CFLAGS="-Werror -Wunknown-warning-option $ax_pthread_try -pthread $ax_pthread_save_CFLAGS" + ac_link="$ax_pthread_save_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + ac_link="$ax_pthread_2step_ac_link" + cat confdefs.h - <<_ACEOF >conftest.$ac_ext +/* end confdefs.h. */ +int main(void){return 0;} +_ACEOF +if ac_fn_c_try_link "$LINENO"; then : + break +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + +fi +rm -f core conftest.err conftest.$ac_objext \ + conftest$ac_exeext conftest.$ac_ext + done + ac_link="$ax_pthread_save_ac_link" + CFLAGS="$ax_pthread_save_CFLAGS" + if test "x$ax_pthread_try" = "x"; then : + ax_pthread_try=no +fi + ax_cv_PTHREAD_CLANG_NO_WARN_FLAG="$ax_pthread_try" + +fi +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&5 +$as_echo "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" >&6; } + + case "$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG" in + no | unknown) ;; + *) PTHREAD_CFLAGS="$ax_cv_PTHREAD_CLANG_NO_WARN_FLAG $PTHREAD_CFLAGS" ;; + esac + +fi # $ax_pthread_clang = yes + + + # Various other checks: if test "x$ax_pthread_ok" = "xyes"; then ax_pthread_save_CFLAGS="$CFLAGS" @@ -16474,6 +17125,7 @@ int main () { int i = PTHREAD_PRIO_INHERIT; + return i; ; return 0; } @@ -16576,21 +17228,13 @@ test -n "$PTHREAD_CC" || PTHREAD_CC="$CC" if test "x$ax_pthread_ok" = "xyes"; then systhread_support=true otherlibraries="$otherlibraries systhreads" - case $host in #( - *-*-haiku*) : - pthread_link="" ;; #( - *-*-android*) : - pthread_link="" ;; #( - *) : - pthread_link="-lpthread" ;; -esac - common_cppflags="$common_cppflags -D_REENTRANT" + common_cflags="$common_cflags $PTHREAD_CFLAGS" { $as_echo "$as_me:${as_lineno-$LINENO}: the POSIX threads library is supported" >&5 $as_echo "$as_me: the POSIX threads library is supported" >&6;} saved_CFLAGS="$CFLAGS" saved_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$LIBS $pthread_link" + LIBS="$LIBS $PTHREAD_LIBS" ac_fn_c_check_func "$LINENO" "sigwait" "ac_cv_func_sigwait" if test "x$ac_cv_func_sigwait" = xyes; then : $as_echo "#define HAS_SIGWAIT 1" >>confdefs.h @@ -16636,6 +17280,7 @@ $as_echo_n "checking whether the assembler supports --debug-prefix-map... " >&6; saved_CC="$CC" saved_CFLAGS="$CFLAGS" saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" saved_ac_ext="$ac_ext" saved_ac_compile="$ac_compile" # Move the content of confdefs.h to another file so it does not @@ -16678,6 +17323,7 @@ rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext CPPFLAGS="$saved_CPPFLAGS" CFLAGS="$saved_CFLAGS" CC="$saved_CC" + LIBS="$saved_LIBS" @@ -16692,6 +17338,7 @@ else saved_CC="$CC" saved_CFLAGS="$CFLAGS" saved_CPPFLAGS="$CPPFLAGS" + saved_LIBS="$LIBS" saved_ac_ext="$ac_ext" saved_ac_compile="$ac_compile" # Move the content of confdefs.h to another file so it does not @@ -16757,6 +17404,7 @@ fi CPPFLAGS="$saved_CPPFLAGS" CFLAGS="$saved_CFLAGS" CC="$saved_CC" + LIBS="$saved_LIBS" if $aspp_ok && $as_ok; then : @@ -16820,7 +17468,8 @@ fi case "$arch","$system" in #( amd64,linux|amd64,macosx \ |amd64,openbsd|amd64,win64 \ - |amd64,freebsd|amd64,solaris) : + |amd64,freebsd|amd64,solaris \ + |arm64,linux|arm64,macosx) : naked_pointers_checker=true $as_echo "#define NAKED_POINTERS_CHECKER 1" >>confdefs.h ;; #( @@ -16929,7 +17578,31 @@ else ocamldoc=ocamldoc fi -case $enable_ocamltest,4.12.1 in #( +documentation_tool_cmd='' + +# Check whether --with-odoc was given. +if test "${with_odoc+set}" = set; then : + withval=$with_odoc; case $withval in #( + yes) : + documentation_tool='odoc' ;; #( + no) : + documentation_tool='ocamldoc' ;; #( + *) : + documentation_tool_cmd="$withval" + documentation_tool='odoc' ;; +esac +else + documentation_tool='ocamldoc' +fi + +if test "x$documentation_tool_cmd" = 'x' + documentation_tool_cmd="$documentation_tool"; then : + +fi + + + +case $enable_ocamltest,4.13.0 in #( yes,*|,*+dev*) : ocamltest='ocamltest' ;; #( *) : @@ -16948,6 +17621,12 @@ else flambda_invariants=false fi +if test x"$enable_cmm_invariants" = "xyes"; then : + cmm_invariants=true +else + cmm_invariants=false +fi + if test x"$enable_flat_float_array" = "xno"; then : flat_float_array=false else @@ -17045,7 +17724,7 @@ case $host in #( bytecclibs="advapi32.lib ws2_32.lib version.lib" nativecclibs="advapi32.lib ws2_32.lib version.lib" ;; #( *) : - bytecclibs="$cclibs $DLLIBS $pthread_link $instrumented_runtime_ldlibs" + bytecclibs="$cclibs $DLLIBS $PTHREAD_LIBS" nativecclibs="$cclibs $DLLIBS" ;; esac @@ -17071,24 +17750,6 @@ esac ;; #( windows_unicode=0 ;; esac -# Define flexlink chain and flags correctly for the different Windows ports -case $host in #( - i686-w64-mingw32) : - flexdll_chain='mingw' - flexlink_flags="-chain $flexdll_chain -stack 16777216" ;; #( - x86_64-w64-mingw32) : - flexdll_chain='mingw64' - flexlink_flags="-chain $flexdll_chain -stack 33554432" ;; #( - i686-pc-windows) : - flexdll_chain='msvc' - flexlink_flags="-merge-manifest -stack 16777216" ;; #( - x86_64-pc-windows) : - flexdll_chain='msvc64' - flexlink_flags="-x64 -merge-manifest -stack 33554432" ;; #( - *) : - ;; -esac - # Define default prefix correctly for the different Windows ports if test x"$prefix" = "xNONE"; then : case $host in #( @@ -17108,7 +17769,7 @@ else && test "$host_vendor-$host_os" != "$build_vendor-$build_os" ; then : case $build in #( *-pc-cygwin) : - prefix=`cygpath -m "$prefix"` ;; #( + prefix="$(LC_ALL=C.UTF-8 cygpath -m "$prefix")" ;; #( *) : ;; esac @@ -17119,7 +17780,14 @@ fi # but whose value is not guessed properly by configure # (all this should be understood and fixed) case $host in #( - *-*-mingw32|*-pc-windows) : + *-*-mingw32) : + $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h + + $as_echo "#define HAS_STRERROR 1" >>confdefs.h + + $as_echo "#define HAS_NICE 1" >>confdefs.h + ;; #( + *-pc-windows) : $as_echo "#define HAS_BROKEN_PRINTF 1" >>confdefs.h $as_echo "#define HAS_STRERROR 1" >>confdefs.h @@ -17143,6 +17811,9 @@ else stdlib_manpages=false fi +# Do not permanently cache the result of flexdll.h +unset ac_cv_header_flexdll_h + cat >confcache <<\_ACEOF # This file is a shell script that caches the results of configure # tests run on this system so they can be shared between configure @@ -17649,7 +18320,7 @@ cat >>$CONFIG_STATUS <<\_ACEOF || ac_write_fail=1 # report actual input values of CONFIG_FILES etc. instead of their # values after options handling. ac_log=" -This file was extended by OCaml $as_me 4.12.1, which was +This file was extended by OCaml $as_me 4.13.0, which was generated by GNU Autoconf 2.69. Invocation command line was CONFIG_FILES = $CONFIG_FILES @@ -17716,7 +18387,7 @@ _ACEOF cat >>$CONFIG_STATUS <<_ACEOF || ac_write_fail=1 ac_cs_config="`$as_echo "$ac_configure_args" | sed 's/^ //; s/[\\""\`\$]/\\\\&/g'`" ac_cs_version="\\ -OCaml config.status 4.12.1 +OCaml config.status 4.13.0 configured by $0, generated by GNU Autoconf 2.69, with options \\"\$ac_cs_config\\" diff --git a/configure.ac b/configure.ac index 656ffe20..3698c7cb 100644 --- a/configure.ac +++ b/configure.ac @@ -37,11 +37,13 @@ programs_man_section=1 libraries_man_section=3 # Command to build executalbes -# In general this command is supposed to use the CFLAGs-related variables -# ($OC_CFLAGS and $CFLAGS), but at the moment they are not taken into -# account on Windows, because flexlink, which is used to build -# executables on this platform, can not handle them. -mkexe="\$(CC) \$(OC_CFLAGS) \$(CFLAGS) \$(OC_LDFLAGS)" +# In general this command is supposed to use the CFLAGs- and LDFLAGS- +# related variables (OC_CFLAGS and OC_LDFLAGS for ocaml-specific +# flags, CFLAGS and LDFLAGS for generic flags chosen by the user), but +# at the moment they are not taken into account on Windows, because +# flexlink, which is used to build executables on this platform, can +# not handle them. +mkexe="\$(CC) \$(OC_CFLAGS) \$(CFLAGS) \$(OC_LDFLAGS) \$(LDFLAGS)" # Flags for building executable files with debugging symbols mkexedebugflag="-g" @@ -55,14 +57,14 @@ oc_ldflags="" oc_dll_ldflags="" with_sharedlibs=true ostype="Unix" -iflexdir="" SO="so" toolchain="cc" profinfo=false profinfo_width=0 extralibs= instrumented_runtime=false -instrumented_runtime_ldlibs="" +instrumented_runtime_libs="" +bootstrapping_flexdll=false # Information about the package @@ -114,7 +116,8 @@ AC_SUBST([bytecclibs]) AC_SUBST([nativecclibs]) AC_SUBST([ocamlc_cflags]) AC_SUBST([ocamlc_cppflags]) -AC_SUBST([iflexdir]) +AC_SUBST([flexdir]) +AC_SUBST([bootstrapping_flexdll]) AC_SUBST([long_shebang]) AC_SUBST([shebangscripts]) AC_SUBST([AR]) @@ -127,6 +130,7 @@ AC_SUBST([natdynlinkopts]) AC_SUBST([cmxs]) AC_SUBST([debug_runtime]) AC_SUBST([instrumented_runtime]) +AC_SUBST([instrumented_runtime_libs]) AC_SUBST([has_monotonic_clock]) AC_SUBST([otherlibraries]) AC_SUBST([cc_has_debug_prefix_map]) @@ -134,10 +138,9 @@ AC_SUBST([as_has_debug_prefix_map]) AC_SUBST([with_debugger]) # TODO: rename this variable AC_SUBST([with_camltex]) AC_SUBST([ocamldoc]) +AC_SUBST([documentation_tool]) +AC_SUBST([documentation_tool_cmd]) AC_SUBST([ocamltest]) -AC_SUBST([pthread_link]) -AC_SUBST([x_includes]) -AC_SUBST([x_libraries]) AC_SUBST([ASPP]) AC_SUBST([endianness]) AC_SUBST([AS]) @@ -154,6 +157,7 @@ AC_SUBST([profinfo_width]) AC_SUBST([frame_pointers]) AC_SUBST([flambda]) AC_SUBST([flambda_invariants]) +AC_SUBST([cmm_invariants]) AC_SUBST([windows_unicode]) AC_SUBST([flat_float_array]) AC_SUBST([function_sections]) @@ -266,6 +270,11 @@ AC_ARG_ENABLE([ocamldoc], [], [ocamldoc=auto]) +AC_ARG_WITH([odoc], + [AS_HELP_STRING([--with-odoc], + [build documentation with odoc])]) + + AC_ARG_ENABLE([ocamltest], [AS_HELP_STRING([--disable-ocamltest], [do not build the ocamltest driver])]) @@ -290,6 +299,11 @@ AC_ARG_ENABLE([cfi], [AS_HELP_STRING([--disable-cfi], [disable the CFI directives in assembly files])]) +AC_ARG_ENABLE([imprecise-c99-float-ops], + [AS_HELP_STRING([--enable-imprecise-c99-float-ops], + [enables potentially imprecise replacement implementations + of C99 float ops if unavailable on this platform])]) + AC_ARG_ENABLE([installing-source-artifacts], [AS_HELP_STRING([--enable-installing-source-artifacts], [install *.cmt* and *.mli files])]) @@ -309,6 +323,10 @@ AC_ARG_ENABLE([flambda-invariants], [AS_HELP_STRING([--enable-flambda-invariants], [enable invariants checks in flambda])]) +AC_ARG_ENABLE([cmm-invariants], + [AS_HELP_STRING([--enable-cmm-invariants], + [enable invariants checks in Cmm])]) + AC_ARG_WITH([target-bindir], [AS_HELP_STRING([--with-target-bindir], [location of binary programs on target system])]) @@ -382,6 +400,11 @@ AC_ARG_WITH([afl], [AS_HELP_STRING([--with-afl], [use the AFL fuzzer])]) +AC_ARG_WITH([flexdll], + [AS_HELP_STRING([--with-flexdll], + [bootstrap FlexDLL from the given sources])], + [AS_IF([test x"$withval" = 'xyes'],[with_flexdll=flexdll])]) + AS_IF([test x"$enable_unix_lib" = "xno"], [AS_IF([test x"$enable_debugger" = "xyes"], [AC_MSG_ERROR([replay debugger requires the unix library])], @@ -465,6 +488,10 @@ AS_CASE([$host], ## Find vendor of the C compiler OCAML_CC_VENDOR +## In cross-compilation mode, can we run executables produced? +# At the moment, it's required, but the fact is used in C99 function detection +OCAML_HOST_IS_EXECUTABLE + # Determine how to call the C preprocessor directly. # Most of the time, calling the C preprocessor through the C compiler is # desirable and even important. @@ -664,7 +691,115 @@ AS_CASE([$host], # [*-pc-windows], # [enable_shared=yes]) -AS_IF([test x"$enable_shared" = "xno"],[with_sharedlibs=false]) +AS_IF([test x"$enable_shared" = "xno"], + [with_sharedlibs=false + AS_CASE([$host], + [*-pc-windows|*-w64-mingw32], + [AC_MSG_ERROR([Cannot build native Win32 with --disable-shared])])]) + +# Define flexlink chain and flags correctly for the different Windows ports +AS_CASE([$host], + [i686-*-cygwin], + [flexdll_chain='cygwin' + flexlink_flags="-chain $flexdll_chain -merge-manifest -stack 16777216"], + [x86_64-*-cygwin], + [flexdll_chain='cygwin64' + flexlink_flags="-chain $flexdll_chain -merge-manifest -stack 16777216"], + [*-*-cygwin*], + [AC_MSG_ERROR([unknown cygwin variant])], + [i686-w64-mingw32], + [flexdll_chain='mingw' + flexlink_flags="-chain $flexdll_chain -stack 16777216"], + [x86_64-w64-mingw32], + [flexdll_chain='mingw64' + flexlink_flags="-chain $flexdll_chain -stack 33554432"], + [i686-pc-windows], + [flexdll_chain='msvc' + flexlink_flags="-merge-manifest -stack 16777216"], + [x86_64-pc-windows], + [flexdll_chain='msvc64' + flexlink_flags="-x64 -merge-manifest -stack 33554432"]) + +AS_IF([test x"$enable_shared" != 'xno'], [ + AC_MSG_CHECKING([for flexdll sources]) + AS_IF([test x"$with_flexdll" = "xno"], + [flexdir='' + AC_MSG_RESULT([disabled])], + [flexmsg='' + AS_CASE([$target], + [*-*-cygwin*|*-w64-mingw32|*-pc-windows], + [AS_IF([test x"$with_flexdll" = 'x' -o x"$with_flexdll" = 'xflexdll'], + [AS_IF([test -f 'flexdll/flexdll.h'], + [flexdir=flexdll + iflexdir='$(ROOTDIR)/flexdll' + with_flexdll="$iflexdir"], + [AS_IF([test x"$with_flexdll" != 'x'], + [AC_MSG_RESULT([requested but not available]) + AC_MSG_ERROR([exiting])])])], + [rm -rf flexdll-sources + AS_IF([test -f "$with_flexdll/flexdll.h"], + [mkdir -p flexdll-sources + cp -r "$with_flexdll"/* flexdll-sources/ + flexdir='flexdll-sources' + iflexdir='$(ROOTDIR)/flexdll-sources' + flexmsg=" (from $with_flexdll)"], + [AC_MSG_RESULT([requested but not available]) + AC_MSG_ERROR([exiting])])]) + AS_IF([test x"$flexdir" = 'x'], + [AC_MSG_RESULT([no])], + [AC_MSG_RESULT([$iflexdir$flexmsg]) + bootstrapping_flexdll=true + # The submodule should be searched *before* any other -I paths + internal_cppflags="-I $iflexdir $internal_cppflags"])], + [AS_IF([test x"$with_flexdll" != 'x'], + [AC_MSG_RESULT([requested but not supported]) + AC_MSG_ERROR([exiting])])])]) + + AC_CHECK_PROG([flexlink],[flexlink],[flexlink]) + + AS_IF([test -n "$flexlink" -a -z "$flexdir"],[ + OCAML_TEST_FLEXLINK([$flexlink], [$flexdll_chain], + [$internal_cppflags], [$host]) + + AS_CASE([$host], + [*-w64-mingw32|*-pc-windows], + [flexlink_where="$(cmd /c "$flexlink" -where 2>/dev/null)" + AS_IF([test -z "$flexlink_where"], + [AC_MSG_ERROR([$flexlink is not executable from a native Win32 process]) + ])]) + ]) + + OCAML_TEST_FLEXDLL_H([$flexdir]) + + AS_IF([test -n "$flexlink" -a x"$have_flexdll_h" = 'xno'], + [OCAML_TEST_FLEXLINK_WHERE([$flexlink]) + AS_IF([test "x$have_flexdll_h" = 'xyes'], + [internal_cppflags="$internal_cppflags -I \"$flexlink_where\""]) + ]) +]) + +AS_IF([test x"$have_flexdll_h" = 'xno'], + [AS_CASE([$host], + [*-*-cygwin*], + [AS_IF([$with_sharedlibs], + [with_sharedlibs=false + AC_MSG_WARN([flexdll.h not found: shared library support disabled.]) + ])], + [*-w64-mingw32|*-pc-windows], + [AC_MSG_ERROR([flexdll.h is required for native Win32])])]) + +AS_IF([test -z "$flexdir" -o x"$have_flexdll_h" = 'xno'], + [AS_CASE([$host], + [*-*-cygwin*], + [AS_IF([$with_sharedlibs], + [AS_IF([test -z "$flexlink"], + [with_sharedlibs=false + AC_MSG_WARN( + [flexlink/flexdll.h not found: shared library support disabled.]) + ])])], + [*-w64-mingw32|*-pc-windows], + [AS_IF([test -z "$flexlink"], + [AC_MSG_ERROR([flexlink is required for native Win32])])])]) AS_CASE([$CC,$host], [*,*-*-darwin*], @@ -672,39 +807,18 @@ AS_CASE([$CC,$host], AC_DEFINE([HAS_ARCH_CODE32], [1])], [*,*-*-haiku*], [mathlib=""], [*,*-*-cygwin*], - [AS_CASE([$target], - [i686-*], [flavor=cygwin], - [x86_64-*], [flavor=cygwin64], - [AC_MSG_ERROR([unknown cygwin variant])]) - common_cppflags="$common_cppflags -U_WIN32" + [common_cppflags="$common_cppflags -U_WIN32" AS_IF([$with_sharedlibs], - [flexlink="flexlink -chain $flavor -merge-manifest -stack 16777216" - flexdir=`$flexlink -where | tr -d '\015'` - AS_IF([test -z "$flexdir"], - [AC_MSG_WARN( - [flexlink not found: native shared libraries won't be available.] - ) - with_sharedlibs=false], - [iflexdir="-I\"$flexdir\"" - mkexe="$flexlink -exe" - mkexedebugflag="-link -g"] - )] - ) - AS_IF([! $with_sharedlibs], + [mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' + mkexedebugflag="-link -g"], [mkexe="$mkexe -Wl,--stack,16777216" oc_ldflags="-Wl,--stack,16777216"] ) ostype="Cygwin"], [*,*-*-mingw32], - [AS_IF([$with_sharedlibs], - [AS_CASE([$host], - [i686-*-*], [flexdll_chain="mingw"; oc_dll_ldflags="-static-libgcc"], - [x86_64-*-*], [flexdll_chain="mingw64"]) - flexlink="flexlink -chain $flexdll_chain -merge-manifest -stack 16777216" - flexdir=`$flexlink -where | tr -d '\015'` - AS_IF([test -z "$flexdir"], [flexdir='$(ROOTDIR)/flexdll']) - iflexdir="-I\"$flexdir\"" - mkexedebugflag="-link -g"]) + [AS_CASE([$host], + [i686-*-*], [oc_dll_ldflags="-static-libgcc"]) + mkexedebugflag="-link -g" ostype="Win32" toolchain="mingw" mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' @@ -715,15 +829,7 @@ AS_CASE([$CC,$host], ostype="Win32" mkexe='$(FLEXLINK) -exe $(if $(OC_LDFLAGS),-link "$(OC_LDFLAGS)")' oc_ldflags='/ENTRY:wmainCRTStartup' - AS_CASE([$host], - [i686-pc-windows], [flexdll_chain=msvc], - [x86_64-pc-windows], [flexdll_chain=msvc64]) - AS_IF([$with_sharedlibs], - [flexlink="flexlink -chain $flexdll_chain -merge-manifest -stack 16777216" - flexdir=`$flexlink -where | tr -d '\015'` - AS_IF([test -z "$flexdir"], [flexdir='$(ROOTDIR)/flexdll']) - iflexdir="-I\"$flexdir\"" - mkexedebugflag=''])], + mkexedebugflag=''], [*,x86_64-*-linux*], AC_DEFINE([HAS_ARCH_CODE32], [1]), [xlc*,powerpc-ibm-aix*], @@ -835,8 +941,9 @@ natdynlinkopts="" AS_IF([test x"$enable_shared" != "xno"], [AS_CASE([$host], [*-apple-darwin*], - [mksharedlib="$CC -shared -flat_namespace -undefined suppress \ - -Wl,-no_compact_unwind" + [mksharedlib="$CC -shared \ + -flat_namespace -undefined suppress -Wl,-no_compact_unwind \ + \$(LDFLAGS)" shared_libraries_supported=true], [*-*-mingw32], [mksharedlib='$(FLEXLINK)' @@ -850,13 +957,13 @@ AS_IF([test x"$enable_shared" != "xno"], mkmaindll='$(FLEXLINK) -maindll' shared_libraries_supported=$with_sharedlibs], [*-*-cygwin*], - [mksharedlib="$flexlink" - mkmaindll="$flexlink -maindll" - shared_libraries_supported=true], + [mksharedlib='$(FLEXLINK)' + mkmaindll='$(FLEXLINK) -maindll' + shared_libraries_supported=$with_sharedlibs], [powerpc-ibm-aix*], [AS_CASE([$ocaml_cv_cc_vendor], [xlc*], - [mksharedlib="$CC -qmkshrobj -G" + [mksharedlib="$CC -qmkshrobj -G \$(LDFLAGS)" shared_libraries_supported=true])], [*-*-solaris*], [sharedlib_cflags="-fPIC" @@ -868,8 +975,9 @@ AS_IF([test x"$enable_shared" != "xno"], |*-*-openbsd*|*-*-netbsd*|*-*-dragonfly*|*-*-gnu*|*-*-haiku*]], [sharedlib_cflags="-fPIC" AS_CASE([$CC,$host], - [gcc*,powerpc-*-linux*], [mksharedlib="$CC -shared -mbss-plt"], - [mksharedlib="$CC -shared"]) + [gcc*,powerpc-*-linux*], + [mksharedlib="$CC -shared -mbss-plt \$(LDFLAGS)"], + [mksharedlib="$CC -shared \$(LDFLAGS)"]) oc_ldflags="$oc_ldflags -Wl,-E" rpath="-Wl,-rpath," mksharedlibrpath="-Wl,-rpath," @@ -882,7 +990,7 @@ AS_IF([test -z "$mkmaindll"], [mkmaindll=$mksharedlib]) natdynlink=false -AS_IF([test x"$enable_shared" != "xno"], +AS_IF([test x"$shared_libraries_supported" = 'xtrue'], [AS_CASE(["$host"], [*-*-cygwin*], [natdynlink=true], [*-*-mingw32], [natdynlink=true], @@ -955,19 +1063,20 @@ AS_CASE([$host], [arch=power; AS_IF([$arch64],[model=ppc64],[model=ppc]); system=elf], [[s390x*-*-linux*]], [arch=s390x; model=z10; system=elf], - [armv6*-*-linux-gnueabihf], + # expected to match "gnueabihf" as well as "musleabihf" + [armv6*-*-linux-*eabihf], [arch=arm; model=armv6; system=linux_eabihf], - [armv7*-*-linux-gnueabihf], + [armv7*-*-linux-*eabihf], [arch=arm; model=armv7; system=linux_eabihf], - [armv8*-*-linux-gnueabihf], + [armv8*-*-linux-*eabihf], [arch=arm; model=armv8; system=linux_eabihf], - [armv8*-*-linux-gnueabi], + [armv8*-*-linux-*eabi], [arch=arm; model=armv8; system=linux_eabi], - [armv7*-*-linux-gnueabi], + [armv7*-*-linux-*eabi], [arch=arm; model=armv7; system=linux_eabi], - [armv6t2*-*-linux-gnueabi], + [armv6t2*-*-linux-*eabi], [arch=arm; model=armv6t2; system=linux_eabi], - [armv6*-*-linux-gnueabi], + [armv6*-*-linux-*eabi], [arch=arm; model=armv6; system=linux_eabi], [armv6*-*-freebsd*], [arch=arm; model=armv6; system=freebsd], @@ -975,13 +1084,13 @@ AS_CASE([$host], [arch=arm; model=armv6; system=netbsd], [earmv7*-*-netbsd*], [arch=arm; model=armv7; system=netbsd], - [armv5te*-*-linux-gnueabi], + [armv5te*-*-linux-*eabi], [arch=arm; model=armv5te; system=linux_eabi], - [armv5*-*-linux-gnueabi], + [armv5*-*-linux-*eabi], [arch=arm; model=armv5; system=linux_eabi], - [arm*-*-linux-gnueabihf], + [arm*-*-linux-*eabihf], [arch=arm; system=linux_eabihf], - [arm*-*-linux-gnueabi], + [arm*-*-linux-*eabi], [arch=arm; system=linux_eabi], [arm*-*-openbsd*], [arch=arm; system=bsd], @@ -1065,74 +1174,54 @@ AS_CASE([$arch], # ocamlopt generates PIC code or doesn't generate code at all [], [AS_CASE([$host], - [*-linux-musl], + # expected to match "*-linux-musl" as well as "*-linux-musleabi*" + [*-linux-musl*], # Alpine and other musl-based Linux distributions [common_cflags="-no-pie $common_cflags"], [])]) # Assembler -AS_IF([test -n "$host_alias"], [toolpref="${host_alias}-"], [toolpref=""]) - -# We first compute default values for as and aspp -# If values have been given by the user then they take precedence over -# those just computed -# One may want to check whether the user provided values first -# and only compute values if none has been provided - -AC_CHECK_TOOL([SYSTEM_AS],[as]) - -AS_CASE(["$arch,$system"], - [i386,win32], - [default_as="ml -nologo -coff -Cp -c -Fo"], - [amd64,win64], - [default_as="ml64 -nologo -Cp -c -Fo"], - [amd64,macosx], - [AS_CASE([$ocaml_cv_cc_vendor], - [clang-*], - [default_as='clang -arch x86_64 -Wno-trigraphs -c' - default_aspp='clang -arch x86_64 -Wno-trigraphs -c'], - [default_as="${toolpref}as -arch x86_64" - default_aspp="${toolpref}gcc -arch x86_64 -c"])], - [amd64,solaris], - [AS_CASE([$ocaml_cv_cc_vendor], - [sunc-*], - [AS_IF([test x"$SYSTEM_AS" = "x"], - [AC_MSG_ERROR([GNU as assembler is required.])], - [default_as="${toolpref}as --64" - default_aspp="${toolpref}cc -m64 -c"])], - [gcc-*], - [AS_IF([test x"$SYSTEM_AS" = "x"], - [default_as="${toolpref}gcc -m64 -c" - default_aspp="${toolpref}gcc -m64 -c"], - [default_as="${toolpref}as --64" - default_aspp="${toolpref}gcc -m64 -c"])])], - [power,elf], - [AS_CASE([$model], - [ppc64le], - [default_as="${toolpref}as -a64 -mpower8" - default_aspp="${toolpref}gcc -m64 -mcpu=powerpc64le -c"], - [ppc64], - [default_as="${toolpref}as -a64 -mppc64" - default_aspp="${toolpref}gcc -m64 -c"], - [ppc], - [default_as="${toolpref}as -mppc" - default_aspp="${toolpref}gcc -m32 -c"])], - [s390x,elf], - [default_as="${toolpref}as -m 64 -march=$model" - default_aspp="${toolpref}gcc -c -Wa,-march=$model"], - [*,freebsd], - [default_as="${toolpref}cc -c -Wno-trigraphs" - default_aspp="${toolpref}cc -c -Wno-trigraphs"], - [*,dragonfly], - [default_as="${toolpref}as" - default_aspp="${toolpref}cc -c"], - [amd64,*|arm,*|arm64,*|i386,*|riscv,*], - [AS_CASE([$ocaml_cv_cc_vendor], - [clang-*], [default_as="${toolpref}clang -c -Wno-trigraphs" - default_aspp="${toolpref}clang -c -Wno-trigraphs"], - [default_as="${toolpref}as" - default_aspp="${toolpref}gcc -c"])]) +AS_IF([test -n "$target_alias"], + [toolpref="${target_alias}-" + as_target="$target" + as_cpu="$target_cpu"], + [AS_IF([test -n "$host_alias"], + [toolpref="${host_alias}-" + as_target="$host" + as_cpu="$host_cpu"], + [toolpref="" + as_target="$build" + as_cpu="$build_cpu"])]) + +# Finding the assembler +# The OCaml build system distinguishes two different assemblers: +# 1. AS, used to assemble the code generated by the ocamlopt native compiler +# 2. ASPP, to assemble other assembly files that may require preprocessing +# In general, "$CC -c" is used as a default value for both AS and ASPP. +# On a few platforms (Windows) both values are overriden. +# On other platforms, (Linux with GCC) the assembler AS is called directly +# to avoiding forking a C compiler process for each compilation by ocamlopt. +# Both AS and ASPP can be overriden by the user. + +default_as="$CC -c" +default_aspp="$CC -c" + +AS_CASE([$as_target,$ocaml_cv_cc_vendor], + [*-*-linux*,gcc-*], + [AS_CASE([$as_cpu], + [x86_64|arm*|aarch64*|i[[3-6]]86|riscv*], + [default_as="${toolpref}as"])], + [i686-pc-windows,*], + [default_as="ml -nologo -coff -Cp -c -Fo" + default_aspp="$default_as"], + [x86_64-pc-windows,*], + [default_as="ml64 -nologo -Cp -c -Fo" + default_aspp="$default_as"], + [*-*-darwin*,clang-*], + [default_as="$default_as -Wno-trigraphs" + default_aspp="$default_as"], + []) AS_IF([test "$with_pic"], [fpic=true @@ -1159,25 +1248,31 @@ OCAML_SIGNAL_HANDLERS_SEMANTICS ## Check for C99 float ops -# Note: this was disabled on Windows but the autoconf-generated script -# does find the function it is looking for. -# however the fma test does not pass so we disable the feature -# for the moment, to be backward-compatible - -AS_CASE([$host], - [*-*-mingw32|*-pc-windows], [], - [has_c99_float_ops=true - AC_CHECK_FUNC([expm1], [], [has_c99_float_ops=false]) - AS_IF([$has_c99_float_ops], - [AC_CHECK_FUNC([log1p], [], [has_c99_float_ops=false])]) - AS_IF([$has_c99_float_ops], - [AC_CHECK_FUNC([hypot], [], [has_c99_float_ops=false])]) - AS_IF([$has_c99_float_ops], - [AC_CHECK_FUNC([fma], [ - AS_CASE([$target],[x86_64-*-cygwin],[],[AC_DEFINE([HAS_WORKING_FMA])])], - [has_c99_float_ops=false])]) - AS_IF([$has_c99_float_ops], - [AC_CHECK_FUNC([copysign], [AC_DEFINE([HAS_C99_FLOAT_OPS])])])]) +has_c99_float_ops=true +AC_CHECK_FUNCS(m4_normalize([expm1 log1p hypot fma exp2 log2 cbrt acosh asinh + atanh erf erfc trunc round copysign]), [], [has_c99_float_ops=false]) + +AS_IF([$has_c99_float_ops], + [AC_DEFINE([HAS_C99_FLOAT_OPS]) + # Check whether round works (known bug in mingw-w64) + OCAML_C99_CHECK_ROUND + # Check whether fma works (regressed in mingw-w64 8.0.0; present, but broken, + # in VS2013-2017 and present but unimplemented in Cygwin64) + OCAML_C99_CHECK_FMA], + [AS_IF([test x"$enable_imprecise_c99_float_ops" != "xyes" ], + [AS_CASE([$enable_imprecise_c99_float_ops,$ocaml_cv_cc_vendor], + [no,*], [hard_error=true], + [,msvc-*], [AS_IF([test "${ocaml_cv_cc_vendor#msvc-}" -lt 1800 ], + [hard_error=false], + [hard_error=true])], + [hard_error=true]) + AS_IF([test x"$hard_error" = 'xtrue'], + [AC_MSG_ERROR(m4_normalize([ + C99 float ops unavailable, enable replacements + with --enable-imprecise-c99-float-ops]))], + [AC_MSG_WARN(m4_normalize([ + C99 float ops unavailable, replacements enabled + (ancient Visual Studio)]))])])]) ## getrusage AC_CHECK_FUNC([getrusage], [AC_DEFINE([HAS_GETRUSAGE])]) @@ -1270,8 +1365,8 @@ but no proper monotonic clock source was found.]) [ instrumented_runtime=true AS_IF([test "x$ac_cv_search_clock_gettime" = "xnone required"], - [instrumented_runtime_ldlibs=""], - [instrumented_runtime_ldlibs=$ac_cv_search_clock_gettime] + [instrumented_runtime_libs=""], + [instrumented_runtime_libs=$ac_cv_search_clock_gettime] ) ], [yes,false,*], @@ -1292,37 +1387,37 @@ but no proper monotonic clock source was found.]) ## TODO: check whether the different libraries are really useful -sockets=false +sockets=true AS_CASE([$host], [*-*-mingw32|*-pc-windows], [cclibs="$cclibs -lws2_32" - sockets=true], + AC_SEARCH_LIBS([socket], [ws2_32])], [*-*-haiku], [cclibs="$cclibs -lnetwork" - sockets=true], + AC_SEARCH_LIBS([socket], [network])], [*-*-solaris*], [cclibs="$cclibs -lsocket -lnsl" - sockets=true], + AC_SEARCH_LIBS([socket], [socket]) + AC_SEARCH_LIBS([inet_ntop], [nsl])], [ - AC_CHECK_FUNC([socket]) - AC_CHECK_FUNC([socketpair]) - AC_CHECK_FUNC([bind]) - AC_CHECK_FUNC([listen]) - AC_CHECK_FUNC([accept]) - AC_CHECK_FUNC([connect]) - sockets=true + AC_CHECK_FUNCS( + [socket socketpair bind listen accept connect], + [], + [sockets=false]) ] ) AS_IF([$sockets], [AC_DEFINE([HAS_SOCKETS])]) -## socklen_t in sys/socket.h +## socklen_t -AC_CHECK_TYPE( - [socklen_t], - [AC_DEFINE([HAS_SOCKLEN_T])], [], - [#include ]) +AS_CASE([$host], + [*-*-mingw32|*-pc-windows], + [AC_CHECK_TYPE([socklen_t], [AC_DEFINE([HAS_SOCKLEN_T])], [], + [#include ])], + [AC_CHECK_TYPE([socklen_t], [AC_DEFINE([HAS_SOCKLEN_T])], [], + [#include ])]) AC_CHECK_FUNC([inet_aton], [AC_DEFINE([HAS_INET_ATON])]) @@ -1330,13 +1425,18 @@ AC_CHECK_FUNC([inet_aton], [AC_DEFINE([HAS_INET_ATON])]) ipv6=true -AC_CHECK_TYPE( - [struct sockaddr_in6], [], [ipv6=false], +AS_CASE([$host], + [*-*-mingw32|*-pc-windows], + [AC_CHECK_TYPE( + [struct sockaddr_in6], [], [ipv6=false], [#include ])], + [AC_CHECK_TYPE( + [struct sockaddr_in6], [], [ipv6=false], [ #include #include #include ] + )] ) AS_IF([$ipv6], @@ -1394,6 +1494,8 @@ AC_CHECK_FUNC([symlink], [AC_CHECK_FUNC([readlink], [AC_CHECK_FUNC([lstat], [AC_DEFINE([HAS_SYMLINK])])])]) +AC_CHECK_FUNC([realpath], [AC_DEFINE([HAS_REALPATH])]) + # wait AC_CHECK_FUNC( [waitpid], @@ -1502,7 +1604,7 @@ AS_CASE([$host], ## shared library support AS_IF([$shared_libraries_supported], [AS_CASE([$host], - [*-*-mingw32|*-pc-windows], + [*-*-mingw32|*-pc-windows|*-*-cygwin*], [supports_shared_libraries=$shared_libraries_supported; DLLIBS=""], [AC_CHECK_FUNC([dlopen], [supports_shared_libraries=true DLLIBS=""], @@ -1657,7 +1759,7 @@ AC_MSG_CHECKING([whether stack overflows can be detected]) AS_CASE([$arch,$system], [i386,linux_elf|amd64,linux|amd64,macosx \ - |amd64,openbsd|i386,bsd_elf], + |amd64,openbsd|i386,bsd_elf|arm64,linux|arm64,macosx], [AC_DEFINE([HAS_STACK_OVERFLOW_DETECTION]) AC_MSG_RESULT([yes])], [AC_MSG_RESULT([no])]) @@ -1675,16 +1777,12 @@ AS_IF([test x"$enable_systhreads" = "xno"], [AX_PTHREAD( [systhread_support=true otherlibraries="$otherlibraries systhreads" - AS_CASE([$host], - [*-*-haiku*], [pthread_link=""], - [*-*-android*], [pthread_link=""], - [pthread_link="-lpthread"]) - common_cppflags="$common_cppflags -D_REENTRANT" + common_cflags="$common_cflags $PTHREAD_CFLAGS" AC_MSG_NOTICE([the POSIX threads library is supported]) saved_CFLAGS="$CFLAGS" saved_LIBS="$LIBS" CFLAGS="$CFLAGS $PTHREAD_CFLAGS" - LIBS="$LIBS $pthread_link" + LIBS="$LIBS $PTHREAD_LIBS" AC_CHECK_FUNC([sigwait], [AC_DEFINE([HAS_SIGWAIT])]) LIBS="$saved_LIBS" CFLAGS="$saved_CFLAGS"], @@ -1731,7 +1829,8 @@ AS_IF([test x"$enable_naked_pointers_checker" = "xyes" ], AS_CASE(["$arch","$system"], [amd64,linux|amd64,macosx \ |amd64,openbsd|amd64,win64 \ - |amd64,freebsd|amd64,solaris], + |amd64,freebsd|amd64,solaris \ + |arm64,linux|arm64,macosx], [naked_pointers_checker=true AC_DEFINE([NAKED_POINTERS_CHECKER])], [*], @@ -1757,6 +1856,20 @@ AS_IF([test x"$enable_ocamldoc" = "xno"], [ocamldoc=""], [ocamldoc=ocamldoc]) +documentation_tool_cmd='' +AC_ARG_WITH([odoc], + [AS_HELP_STRING([--with-odoc])], + [AS_CASE([$withval], + [yes],[documentation_tool='odoc'], + [no],[documentation_tool='ocamldoc'], + [documentation_tool_cmd="$withval" + documentation_tool='odoc'])], + [documentation_tool='ocamldoc']) +AS_IF([test "x$documentation_tool_cmd" = 'x'] + [documentation_tool_cmd="$documentation_tool"]) + + + AS_CASE([$enable_ocamltest,AC_PACKAGE_VERSION], [yes,*|,*+dev*],[ocamltest='ocamltest'], [ocamltest='']) @@ -1769,6 +1882,10 @@ AS_IF([test x"$enable_flambda" = "xyes"], [flambda=false flambda_invariants=false]) +AS_IF([test x"$enable_cmm_invariants" = "xyes"], + [cmm_invariants=true], + [cmm_invariants=false]) + AS_IF([test x"$enable_flat_float_array" = "xno"], [flat_float_array=false], [AC_DEFINE([FLAT_FLOAT_ARRAY]) @@ -1833,7 +1950,7 @@ AS_CASE([$host], [*-pc-windows], [bytecclibs="advapi32.lib ws2_32.lib version.lib" nativecclibs="advapi32.lib ws2_32.lib version.lib"], - [bytecclibs="$cclibs $DLLIBS $pthread_link $instrumented_runtime_ldlibs" + [bytecclibs="$cclibs $DLLIBS $PTHREAD_LIBS" nativecclibs="$cclibs $DLLIBS"]) AS_IF([test x"$libdir" = x'${exec_prefix}/lib'], @@ -1852,21 +1969,6 @@ AS_CASE([$host], [AC_MSG_ERROR([unexpected windows unicode mode])])], [windows_unicode=0]) -# Define flexlink chain and flags correctly for the different Windows ports -AS_CASE([$host], - [i686-w64-mingw32], - [flexdll_chain='mingw' - flexlink_flags="-chain $flexdll_chain -stack 16777216"], - [x86_64-w64-mingw32], - [flexdll_chain='mingw64' - flexlink_flags="-chain $flexdll_chain -stack 33554432"], - [i686-pc-windows], - [flexdll_chain='msvc' - flexlink_flags="-merge-manifest -stack 16777216"], - [x86_64-pc-windows], - [flexdll_chain='msvc64' - flexlink_flags="-x64 -merge-manifest -stack 33554432"]) - # Define default prefix correctly for the different Windows ports AS_IF([test x"$prefix" = "xNONE"], [AS_CASE([$host], @@ -1877,13 +1979,17 @@ AS_IF([test x"$prefix" = "xNONE"], [AS_IF([test x"$unix_or_win32" = "xwin32" \ && test "$host_vendor-$host_os" != "$build_vendor-$build_os" ], [AS_CASE([$build], - [*-pc-cygwin], [prefix=`cygpath -m "$prefix"`])])]) + [*-pc-cygwin], [prefix="$(LC_ALL=C.UTF-8 cygpath -m "$prefix")"])])]) # Define a few macros that were defined in config/m-nt.h # but whose value is not guessed properly by configure # (all this should be understood and fixed) AS_CASE([$host], - [*-*-mingw32|*-pc-windows], + [*-*-mingw32], + [AC_DEFINE([HAS_BROKEN_PRINTF]) + AC_DEFINE([HAS_STRERROR]) + AC_DEFINE([HAS_NICE])], + [*-pc-windows], [AC_DEFINE([HAS_BROKEN_PRINTF]) AC_DEFINE([HAS_STRERROR]) AC_DEFINE([HAS_IPV6]) @@ -1896,4 +2002,7 @@ AS_CASE([$host], AS_IF([test x"$enable_stdlib_manpages" != "xno"], [stdlib_manpages=true],[stdlib_manpages=false]) +# Do not permanently cache the result of flexdll.h +unset ac_cv_header_flexdll_h + AC_OUTPUT diff --git a/debugger/Makefile b/debugger/Makefile index 3620fa88..32ef23b1 100644 --- a/debugger/Makefile +++ b/debugger/Makefile @@ -20,14 +20,11 @@ include $(ROOTDIR)/Makefile.best_binaries DYNLINKDIR=$(ROOTDIR)/otherlibs/dynlink UNIXDIR=$(ROOTDIR)/otherlibs/$(UNIXLIB) -CAMLRUN ?= $(ROOTDIR)/boot/ocamlrun -CAMLYACC ?= $(ROOTDIR)/yacc/ocamlyacc$(EXE) CAMLC=$(BEST_OCAMLC) -g -nostdlib -I $(ROOTDIR)/stdlib -COMPFLAGS=$(INCLUDES) -absname -w +a-4-9-41-42-44-45-48 -warn-error A \ +COMPFLAGS=$(INCLUDES) -absname -w +a-4-9-41-42-44-45-48-70 -warn-error +A \ -safe-string -strict-sequence -strict-formats LINKFLAGS=-linkall -I $(UNIXDIR) -I $(DYNLINKDIR) -CAMLLEX=$(BEST_OCAMLLEX) CAMLDEP=$(BEST_OCAMLDEP) DEPFLAGS=-slash DEPINCLUDES=$(INCLUDES) @@ -65,27 +62,20 @@ clean:: rm -f ocamldebug ocamldebug.exe rm -f *.cmo *.cmi -.SUFFIXES: -.SUFFIXES: .ml .cmo .mli .cmi - -.ml.cmo: +%.cmo: %.ml $(CAMLC) -c $(COMPFLAGS) $< -.mli.cmi: +%.cmi: %.mli $(CAMLC) -c $(COMPFLAGS) $< depend: beforedepend $(CAMLDEP) $(DEPFLAGS) $(DEPINCLUDES) *.mli *.ml \ | sed -e 's,$(UNIXDIR)/,$$(UNIXDIR)/,' > .depend -debugger_lexer.ml: debugger_lexer.mll - $(CAMLLEX) $(OCAMLLEX_FLAGS) $< clean:: rm -f debugger_lexer.ml beforedepend:: debugger_lexer.ml -debugger_parser.ml debugger_parser.mli: debugger_parser.mly - $(CAMLYACC) debugger_parser.mly clean:: rm -f debugger_parser.ml debugger_parser.mli beforedepend:: debugger_parser.ml debugger_parser.mli diff --git a/debugger/command_line.ml b/debugger/command_line.ml index 3884c3aa..db486e8d 100644 --- a/debugger/command_line.ml +++ b/debugger/command_line.ml @@ -799,7 +799,7 @@ let instr_list _ppf lexbuf = 1 | None -> begin try - max 1 (line - 10) + Int.max 1 (line - 10) with Out_of_range -> 1 end diff --git a/debugger/time_travel.ml b/debugger/time_travel.ml index 83cf23f4..fe6e8190 100644 --- a/debugger/time_travel.ml +++ b/debugger/time_travel.ml @@ -506,7 +506,7 @@ let rec back_to time time_max = let {c_time = t} = find_checkpoint_before (pre64 time_max) in - go_to (max time t); + go_to (Int64.max time t); let (new_time, break) = find_last_breakpoint time_max in if break <> None || (new_time <= time) then begin go_to new_time; @@ -520,7 +520,7 @@ let rec back_to time time_max = let step_backward duration = let time = current_time () in if time > _0 then - back_to (max _0 (time -- duration)) time + back_to (Int64.max _0 (time -- duration)) time (* Run the program from current time. *) (* Stop at the first breakpoint, or at the end of the program. *) diff --git a/driver/compenv.ml b/driver/compenv.ml index 8efe79e6..6d40f09e 100644 --- a/driver/compenv.ml +++ b/driver/compenv.ml @@ -221,6 +221,9 @@ let set_compiler_pass ppf ~name v flag ~filter = because they are not understood by some versions of OCaml. *) let can_discard = ref [] +let parse_warnings error v = + Option.iter Location.(prerr_alert none) @@ Warnings.parse_options error v + let read_one_param ppf position name v = let set name options s = setter ppf (fun b -> b) name options s in let clear name options s = setter ppf (fun b -> not b) name options s in @@ -277,11 +280,11 @@ let read_one_param ppf position name v = | "dstartup" -> set "dstartup" [ Clflags.keep_startup_file ] v (* warn-errors *) - | "we" | "warn-error" -> Warnings.parse_options true v + | "we" | "warn-error" -> parse_warnings true v (* warnings *) - | "w" -> Warnings.parse_options false v + | "w" -> parse_warnings false v (* warn-errors *) - | "wwe" -> Warnings.parse_options false v + | "wwe" -> parse_warnings false v (* alerts *) | "alert" -> Warnings.parse_alert_option v @@ -368,6 +371,8 @@ let read_one_param ppf position name v = set "flambda-verbose" [ dump_flambda_verbose ] v | "flambda-invariants" -> set "flambda-invariants" [ flambda_invariant_checks ] v + | "cmm-invariants" -> + set "cmm-invariants" [ cmm_invariants ] v | "linscan" -> set "linscan" [ use_linscan ] v | "insn-sched" -> set "insn-sched" [ insn_sched ] v @@ -600,6 +605,7 @@ let get_objfiles ~with_ocamlparam = else List.rev !objfiles +let has_linker_inputs = ref false @@ -635,8 +641,13 @@ let process_action | ProcessCFile name -> readenv ppf (Before_compile name); Location.input_name := name; - if Ccomp.compile_file name <> 0 then raise (Exit_with_status 2); - ccobjs := c_object_of_filename name :: !ccobjs + let obj_name = match !output_name with + | None -> c_object_of_filename name + | Some n -> n + in + if Ccomp.compile_file ?output:!output_name name <> 0 + then raise (Exit_with_status 2); + ccobjs := obj_name :: !ccobjs | ProcessObjects names -> ccobjs := names @ !ccobjs | ProcessDLLs names -> @@ -648,8 +659,10 @@ let process_action else if Filename.check_suffix name ".cmi" && !make_package then objfiles := name :: !objfiles else if Filename.check_suffix name Config.ext_obj - || Filename.check_suffix name Config.ext_lib then + || Filename.check_suffix name Config.ext_lib then begin + has_linker_inputs := true; ccobjs := name :: !ccobjs + end else if not !native_code && Filename.check_suffix name Config.ext_dll then dllibs := name :: !dllibs else @@ -687,14 +700,10 @@ let process_deferred_actions env = begin match final_output_name with | None -> () - | Some output_name -> + | Some _output_name -> if !compile_only then begin - if List.filter (function - | ProcessCFile name -> c_object_of_filename name <> output_name - | _ -> false) !deferred_actions <> [] then - fatal "Options -c and -o are incompatible when compiling C files"; - if List.length (List.filter (function + | ProcessCFile _ | ProcessImplementation _ | ProcessInterface _ -> true | _ -> false) !deferred_actions) > 1 then @@ -712,4 +721,33 @@ let process_deferred_actions env = !print_types || match !stop_after with | None -> false - | Some p -> Clflags.Compiler_pass.is_compilation_pass p; + | Some p -> Clflags.Compiler_pass.is_compilation_pass p + +(* This function is almost the same as [Arg.parse_expand], except + that [Arg.parse_expand] could not be used because it does not take a + reference for [arg_spec]. + We use a marker \000 for Arg.parse_and_expand_argv_dynamic + so we can split out error message from usage options, because + it always concatenates + error message with usage options *) +let parse_arguments ?(current=ref 0) argv f program = + try + Arg.parse_and_expand_argv_dynamic current argv Clflags.arg_spec f "\000" + with + | Arg.Bad err_msg -> + let usage_msg = create_usage_msg program in + let err_msg = err_msg + |> String.split_on_char '\000' + |> List.hd + |> String.trim in + Printf.eprintf "%s\n%s\n" err_msg usage_msg; + raise (Exit_with_status 2) + | Arg.Help msg -> + let err_msg = + msg + |> String.split_on_char '\000' + |> String.concat "" in + let help_msg = + Printf.sprintf "Usage: %s \nOptions are:" program in + Printf.printf "%s\n%s" help_msg err_msg; + raise (Exit_with_status 0) diff --git a/driver/compenv.mli b/driver/compenv.mli index 93a585dc..f849a9ce 100644 --- a/driver/compenv.mli +++ b/driver/compenv.mli @@ -37,6 +37,7 @@ val last_objfiles : string list ref val first_objfiles : string list ref val stop_early : bool ref +val has_linker_inputs : bool ref type filename = string @@ -79,3 +80,8 @@ val process_deferred_actions : string * (* ocaml module extension *) string -> (* ocaml library extension *) unit +(* [parse_arguments ?current argv anon_arg program] will parse the arguments, + using the arguments provided in [Clflags.arg_spec]. +*) +val parse_arguments : ?current:(int ref) + -> string array ref -> Arg.anon_fun -> string -> unit diff --git a/driver/compile.ml b/driver/compile.ml index ead46036..7a88388c 100644 --- a/driver/compile.ml +++ b/driver/compile.ml @@ -27,8 +27,8 @@ let interface ~source_file ~output_prefix = (** Bytecode compilation backend for .ml files. *) -let to_bytecode i (typedtree, coercion) = - (typedtree, coercion) +let to_bytecode i Typedtree.{structure; coercion; _} = + (structure, coercion) |> Profile.(record transl) (Translmod.transl_implementation i.module_name) |> Profile.(record ~accumulate:true generate) diff --git a/driver/compile.mli b/driver/compile.mli index 96895576..ec54f070 100644 --- a/driver/compile.mli +++ b/driver/compile.mli @@ -25,7 +25,7 @@ val implementation: val to_bytecode : Compile_common.info -> - Typedtree.structure * Typedtree.module_coercion -> + Typedtree.implementation -> Instruct.instruction list * Ident.Set.t (** [to_bytecode info typed] takes a typechecked implementation and returns its bytecode. diff --git a/driver/compile_common.mli b/driver/compile_common.mli index b43125d6..c2f29cbe 100644 --- a/driver/compile_common.mli +++ b/driver/compile_common.mli @@ -68,17 +68,14 @@ val interface : info -> unit val parse_impl : info -> Parsetree.structure (** [parse_impl info] parses an implementation (usually an [.ml] file). *) -val typecheck_impl : - info -> Parsetree.structure -> Typedtree.structure * Typedtree.module_coercion +val typecheck_impl : info -> Parsetree.structure -> Typedtree.implementation (** [typecheck_impl info parsetree] typechecks an implementation and returns - the typedtree of the associated module, along with a coercion against - its public interface. + the typedtree of the associated module, its public interface, and a + coercion against that public interface. *) val implementation : - info -> - backend:(info -> Typedtree.structure * Typedtree.module_coercion -> unit) -> - unit + info -> backend:(info -> Typedtree.implementation -> unit) -> unit (** The complete compilation pipeline for implementations. *) (** {2 Build artifacts} *) diff --git a/driver/main_args.ml b/driver/main_args.ml index d5a4ca42..3c6faac7 100644 --- a/driver/main_args.ml +++ b/driver/main_args.ml @@ -77,7 +77,7 @@ let mk_config f = let mk_config_var f = "-config-var", Arg.String f, - " Print the value of a configuration variable, a newline, and exit\n\ + " Print the value of a configuration variable, without a newline, and exit\n\ \ (print nothing and exit with error value if the variable does not exist)" ;; @@ -686,7 +686,7 @@ let mk_nopervasives f = let mk_match_context_rows f = "-match-context-rows", Arg.Int f, - let[@manual.ref "s:comp-options"] chapter, section = 9, 2 in + let[@manual.ref "s:comp-options"] chapter, section = 11, 2 in Printf.sprintf " (advanced, see manual section %d.%d.)" chapter section ;; @@ -779,6 +779,10 @@ let mk_dcamlprimc f = "-dcamlprimc", Arg.Unit f, " (undocumented)" ;; +let mk_dcmm_invariants f = + "-dcmm-invariants", Arg.Unit f, " Extra sanity checks on Cmm" +;; + let mk_dcmm f = "-dcmm", Arg.Unit f, " (undocumented)" ;; @@ -799,16 +803,6 @@ let mk_dlive f = "-dlive", Arg.Unit f, " (undocumented)" ;; -let mk_davail f = - "-davail", Arg.Unit f, " Print register availability info when printing \ - liveness" -;; - -let mk_drunavail f = - "-drunavail", Arg.Unit f, " Run register availability pass (for testing \ - only; needs -g)" -;; - let mk_dspill f = "-dspill", Arg.Unit f, " (undocumented)" ;; @@ -1087,13 +1081,12 @@ module type Optcommon_options = sig val _dflambda_verbose : unit -> unit val _drawclambda : unit -> unit val _dclambda : unit -> unit + val _dcmm_invariants : unit -> unit val _dcmm : unit -> unit val _dsel : unit -> unit val _dcombine : unit -> unit val _dcse : unit -> unit val _dlive : unit -> unit - val _davail : unit -> unit - val _drunavail : unit -> unit val _dspill : unit -> unit val _dsplit : unit -> unit val _dinterf : unit -> unit @@ -1445,6 +1438,7 @@ struct mk_dlambda F._dlambda; mk_drawclambda F._drawclambda; mk_dclambda F._dclambda; + mk_dcmm_invariants F._dcmm_invariants; mk_dflambda F._dflambda; mk_drawflambda F._drawflambda; mk_dflambda_invariants F._dflambda_invariants; @@ -1456,8 +1450,6 @@ struct mk_dcombine F._dcombine; mk_dcse F._dcse; mk_dlive F._dlive; - mk_davail F._davail; - mk_drunavail F._drunavail; mk_dspill F._dspill; mk_dsplit F._dsplit; mk_dinterf F._dinterf; @@ -1555,6 +1547,7 @@ module Make_opttop_options (F : Opttop_options) = struct mk_drawlambda F._drawlambda; mk_drawclambda F._drawclambda; mk_dclambda F._dclambda; + mk_dcmm_invariants F._dcmm_invariants; mk_drawflambda F._drawflambda; mk_dflambda F._dflambda; mk_dcmm F._dcmm; @@ -1562,8 +1555,6 @@ module Make_opttop_options (F : Opttop_options) = struct mk_dcombine F._dcombine; mk_dcse F._dcse; mk_dlive F._dlive; - mk_davail F._davail; - mk_drunavail F._drunavail; mk_dspill F._dspill; mk_dsplit F._dsplit; mk_dinterf F._dinterf; @@ -1700,7 +1691,8 @@ module Default = struct let _strict_sequence = set strict_sequence let _unboxed_types = set unboxed_types let _unsafe_string = set unsafe_string - let _w s = Warnings.parse_options false s + let _w s = + Warnings.parse_options false s |> Option.iter Location.(prerr_alert none) let anonymous = Compenv.anonymous @@ -1724,7 +1716,8 @@ module Default = struct let _nopervasives = set nopervasives let _ppx s = Compenv.first_ppx := (s :: (!Compenv.first_ppx)) let _unsafe = set unsafe - let _warn_error s = Warnings.parse_options true s + let _warn_error s = + Warnings.parse_options true s |> Option.iter Location.(prerr_alert none) let _warn_help = Warnings.help_warnings end @@ -1734,9 +1727,9 @@ module Default = struct let _classic_inlining () = classic_inlining := true let _compact = clear optimize_for_speed let _dalloc = set dump_regalloc - let _davail () = dump_avail := true let _dclambda = set dump_clambda let _dcmm = set dump_cmm + let _dcmm_invariants = set cmm_invariants let _dcombine = set dump_combine let _dcse = set dump_cse let _dflambda = set dump_flambda @@ -1753,7 +1746,6 @@ module Default = struct let _drawclambda = set dump_rawclambda let _drawflambda = set dump_rawflambda let _dreload = set dump_reload - let _drunavail () = debug_runavail := true let _dscheduling = set dump_scheduling let _dsel = set dump_selection let _dspill = set dump_spill diff --git a/driver/main_args.mli b/driver/main_args.mli index 27fb475a..2e814ca0 100644 --- a/driver/main_args.mli +++ b/driver/main_args.mli @@ -203,13 +203,12 @@ module type Optcommon_options = sig val _dflambda_verbose : unit -> unit val _drawclambda : unit -> unit val _dclambda : unit -> unit + val _dcmm_invariants : unit -> unit val _dcmm : unit -> unit val _dsel : unit -> unit val _dcombine : unit -> unit val _dcse : unit -> unit val _dlive : unit -> unit - val _davail : unit -> unit - val _drunavail : unit -> unit val _dspill : unit -> unit val _dsplit : unit -> unit val _dinterf : unit -> unit diff --git a/driver/maindriver.ml b/driver/maindriver.ml index 81d7edfd..c0d2e8e5 100644 --- a/driver/maindriver.ml +++ b/driver/maindriver.ml @@ -15,18 +15,18 @@ open Clflags -let usage = "Usage: ocamlc \nOptions are:" module Options = Main_args.Make_bytecomp_options (Main_args.Default.Main) let main argv ppf = + let program = "ocamlc" in Clflags.add_arguments __LOC__ Options.list; Clflags.add_arguments __LOC__ ["-depend", Arg.Unit Makedepend.main_from_option, " Compute dependencies (use 'ocamlc -depend -help' for details)"]; match Compenv.readenv ppf Before_args; - Clflags.parse_arguments argv Compenv.anonymous usage; + Compenv.parse_arguments (ref argv) Compenv.anonymous program; Compmisc.read_clflags_from_env (); if !Clflags.plugin then Compenv.fatal "-plugin is only supported up to OCaml 4.08.0"; @@ -40,7 +40,7 @@ let main argv ppf = with Arg.Bad msg -> begin prerr_endline msg; - Clflags.print_arguments usage; + Clflags.print_arguments program; exit 2 end end; diff --git a/driver/makedepend.ml b/driver/makedepend.ml index 481b6507..e8339cf5 100644 --- a/driver/makedepend.ml +++ b/driver/makedepend.ml @@ -591,81 +591,87 @@ let run_main argv = let dep_args_rev : dep_arg list ref = ref [] in let add_dep_arg f s = dep_args_rev := (f s) :: !dep_args_rev in Clflags.classic := false; - Compenv.readenv ppf Before_args; - Clflags.reset_arguments (); (* reset arguments from ocamlc/ocamlopt *) - Clflags.add_arguments __LOC__ [ - "-absname", Arg.Set Clflags.absname, + try + Compenv.readenv ppf Before_args; + Clflags.reset_arguments (); (* reset arguments from ocamlc/ocamlopt *) + Clflags.add_arguments __LOC__ [ + "-absname", Arg.Set Clflags.absname, " Show absolute filenames in error messages"; - "-all", Arg.Set all_dependencies, + "-all", Arg.Set all_dependencies, " Generate dependencies on all files"; - "-allow-approx", Arg.Set allow_approximation, + "-allow-approx", Arg.Set allow_approximation, " Fallback to a lexer-based approximation on unparsable files"; - "-as-map", Arg.Set Clflags.transparent_modules, - " Omit delayed dependencies for module aliases (-no-alias-deps -w -49)"; - (* "compiler uses -no-alias-deps, and no module is coerced"; *) - "-debug-map", Arg.Set debug, + "-as-map", Arg.Set Clflags.transparent_modules, + " Omit delayed dependencies for module aliases (-no-alias-deps -w -49)"; + (* "compiler uses -no-alias-deps, and no module is coerced"; *) + "-debug-map", Arg.Set debug, " Dump the delayed dependency map for each map file"; - "-I", Arg.String (add_to_list Clflags.include_dirs), + "-I", Arg.String (add_to_list Clflags.include_dirs), " Add to the list of include directories"; - "-nocwd", Arg.Set nocwd, + "-nocwd", Arg.Set nocwd, " Do not add current working directory to \ the list of include directories"; - "-impl", Arg.String (add_dep_arg (fun f -> Src (f, Some ML))), + "-impl", Arg.String (add_dep_arg (fun f -> Src (f, Some ML))), " Process as a .ml file"; - "-intf", Arg.String (add_dep_arg (fun f -> Src (f, Some MLI))), + "-intf", Arg.String (add_dep_arg (fun f -> Src (f, Some MLI))), " Process as a .mli file"; - "-map", Arg.String (add_dep_arg (fun f -> Map f)), + "-map", Arg.String (add_dep_arg (fun f -> Map f)), " Read and propagate delayed dependencies to following files"; - "-ml-synonym", Arg.String(add_to_synonym_list ml_synonyms), + "-ml-synonym", Arg.String(add_to_synonym_list ml_synonyms), " Consider as a synonym of the .ml extension"; - "-mli-synonym", Arg.String(add_to_synonym_list mli_synonyms), + "-mli-synonym", Arg.String(add_to_synonym_list mli_synonyms), " Consider as a synonym of the .mli extension"; - "-modules", Arg.Set raw_dependencies, + "-modules", Arg.Set raw_dependencies, " Print module dependencies in raw form (not suitable for make)"; - "-native", Arg.Set native_only, + "-native", Arg.Set native_only, " Generate dependencies for native-code only (no .cmo files)"; - "-bytecode", Arg.Set bytecode_only, + "-bytecode", Arg.Set bytecode_only, " Generate dependencies for bytecode-code only (no .cmx files)"; - "-one-line", Arg.Set one_line, + "-one-line", Arg.Set one_line, " Output one line per file, regardless of the length"; - "-open", Arg.String (add_to_list Clflags.open_modules), + "-open", Arg.String (add_to_list Clflags.open_modules), " Opens the module before typing"; - "-plugin", Arg.String(fun _p -> Clflags.plugin := true), - " (no longer supported)"; - "-pp", Arg.String(fun s -> Clflags.preprocessor := Some s), - " Pipe sources through preprocessor "; - "-ppx", Arg.String (add_to_list Compenv.first_ppx), - " Pipe abstract syntax trees through preprocessor "; - "-shared", Arg.Set shared, - " Generate dependencies for native plugin files (.cmxs targets)"; - "-slash", Arg.Set Clflags.force_slash, - " (Windows) Use forward slash / instead of backslash \\ in file paths"; - "-sort", Arg.Set sort_files, + "-plugin", Arg.String(fun _p -> Clflags.plugin := true), + " (no longer supported)"; + "-pp", Arg.String(fun s -> Clflags.preprocessor := Some s), + " Pipe sources through preprocessor "; + "-ppx", Arg.String (add_to_list Compenv.first_ppx), + " Pipe abstract syntax trees through preprocessor "; + "-shared", Arg.Set shared, + " Generate dependencies for native plugin files (.cmxs targets)"; + "-slash", Arg.Set Clflags.force_slash, + " (Windows) Use forward slash / instead of backslash \\ in file paths"; + "-sort", Arg.Set sort_files, " Sort files according to their dependencies"; - "-version", Arg.Unit print_version, - " Print version and exit"; - "-vnum", Arg.Unit print_version_num, - " Print version number and exit"; - "-args", Arg.Expand Arg.read_arg, - " Read additional newline separated command line arguments \n\ - \ from "; - "-args0", Arg.Expand Arg.read_arg0, - " Read additional NUL separated command line arguments from \n\ - \ " - ]; - let usage = - Printf.sprintf "Usage: %s [options] \nOptions are:" - (Filename.basename Sys.argv.(0)) - in - Clflags.parse_arguments argv (add_dep_arg (fun f -> Src (f, None))) usage; - process_dep_args (List.rev !dep_args_rev); - Compenv.readenv ppf Before_link; - if !sort_files then sort_files_by_dependencies !files - else List.iter print_file_dependencies (List.sort compare !files); - exit (if Error_occurred.get () then 2 else 0) + "-version", Arg.Unit print_version, + " Print version and exit"; + "-vnum", Arg.Unit print_version_num, + " Print version number and exit"; + "-args", Arg.Expand Arg.read_arg, + " Read additional newline separated command line arguments \n\ + \ from "; + "-args0", Arg.Expand Arg.read_arg0, + " Read additional NUL separated command line arguments from \n\ + \ " + ]; + let program = Filename.basename Sys.argv.(0) in + Compenv.parse_arguments (ref argv) + (add_dep_arg (fun f -> Src (f, None))) program; + process_dep_args (List.rev !dep_args_rev); + Compenv.readenv ppf Before_link; + if !sort_files then sort_files_by_dependencies !files + else List.iter print_file_dependencies (List.sort compare !files); + (if Error_occurred.get () then 2 else 0) + with + | Compenv.Exit_with_status n -> + n + | exn -> + Location.report_exception ppf exn; + 2 + let main () = - run_main Sys.argv + exit (run_main Sys.argv) let main_from_option () = if Sys.argv.(1) <> "-depend" then begin @@ -677,4 +683,4 @@ let main_from_option () = Array.concat [ [| Sys.argv.(0) ^ " -depend" |]; Array.sub Sys.argv 2 (Array.length Sys.argv - 2) ] in Sys.argv.(0) <- args.(0); - run_main args + exit (run_main args) diff --git a/driver/optcompile.ml b/driver/optcompile.ml index 693a35f4..44aa91c9 100644 --- a/driver/optcompile.ml +++ b/driver/optcompile.ml @@ -31,14 +31,14 @@ let (|>>) (x, y) f = (x, f y) (** Native compilation backend for .ml files. *) -let flambda i backend typed = +let flambda i backend Typedtree.{structure; coercion; _} = if !Clflags.classic_inlining then begin Clflags.default_simplify_rounds := 1; Clflags.use_inlining_arguments_set Clflags.classic_arguments; Clflags.unbox_free_vars_of_closures := false; Clflags.unbox_specialised_args := false end; - typed + (structure, coercion) |> Profile.(record transl) (Translmod.transl_implementation_flambda i.module_name) |> Profile.(record generate) @@ -59,16 +59,15 @@ let flambda i backend typed = in Asmgen.compile_implementation ~backend - ~filename:i.source_file ~prefixname:i.output_prefix ~middle_end:Flambda_middle_end.lambda_to_clambda ~ppf_dump:i.ppf_dump program); Compilenv.save_unit_info (cmx i)) -let clambda i backend typed = +let clambda i backend Typedtree.{structure; coercion; _} = Clflags.use_inlining_arguments_set Clflags.classic_arguments; - typed + (structure, coercion) |> Profile.(record transl) (Translmod.transl_store_implementation i.module_name) |> print_if i.ppf_dump Clflags.dump_rawlambda Printlambda.program @@ -79,7 +78,6 @@ let clambda i backend typed = |> print_if i.ppf_dump Clflags.dump_lambda Printlambda.program |> Asmgen.compile_implementation ~backend - ~filename:i.source_file ~prefixname:i.output_prefix ~middle_end:Closure_middle_end.lambda_to_clambda ~ppf_dump:i.ppf_dump; diff --git a/driver/optcompile.mli b/driver/optcompile.mli index f04e75e6..8f4a3127 100644 --- a/driver/optcompile.mli +++ b/driver/optcompile.mli @@ -27,7 +27,7 @@ val implementation: val clambda : Compile_common.info -> (module Backend_intf.S) -> - Typedtree.structure * Typedtree.module_coercion -> unit + Typedtree.implementation -> unit (** [clambda info typed] applies the regular compilation pipeline to the given typechecked implementation and outputs the resulting files. *) @@ -35,7 +35,7 @@ val clambda : val flambda : Compile_common.info -> (module Backend_intf.S) -> - Typedtree.structure * Typedtree.module_coercion -> unit + Typedtree.implementation -> unit (** [flambda info backend typed] applies the Flambda compilation pipeline to the given typechecked implementation and outputs the resulting files. *) diff --git a/driver/optmaindriver.ml b/driver/optmaindriver.ml index 9986a5a5..30c5cb1d 100644 --- a/driver/optmaindriver.ml +++ b/driver/optmaindriver.ml @@ -33,11 +33,11 @@ module Backend = struct end let backend = (module Backend : Backend_intf.S) -let usage = "Usage: ocamlopt \nOptions are:" module Options = Main_args.Make_optcomp_options (Main_args.Default.Optmain) let main argv ppf = native_code := true; + let program = "ocamlopt" in match Compenv.readenv ppf Before_args; Clflags.add_arguments __LOC__ (Arch.command_line_options @ Options.list); @@ -45,7 +45,7 @@ let main argv ppf = ["-depend", Arg.Unit Makedepend.main_from_option, " Compute dependencies \ (use 'ocamlopt -depend -help' for details)"]; - Clflags.parse_arguments argv Compenv.anonymous usage; + Compenv.parse_arguments (ref argv) Compenv.anonymous program; Compmisc.read_clflags_from_env (); if !Clflags.plugin then Compenv.fatal "-plugin is only supported up to OCaml 4.08.0"; @@ -59,7 +59,7 @@ let main argv ppf = with Arg.Bad msg -> begin prerr_endline msg; - Clflags.print_arguments usage; + Clflags.print_arguments program; exit 2 end end; @@ -106,7 +106,8 @@ let main argv ppf = (Compenv.get_objfiles ~with_ocamlparam:false) target); Warnings.check_fatal (); end - else if not !Compenv.stop_early && !objfiles <> [] then begin + else if not !Compenv.stop_early && + (!objfiles <> [] || !Compenv.has_linker_inputs) then begin let target = if !output_c_object then let s = Compenv.extract_output !output_name in diff --git a/dune b/dune index aa026eb5..b4cb0142 100644 --- a/dune +++ b/dune @@ -26,7 +26,6 @@ (copy_files# bytecomp/*.ml{,i}) (copy_files# driver/*.ml{,i}) (copy_files# asmcomp/*.ml{,i}) -(copy_files# asmcomp/debug/*.ml{,i}) (copy_files# file_formats/*.ml{,i}) (copy_files# lambda/*.ml{,i}) (copy_files# middle_end/*.ml{,i}) @@ -46,6 +45,7 @@ config build_path_prefix_map misc identifiable numbers arg_helper clflags profile terminfo ccomp warnings consistbl strongly_connected_components targetint load_path int_replace_polymorphic_compare binutils local_store + lazy_backtrack diffing ;; PARSING location longident docstrings syntaxerr ast_helper camlinternalMenhirLib @@ -56,9 +56,10 @@ ;; TYPING ident path primitive types btype oprint subst predef datarepr - cmi_format persistent_env env type_immediacy + cmi_format persistent_env env type_immediacy errortrace typedtree printtyped ctype printtyp includeclass mtype envaux includecore - tast_iterator tast_mapper cmt_format untypeast includemod + tast_iterator tast_mapper signature_group cmt_format untypeast + includemod includemod_errorprinter typetexp patterns printpat parmatch stypes typedecl typeopt rec_check typecore typeclass typemod typedecl_variance typedecl_properties typedecl_immediacy @@ -91,7 +92,7 @@ bytegen bytelibrarian bytelink bytepackager emitcode printinstr ;; driver/ - errors compile + errors compile maindriver )) (library @@ -144,23 +145,26 @@ (wrapped false) (flags (:standard -principal -nostdlib)) (libraries stdlib ocamlcommon ocamlmiddleend) - (modules_without_implementation x86_ast) + (modules_without_implementation x86_ast emitenv) (modules ;; asmcomp/ afl_instrument arch asmgen asmlibrarian asmlink asmpackager branch_relaxation branch_relaxation_intf cmm_helpers cmm cmmgen cmmgen_state coloring comballoc + cmm_invariants CSE CSEgen - deadcode domainstate emit emitaux interf interval linear linearize linscan + dataflow deadcode domainstate + emit emitaux emitenv + interf interval + linear linearize linscan liveness mach printcmm printlinear printmach proc reg reload reloadgen schedgen scheduling selectgen selection spill split strmatch x86_ast x86_dsl x86_gas x86_masm x86_proc - ;; asmcomp/debug/ - reg_availability_set compute_ranges_intf available_regs reg_with_debug_info - compute_ranges + ;; file_formats/ + linear_format ;; driver/ - optcompile opterrors + optcompile opterrors optmaindriver ) ) diff --git a/lambda/generate_runtimedef.sh b/lambda/generate_runtimedef.sh index d1bef18f..53b8b575 100755 --- a/lambda/generate_runtimedef.sh +++ b/lambda/generate_runtimedef.sh @@ -15,6 +15,9 @@ #* * #************************************************************************** +# #10332: the meaning of character range a-z depends on the locale, so force C +# locale throughout. +export LC_ALL=C echo 'let builtin_exceptions = [|' tr -d '\r' < "$1" | sed -n -e 's|.*/\* \("[A-Za-z_]*"\) \*/$| \1;|p' echo '|]' diff --git a/lambda/lambda.ml b/lambda/lambda.ml index 71067851..ed7aa426 100644 --- a/lambda/lambda.ml +++ b/lambda/lambda.ml @@ -40,12 +40,9 @@ type is_safe = | Unsafe type primitive = - | Pidentity | Pbytes_to_string | Pbytes_of_string | Pignore - | Prevapply - | Pdirapply (* Globals *) | Pgetglobal of Ident.t | Psetglobal of Ident.t @@ -181,14 +178,7 @@ and raise_kind = | Raise_reraise | Raise_notrace -let equal_boxed_integer x y = - match x, y with - | Pnativeint, Pnativeint - | Pint32, Pint32 - | Pint64, Pint64 -> - true - | (Pnativeint | Pint32 | Pint64), _ -> - false +let equal_boxed_integer = Primitive.equal_boxed_integer let equal_primitive = (* Should be implemented like [equal_value_kind] of [equal_boxed_integer], @@ -259,7 +249,7 @@ type local_attribute = type function_kind = Curried | Tupled -type let_kind = Strict | Alias | StrictOpt | Variable +type let_kind = Strict | Alias | StrictOpt type meth_kind = Self | Public | Cached @@ -284,10 +274,12 @@ type scoped_location = Debuginfo.Scoped_location.t type lambda = Lvar of Ident.t + | Lmutvar of Ident.t | Lconst of structured_constant | Lapply of lambda_apply | Lfunction of lfunction | Llet of let_kind * value_kind * Ident.t * lambda * lambda + | Lmutlet of value_kind * Ident.t * lambda * lambda | Lletrec of (Ident.t * lambda) list * lambda | Lprim of primitive * lambda list * scoped_location | Lswitch of lambda * lambda_switch * scoped_location @@ -382,7 +374,8 @@ let make_key e = incr count ; if !count > max_raw then raise Not_simple ; (* Too big ! *) match e with - | Lvar id -> + | Lvar id + | Lmutvar id -> begin try Ident.find_same id env with Not_found -> e @@ -405,6 +398,10 @@ let make_key e = let ex = tr_rec env ex in let y = make_key x in Llet (str,k,y,ex,tr_rec (Ident.add x (Lvar y) env) e) + | Lmutlet (k,x,ex,e) -> + let ex = tr_rec env ex in + let y = make_key x in + Lmutlet (k,y,ex,tr_rec (Ident.add x (Lmutvar y) env) e) | Lprim (p,es,_) -> Lprim (p,tr_recs env es, Loc_unknown) | Lswitch (e,sw,loc) -> @@ -479,18 +476,18 @@ let iter_opt f = function let shallow_iter ~tail ~non_tail:f = function Lvar _ + | Lmutvar _ | Lconst _ -> () | Lapply{ap_func = fn; ap_args = args} -> f fn; List.iter f args | Lfunction{body} -> f body - | Llet(_str, _k, _id, arg, body) -> + | Llet(_, _k, _id, arg, body) + | Lmutlet(_k, _id, arg, body) -> f arg; tail body | Lletrec(decl, body) -> tail body; List.iter (fun (_id, exp) -> f exp) decl - | Lprim (Pidentity, [l], _) -> - tail l | Lprim (Psequand, [l1; l2], _) | Lprim (Psequor, [l1; l2], _) -> f l1; @@ -533,14 +530,16 @@ let iter_head_constructor f l = shallow_iter ~tail:f ~non_tail:f l let rec free_variables = function - | Lvar id -> Ident.Set.singleton id + | Lvar id + | Lmutvar id -> Ident.Set.singleton id | Lconst _ -> Ident.Set.empty | Lapply{ap_func = fn; ap_args = args} -> free_variables_list (free_variables fn) args | Lfunction{body; params} -> Ident.Set.diff (free_variables body) (Ident.Set.of_list (List.map fst params)) - | Llet(_str, _k, id, arg, body) -> + | Llet(_, _k, id, arg, body) + | Lmutlet(_k, id, arg, body) -> Ident.Set.union (free_variables arg) (Ident.Set.remove id (free_variables body)) @@ -715,6 +714,14 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = to [l]; it is a free variable of the input term. *) begin try Ident.Map.find id s with Not_found -> lam end end + | Lmutvar id as lam -> + begin match Ident.Map.find id l with + | id' -> Lmutvar id' + | exception Not_found -> + (* Note: a mutable [id] should not appear in [s]. + Keeping the behavior of Lvar case for now. *) + begin try Ident.Map.find id s with Not_found -> lam end + end | Lconst _ as l -> l | Lapply ap -> Lapply{ap with ap_func = subst s l ap.ap_func; @@ -725,6 +732,9 @@ let subst update_env ?(freshen_bound_variables = false) s input_lam = | Llet(str, k, id, arg, body) -> let id, l' = bind id l in Llet(str, k, id, subst s l arg, subst s l' body) + | Lmutlet(k, id, arg, body) -> + let id, l' = bind id l in + Lmutlet(k, id, subst s l arg, subst s l' body) | Lletrec(decl, body) -> let decl, l' = bind_many decl l in Lletrec(List.map (subst_decl s l') decl, subst s l' body) @@ -818,6 +828,7 @@ let duplicate lam = let shallow_map f = function | Lvar _ + | Lmutvar _ | Lconst _ as lam -> lam | Lapply { ap_func; ap_args; ap_loc; ap_tailcall; ap_inlined; ap_specialised } -> @@ -833,6 +844,8 @@ let shallow_map f = function Lfunction { kind; params; return; body = f body; attr; loc; } | Llet (str, k, v, e1, e2) -> Llet (str, k, v, f e1, f e2) + | Lmutlet (k, v, e1, e2) -> + Lmutlet (k, v, f e1, f e2) | Lletrec (idel, e2) -> Lletrec (List.map (fun (v, e) -> (v, f e)) idel, f e2) | Lprim (p, el, loc) -> diff --git a/lambda/lambda.mli b/lambda/lambda.mli index fa29315d..a9fe3911 100644 --- a/lambda/lambda.mli +++ b/lambda/lambda.mli @@ -46,12 +46,9 @@ type is_safe = | Unsafe type primitive = - | Pidentity | Pbytes_to_string | Pbytes_of_string | Pignore - | Prevapply - | Pdirapply (* Globals *) | Pgetglobal of Ident.t | Psetglobal of Ident.t @@ -234,7 +231,7 @@ type local_attribute = type function_kind = Curried | Tupled -type let_kind = Strict | Alias | StrictOpt | Variable +type let_kind = Strict | Alias | StrictOpt (* Meaning of kinds for let x = e in e': Strict: e may have side-effects; always evaluate e first (If e is a simple expression, e.g. a variable or constant, @@ -243,7 +240,6 @@ type let_kind = Strict | Alias | StrictOpt | Variable in e' StrictOpt: e does not have side-effects, but depend on the store; we can discard e if x does not appear in e' - Variable: the variable x is assigned later in e' *) type meth_kind = Self | Public | Cached @@ -264,10 +260,12 @@ type scoped_location = Debuginfo.Scoped_location.t type lambda = Lvar of Ident.t + | Lmutvar of Ident.t | Lconst of structured_constant | Lapply of lambda_apply | Lfunction of lfunction | Llet of let_kind * value_kind * Ident.t * lambda * lambda + | Lmutlet of value_kind * Ident.t * lambda * lambda | Lletrec of (Ident.t * lambda) list * lambda | Lprim of primitive * lambda list * scoped_location | Lswitch of lambda * lambda_switch * scoped_location diff --git a/lambda/matching.ml b/lambda/matching.ml index 45803f6c..0e143dd6 100644 --- a/lambda/matching.ml +++ b/lambda/matching.ml @@ -150,6 +150,10 @@ let expand_record_head h = { h with pat_desc = Record (Array.to_list lbl_all) } | _ -> h +let bind_alias p id ~arg ~action = + let k = Typeopt.value_kind p.pat_env p.pat_type in + bind_with_value_kind Alias (id, k) arg action + let head_loc ~scopes head = Scoped_location.of_location ~scopes head.pat_loc @@ -229,10 +233,9 @@ end = struct | `Any -> stop p `Any | `Var (id, s) -> continue p (`Alias (Patterns.omega, id, s)) | `Alias (p, id, _) -> - let k = Typeopt.value_kind p.pat_env p.pat_type in aux ( (General.view p, patl), - bind_with_value_kind Alias (id, k) arg action ) + bind_alias p id ~arg ~action ) | `Record ([], _) as view -> stop p view | `Record (lbls, closed) -> let full_view = `Record (all_record_args lbls, closed) in @@ -260,15 +263,11 @@ module Simple : sig val head : pattern -> Patterns.Head.t val explode_or_pat : - Half_simple.pattern * Typedtree.pattern list -> - arg_id:Ident.t option -> + arg:lambda -> + Half_simple.pattern -> mk_action:(vars:Ident.t list -> lambda) -> - vars:Ident.t list -> - clause list -> - clause list - (** If the toplevel pattern is given a name, but the scrutinee is not named - (i.e. [arg_id = None]), which happens (only) when matching a literal - tuple, then [Cannot_flatten] is raised. *) + patbound_action_vars:Ident.t list -> + (pattern * lambda) list end = struct include Patterns.Simple @@ -295,20 +294,33 @@ end = struct in { p with pat_desc } - let mk_alpha_env arg_id aliases ids = - List.map - (fun id -> - ( id, - if List.mem id aliases then - match arg_id with - | Some v -> v - | _ -> raise Cannot_flatten - else - Ident.create_local (Ident.name id) )) - ids + (* Consider the following matching problem involving a half-simple pattern, + with an or-pattern and as-patterns below it: + + match arg, other-args with + | (Foo(y, z) as x | Bar(x, y) as z), other-pats -> action[x,y,z] + + (action[x,y,z] is some right-hand-side expression using x, y and z, + but we assume that it uses no variables from [other-pats]). + + [explode_or_pat] explodes this into the following: + + match arg, other-args with + | Foo(y1, z1), other-pats -> let x1 = arg in action[x1,y1,z1] + | Bar(x2, y2), other-pats -> let z2 = arg in action[x2,y2,z2] + + notice that the binding occurrences of x,y,z are alpha-renamed with + fresh variables x1,y1,z1 and x2,y2,z2. - let explode_or_pat ((p : Half_simple.pattern), patl) ~arg_id ~mk_action ~vars - (rem : clause list) : clause list = + We assume that it is fine to duplicate the argument [arg] in each + exploded branch; in most cases it is a variable (in which case + the bindings [let x1 = arg] are inlined on the fly), except when + compiling in [do_for_multiple_match] where it is a tuple of + variables. + *) + let explode_or_pat ~arg (p : Half_simple.pattern) + ~mk_action ~patbound_action_vars + : (pattern * lambda) list = let rec explode p aliases rem = let split_explode p aliases rem = explode (General.view p) aliases rem in match p.pat_desc with @@ -320,12 +332,51 @@ end = struct { p with pat_desc = `Alias (Patterns.omega, id, str) } aliases rem | #view as view -> - let env = mk_alpha_env arg_id aliases vars in - ( (alpha env { p with pat_desc = view }, patl), - mk_action ~vars:(List.map snd env) ) - :: rem + (* We are doing two things here: + - we freshen the variables of the pattern, to + avoid reusing the same identifier in distinct exploded + branches + - we bind the variables in [aliases] to the argument [arg] + (the other variables are bound by [view]); to avoid + code duplication if [arg] is itself not a variable, we + generate a binding for it, but only if the binding is + needed. + + We are careful to avoid binding [arg] if not needed due + to the {!do_for_multiple_match} usage, which tries to + compile a tuple pattern [match e1, .. en with ...] + without allocating the tuple [(e1, .., en)]. + *) + let rec fresh_clause arg_id action_vars renaming_env = function + | [] -> + let fresh_pat = alpha renaming_env { p with pat_desc = view } in + let fresh_action = mk_action ~vars:(List.rev action_vars) in + (fresh_pat, fresh_action) + | pat_id :: rem_vars -> + if not (List.mem pat_id aliases) then begin + let fresh_id = Ident.rename pat_id in + let action_vars = fresh_id :: action_vars in + let renaming_env = ((pat_id, fresh_id) :: renaming_env) in + fresh_clause arg_id action_vars renaming_env rem_vars + end else begin match arg_id, arg with + | Some id, _ + | None, Lvar id -> + let action_vars = id :: action_vars in + fresh_clause arg_id action_vars renaming_env rem_vars + | None, _ -> + (* [pat_id] is a name used locally to refer to the argument, + so it makes sense to reuse it (refreshed) *) + let id = Ident.rename pat_id in + let action_vars = (id :: action_vars) in + let pat, action = + fresh_clause (Some id) action_vars renaming_env rem_vars + in + pat, bind_alias pat id ~arg ~action + end + in + fresh_clause None [] [] patbound_action_vars :: rem in - explode (p : Half_simple.pattern :> General.pattern) [] rem + explode (p : Half_simple.pattern :> General.pattern) [] [] end let expand_record_simple : Simple.pattern -> Simple.pattern = @@ -562,13 +613,15 @@ end let rec flatten_pat_line size p k = match p.pat_desc with - | Tpat_any -> Patterns.omegas size :: k + | Tpat_any | Tpat_var _ -> Patterns.omegas size :: k | Tpat_tuple args -> args :: k | Tpat_or (p1, p2, _) -> flatten_pat_line size p1 (flatten_pat_line size p2 k) | Tpat_alias (p, _, _) -> - (* Note: if this 'as' pat is here, then this is a - useless binding, solves PR#3780 *) + (* Note: we are only called from flatten_matrix, + which is itself only ever used in places + where variables do not matter (default environments, + "provenance", etc.). *) flatten_pat_line size p k | _ -> fatal_error "Matching.flatten_pat_line" @@ -889,17 +942,17 @@ type handler = { pm : initial_clause pattern_matching } -type 'head_pat pm_or_compiled = { +type ('head_pat, 'matrix) pm_or_compiled = { body : 'head_pat Non_empty_row.t clause pattern_matching; handlers : handler list; - or_matrix : matrix + or_matrix : 'matrix } (* Pattern matching after application of both the or-pat rule and the mixture rule *) type pm_half_compiled = - | PmOr of Simple.pattern pm_or_compiled + | PmOr of (Simple.pattern, matrix) pm_or_compiled | PmVar of { inside : pm_half_compiled } | Pm of Simple.clause pattern_matching @@ -1272,7 +1325,7 @@ let as_matrix cases = *) -let rec split_or ~arg_id (cls : Half_simple.clause list) args def = +let rec split_or ~arg (cls : Half_simple.clause list) args def = let rec do_split (rev_before : Simple.clause list) rev_ors rev_no = function | [] -> cons_next (List.rev rev_before) (List.rev rev_ors) (List.rev rev_no) @@ -1303,7 +1356,7 @@ let rec split_or ~arg_id (cls : Half_simple.clause list) args def = in match yesor with | [] -> split_no_or yes args def nexts - | _ -> precompile_or ~arg_id yes yesor args def nexts + | _ -> precompile_or ~arg yes yesor args def nexts in do_split [] [] [] cls @@ -1402,7 +1455,7 @@ and precompile_var args cls def k = cls and var_def = Default_environment.pop_column def in let { me = first; matrix }, nexts = - split_or ~arg_id:(Some v) var_cls var_args var_def + split_or ~arg:(Lvar v) var_cls var_args var_def in (* Compute top information *) match nexts with @@ -1453,7 +1506,46 @@ and do_not_precompile args cls def k = }, k ) -and precompile_or ~arg_id (cls : Simple.clause list) ors args def k = +and precompile_or ~arg (cls : Simple.clause list) ors args def k = + (* Example: if [cls] is a single-row matrix + + s11 p12 .. p1n -> act1 + + and [ors] has three rows + + (s21|s'21) p22 .. p2n -> act2 + (s31|s'31) p32 .. p3n -> act3 + s41 p42 .. p4n -> act4 + + where the first and second rows start with disjoint or-patterns + of simple patterns, binding the variables x2, y2, z2 and x3, y3 + respectively, we precompile into the following: + + catch + ( match arg1 .. argn with + | s11 p12 .. p1n -> act1 + | s21 _ .. _ -> exit 2 x2 y2 z2 + | s'21 _ .. _ -> exit 2 x2 y2 z2 + | s31 _ .. _ -> exit 3 x3 y3 + | s'31 _ .. _ -> exit 3 x3 y3 + | s41 p42 .. p4n -> act4 ) + with + | exit 2 x2 y2 z2 -> + ( match arg2 .. argn with + | p22 .. p2n -> act2 ) + | exit 3 x3 y3 -> + ( match arg2 .. argn with + | p32 .. p3n -> act3 ) + + Note that if arg1 matches s21 or s'21, we exit to a submatrix + that will never try any of the following rows; this relies on the + disjointness-like properties documented in the {!Or_matrix} + module. + + The code below builds this catch/exit structure, The splitting of + the or-patterns is done in [Simple.explode_or_pat] -- it turns + half-simple clauses into simple clauses. + *) let rec do_cases = function | [] -> ([], []) | ((p, patl), action) :: rem -> ( @@ -1478,9 +1570,9 @@ and precompile_or ~arg_id (cls : Simple.clause list) ors args def k = } in let pm_fv = pm_free_variables orpm in - let vars = - (* bound variables of the or-pattern and used in the orpm - actions *) + let patbound_action_vars = + (* variables bound in the or-pattern + that are used in the orpm actions *) Typedtree.pat_bound_idents_full orp |> List.filter (fun (id, _, _) -> Ident.Set.mem id pm_fv) |> List.map (fun (id, _, ty) -> @@ -1491,19 +1583,20 @@ and precompile_or ~arg_id (cls : Simple.clause list) ors args def k = let mk_new_action ~vars = Lstaticraise (or_num, List.map (fun v -> Lvar v) vars) in - let rem_cases, rem_handlers = do_cases rem in - let cases = - Simple.explode_or_pat (p, new_patl) ~arg_id - ~mk_action:mk_new_action ~vars:(List.map fst vars) rem_cases - in + let new_cases = + Simple.explode_or_pat ~arg p + ~mk_action:mk_new_action + ~patbound_action_vars:(List.map fst patbound_action_vars) + |> List.map (fun (p, act) -> ((p, new_patl), act)) in let handler = { provenance = [ [ orp ] ]; exit = or_num; - vars; + vars = patbound_action_vars; pm = orpm } in - (cases, handler :: rem_handlers) + let rem_cases, rem_handlers = do_cases rem in + (new_cases @ rem_cases, handler :: rem_handlers) ) in let cases, handlers = do_cases ors in @@ -1539,17 +1632,11 @@ let split_and_precompile_simplified pm = dbg_split_and_precompile pm next nexts; (next, nexts) -let split_and_precompile_half_simplified ~arg_id pm = - let { me = next }, nexts = split_or ~arg_id pm.cases pm.args pm.default in +let split_and_precompile_half_simplified ~arg pm = + let { me = next }, nexts = split_or ~arg pm.cases pm.args pm.default in dbg_split_and_precompile pm next nexts; (next, nexts) -let split_and_precompile ~arg_id ~arg_lambda pm = - let pm = - { pm with cases = List.map (half_simplify_clause ~arg:arg_lambda) pm.cases } - in - split_and_precompile_half_simplified ~arg_id pm - (* General divide functions *) type cell = { @@ -1659,12 +1746,12 @@ let divide_constant ctx m = (* Matching against a constructor *) let get_key_constr = function - | { pat_desc = Tpat_construct (_, cstr, _) } -> cstr + | { pat_desc = Tpat_construct (_, cstr, _, _) } -> cstr | _ -> assert false let get_pat_args_constr p rem = match p with - | { pat_desc = Tpat_construct (_, _, args) } -> args @ rem + | { pat_desc = Tpat_construct (_, _, args, _) } -> args @ rem | _ -> assert false let get_expr_args_constr ~scopes head (arg, _mut) rem = @@ -2502,13 +2589,13 @@ let rec list_as_pat = function let complete_pats_constrs = function | constr :: _ as constrs -> - let tag_of_constr constr = - constr.pat_desc.cstr_tag in + let constr_of_pat cstr_pat = + cstr_pat.pat_desc in let pat_of_constr cstr = let open Patterns.Head in to_omega_pattern { constr with pat_desc = Construct cstr } in List.map pat_of_constr - (complete_constrs constr (List.map tag_of_constr constrs)) + (complete_constrs constr (List.map constr_of_pat constrs)) | _ -> assert false (* @@ -3113,7 +3200,7 @@ and compile_match_nonempty ~scopes repr partial ctx let cases = List.map (half_simplify_nonempty ~arg:newarg) m.cases in let m = { m with args; cases } in let first_match, rem = - split_and_precompile_half_simplified ~arg_id:(Some v) m in + split_and_precompile_half_simplified ~arg:newarg m in combine_handlers ~scopes repr partial ctx (v, str, arg) first_match rem | _ -> assert false @@ -3365,36 +3452,32 @@ let check_total ~scopes loc ~failer total lambda i = Lstaticcatch (lambda, (i, []), failure_handler ~scopes loc ~failer ()) -let compile_matching ~scopes loc ~failer repr arg pat_act_list partial = - let partial = check_partial pat_act_list partial in +let toplevel_handler ~scopes loc ~failer partial args cases compile_fun = match partial with - | Partial -> ( - let raise_num = next_raise_count () in - let pm = - { cases = List.map (fun (pat, act) -> ([ pat ], act)) pat_act_list; - args = [ (arg, Strict) ]; - default = - Default_environment.(cons [ [ Patterns.omega ] ] raise_num empty) - } - in - try - let lambda, total = - compile_match ~scopes repr partial (Context.start 1) pm in - check_total ~scopes loc ~failer total lambda raise_num - with Unused -> assert false - (* ; handler_fun() *) - ) | Total -> - let pm = - { cases = List.map (fun (pat, act) -> ([ pat ], act)) pat_act_list; - args = [ (arg, Strict) ]; - default = Default_environment.empty - } - in - let lambda, total = - compile_match ~scopes repr partial (Context.start 1) pm in + let default = Default_environment.empty in + let pm = { args; cases; default } in + let (lam, total) = compile_fun Total pm in assert (Jumps.is_empty total); - lambda + lam + | Partial -> + let raise_num = next_raise_count () in + let default = + Default_environment.cons [ Patterns.omega_list args ] raise_num + Default_environment.empty in + let pm = { args; cases; default } in + begin match compile_fun Partial pm with + | exception Unused -> assert false + | (lam, total) -> + check_total ~scopes loc ~failer total lam raise_num + end + +let compile_matching ~scopes loc ~failer repr arg pat_act_list partial = + let partial = check_partial pat_act_list partial in + let args = [ (arg, Strict) ] in + let rows = map_on_rows (fun pat -> (pat, [])) pat_act_list in + toplevel_handler ~scopes loc ~failer partial args rows (fun partial pm -> + compile_match_nonempty ~scopes repr partial (Context.start 1) pm) let for_function ~scopes loc repr param pat_act_list partial = compile_matching ~scopes loc ~failer:Raise_match_failure @@ -3466,6 +3549,7 @@ let simple_for_let ~scopes loc param pat body = let rec map_return f = function | Llet (str, k, id, l1, l2) -> Llet (str, k, id, l1, map_return f l2) + | Lmutlet (k, id, l1, l2) -> Lmutlet (k, id, l1, map_return f l2) | Lletrec (l1, l2) -> Lletrec (l1, map_return f l2) | Lifthenelse (lcond, lthen, lelse) -> Lifthenelse (lcond, map_return f lthen, map_return f lelse) @@ -3493,8 +3577,8 @@ let rec map_return f = function Option.map (map_return f) def, loc ) | (Lstaticraise _ | Lprim (Praise _, _, _)) as l -> l - | ( Lvar _ | Lconst _ | Lapply _ | Lfunction _ | Lsend _ | Lprim _ | Lwhile _ - | Lfor _ | Lassign _ | Lifused _ ) as l -> + | ( Lvar _ | Lmutvar _ | Lconst _ | Lapply _ | Lfunction _ | Lsend _ | Lprim _ + | Lwhile _ | Lfor _ | Lassign _ | Lifused _ ) as l -> f l (* The 'opt' reference indicates if the optimization is worthy. @@ -3579,23 +3663,14 @@ let for_let ~scopes loc param pat body = (* Easy case since variables are available *) let for_tupled_function ~scopes loc paraml pats_act_list partial = let partial = check_partial_list pats_act_list partial in - let raise_num = next_raise_count () in - let omega_params = [ Patterns.omega_list paraml ] in - let pm = - { cases = pats_act_list; - args = List.map (fun id -> (Lvar id, Strict)) paraml; - default = Default_environment.(cons omega_params raise_num empty) - } - in - try - let lambda, total = - compile_match ~scopes None partial - (Context.start (List.length paraml)) pm - in - check_total ~scopes loc ~failer:Raise_match_failure - total lambda raise_num - with Unused -> - failure_handler ~scopes loc ~failer:Raise_match_failure () + let args = List.map (fun id -> (Lvar id, Strict)) paraml in + let handler = + toplevel_handler ~scopes loc ~failer:Raise_match_failure + partial args pats_act_list in + handler (fun partial pm -> + compile_match ~scopes None partial + (Context.start (List.length paraml)) pm + ) let flatten_pattern size p = match p.pat_desc with @@ -3645,17 +3720,17 @@ let flatten_handler size handler = { handler with provenance = flatten_matrix size handler.provenance } type pm_flattened = - | FPmOr of pattern pm_or_compiled + | FPmOr of (pattern, unit) pm_or_compiled | FPm of pattern Non_empty_row.t clause pattern_matching let flatten_precompiled size args pmh = match pmh with | Pm pm -> FPm (flatten_pm size args pm) - | PmOr { body = b; handlers = hs; or_matrix = m } -> + | PmOr { body = b; handlers = hs; or_matrix = _ } -> FPmOr { body = flatten_pm size args b; handlers = List.map (flatten_handler size) hs; - or_matrix = flatten_matrix size m + or_matrix = (); } | PmVar _ -> assert false @@ -3673,65 +3748,34 @@ let compile_flattened ~scopes repr partial ctx pmh = let do_for_multiple_match ~scopes loc paraml pat_act_list partial = let repr = None in - let partial = check_partial pat_act_list partial in - let raise_num, arg, pm1 = - let raise_num, default = - match partial with - | Partial -> - let raise_num = next_raise_count () in - ( raise_num, - Default_environment.(cons [ [ Patterns.omega ] ] raise_num empty) - ) - | Total -> (-1, Default_environment.empty) + let arg = + let sloc = Scoped_location.of_location ~scopes loc in + Lprim (Pmakeblock (0, Immutable, None), paraml, sloc) in + let handler = + let partial = check_partial pat_act_list partial in + let rows = map_on_rows (fun p -> (p, [])) pat_act_list in + toplevel_handler ~scopes loc ~failer:Raise_match_failure + partial [ (arg, Strict) ] rows in + handler (fun partial pm1 -> + let pm1_half = + { pm1 with cases = List.map (half_simplify_nonempty ~arg) pm1.cases } in - let loc = Scoped_location.of_location ~scopes loc in - let arg = Lprim (Pmakeblock (0, Immutable, None), paraml, loc) in - ( raise_num, - arg, - { cases = List.map (fun (pat, act) -> ([ pat ], act)) pat_act_list; - args = [ (arg, Strict) ]; - default - } ) - in - try - match split_and_precompile ~arg_id:None ~arg_lambda:arg pm1 with - | exception Cannot_flatten -> - (* One pattern binds the whole tuple, flattening is not possible. - We need to allocate the scrutinee. *) - let lambda, total = - compile_match ~scopes None partial (Context.start 1) pm1 in - begin match partial with - | Partial -> - check_total ~scopes loc ~failer:Raise_match_failure - total lambda raise_num - | Total -> - assert (Jumps.is_empty total); - lambda - end - | next, nexts -> - let size = List.length paraml - and idl = List.map (fun _ -> Ident.create_local "*match*") paraml in - let args = List.map (fun id -> (Lvar id, Alias)) idl in - let flat_next = flatten_precompiled size args next - and flat_nexts = - List.map (fun (e, pm) -> (e, flatten_precompiled size args pm)) nexts - in - let lam, total = - comp_match_handlers (compile_flattened ~scopes repr) partial - (Context.start size) flat_next flat_nexts - in - List.fold_right2 (bind Strict) idl paraml - ( match partial with - | Partial -> - check_total ~scopes loc ~failer:Raise_match_failure - total lam raise_num - | Total -> - assert (Jumps.is_empty total); - lam - ) - with Unused -> assert false - -(* ; partial_function loc () *) + let next, nexts = split_and_precompile_half_simplified ~arg pm1_half in + let size = List.length paraml + and idl = List.map (function + | Lvar id -> id + | _ -> Ident.create_local "*match*") paraml in + let args = List.map (fun id -> (Lvar id, Alias)) idl in + let flat_next = flatten_precompiled size args next + and flat_nexts = + List.map (fun (e, pm) -> (e, flatten_precompiled size args pm)) nexts + in + let lam, total = + comp_match_handlers (compile_flattened ~scopes repr) partial + (Context.start size) flat_next flat_nexts + in + List.fold_right2 (bind Strict) idl paraml lam, total + ) (* PR#4828: Believe it or not, the 'paraml' argument below may not be side effect free. *) diff --git a/lambda/printlambda.ml b/lambda/printlambda.ml index e73af87f..72c54d0a 100644 --- a/lambda/printlambda.ml +++ b/lambda/printlambda.ml @@ -147,12 +147,9 @@ let float_comparison ppf = function | CFnge -> fprintf ppf "!>=." let primitive ppf = function - | Pidentity -> fprintf ppf "id" | Pbytes_to_string -> fprintf ppf "bytes_to_string" | Pbytes_of_string -> fprintf ppf "bytes_of_string" | Pignore -> fprintf ppf "ignore" - | Prevapply -> fprintf ppf "revapply" - | Pdirapply -> fprintf ppf "dirapply" | Pgetglobal id -> fprintf ppf "global %a" Ident.print id | Psetglobal id -> fprintf ppf "setglobal %a" Ident.print id | Pmakeblock(tag, Immutable, shape) -> @@ -345,12 +342,9 @@ let primitive ppf = function | Popaque -> fprintf ppf "opaque" let name_of_primitive = function - | Pidentity -> "Pidentity" | Pbytes_of_string -> "Pbytes_of_string" | Pbytes_to_string -> "Pbytes_to_string" | Pignore -> "Pignore" - | Prevapply -> "Prevapply" - | Pdirapply -> "Pdirapply" | Pgetglobal _ -> "Pgetglobal" | Psetglobal _ -> "Psetglobal" | Pmakeblock _ -> "Pmakeblock" @@ -495,6 +489,8 @@ let apply_specialised_attribute ppf = function let rec lam ppf = function | Lvar id -> Ident.print ppf id + | Lmutvar id -> + fprintf ppf "*%a" Ident.print id | Lconst cst -> struct_const ppf cst | Lapply ap -> @@ -522,18 +518,26 @@ let rec lam ppf = function fprintf ppf ")" in fprintf ppf "@[<2>(function%a@ %a%a%a)@]" pr_params params function_attribute attr return_kind return lam body - | Llet(str, k, id, arg, body) -> - let kind = function - Alias -> "a" | Strict -> "" | StrictOpt -> "o" | Variable -> "v" + | Llet(_, k, id, arg, body) + | Lmutlet(k, id, arg, body) as l -> + let let_kind = begin function + | Llet(str,_,_,_,_) -> + begin match str with + Alias -> "a" | Strict -> "" | StrictOpt -> "o" + end + | Lmutlet _ -> "mut" + | _ -> assert false + end in let rec letbody = function - | Llet(str, k, id, arg, body) -> - fprintf ppf "@ @[<2>%a =%s%a@ %a@]" - Ident.print id (kind str) value_kind k lam arg; - letbody body + | Llet(_, k, id, arg, body) + | Lmutlet(k, id, arg, body) as l -> + fprintf ppf "@ @[<2>%a =%s%a@ %a@]" + Ident.print id (let_kind l) value_kind k lam arg; + letbody body | expr -> expr in fprintf ppf "@[<2>(let@ @[(@[<2>%a =%s%a@ %a@]" - Ident.print id (kind str) value_kind k lam arg; + Ident.print id (let_kind l) value_kind k lam arg; let expr = letbody body in fprintf ppf ")@]@ %a)@]" lam expr | Lletrec(id_arg_list, body) -> diff --git a/lambda/simplif.ml b/lambda/simplif.ml index dfb556f3..e149df9e 100644 --- a/lambda/simplif.ml +++ b/lambda/simplif.ml @@ -27,7 +27,7 @@ exception Real_reference let rec eliminate_ref id = function Lvar v as lam -> if Ident.same v id then raise Real_reference else lam - | Lconst _ as lam -> lam + | Lmutvar _ | Lconst _ as lam -> lam | Lapply ap -> Lapply{ap with ap_func = eliminate_ref id ap.ap_func; ap_args = List.map (eliminate_ref id) ap.ap_args} @@ -37,15 +37,17 @@ let rec eliminate_ref id = function else lam | Llet(str, kind, v, e1, e2) -> Llet(str, kind, v, eliminate_ref id e1, eliminate_ref id e2) + | Lmutlet(kind, v, e1, e2) -> + Lmutlet(kind, v, eliminate_ref id e1, eliminate_ref id e2) | Lletrec(idel, e2) -> Lletrec(List.map (fun (v, e) -> (v, eliminate_ref id e)) idel, eliminate_ref id e2) | Lprim(Pfield 0, [Lvar v], _) when Ident.same v id -> - Lvar id + Lmutvar id | Lprim(Psetfield(0, _, _), [Lvar v; e], _) when Ident.same v id -> Lassign(id, eliminate_ref id e) | Lprim(Poffsetref delta, [Lvar v], loc) when Ident.same v id -> - Lassign(id, Lprim(Poffsetint delta, [Lvar id], loc)) + Lassign(id, Lprim(Poffsetint delta, [Lmutvar id], loc)) | Lprim(p, el, loc) -> Lprim(p, List.map (eliminate_ref id) el, loc) | Lswitch(e, sw, loc) -> @@ -103,8 +105,6 @@ let simplify_exits lam = (* Count occurrences of (exit n ...) statements *) let exits = Hashtbl.create 17 in - let try_depth = ref 0 in - let get_exit i = try Hashtbl.find exits i with Not_found -> {count = 0; max_depth = 0} @@ -113,60 +113,74 @@ let simplify_exits lam = match Hashtbl.find_opt exits i with | Some r -> r.count <- r.count + nb; - r.max_depth <- max r.max_depth d + r.max_depth <- Int.max r.max_depth d | None -> let r = {count = nb; max_depth = d} in Hashtbl.add exits i r in - let rec count = function - | (Lvar _| Lconst _) -> () - | Lapply ap -> count ap.ap_func; List.iter count ap.ap_args - | Lfunction {body} -> count body - | Llet(_str, _kind, _v, l1, l2) -> - count l2; count l1 + let rec count ~try_depth = function + | (Lvar _| Lmutvar _ | Lconst _) -> () + | Lapply ap -> + count ~try_depth ap.ap_func; + List.iter (count ~try_depth) ap.ap_args + | Lfunction {body} -> count ~try_depth body + | Llet(_, _kind, _v, l1, l2) + | Lmutlet(_kind, _v, l1, l2) -> + count ~try_depth l2; count ~try_depth l1 | Lletrec(bindings, body) -> - List.iter (fun (_v, l) -> count l) bindings; - count body - | Lprim(_p, ll, _) -> List.iter count ll + List.iter (fun (_v, l) -> count ~try_depth l) bindings; + count ~try_depth body + | Lprim(_p, ll, _) -> List.iter (count ~try_depth) ll | Lswitch(l, sw, _loc) -> - count_default sw ; - count l; - List.iter (fun (_, l) -> count l) sw.sw_consts; - List.iter (fun (_, l) -> count l) sw.sw_blocks + count_default ~try_depth sw ; + count ~try_depth l; + List.iter (fun (_, l) -> count ~try_depth l) sw.sw_consts; + List.iter (fun (_, l) -> count ~try_depth l) sw.sw_blocks | Lstringswitch(l, sw, d, _) -> - count l; - List.iter (fun (_, l) -> count l) sw; + count ~try_depth l; + List.iter (fun (_, l) -> count ~try_depth l) sw; begin match d with | None -> () | Some d -> match sw with - | []|[_] -> count d - | _ -> count d; count d (* default will get replicated *) + | []|[_] -> count ~try_depth d + | _ -> (* default will get replicated *) + count ~try_depth d; count ~try_depth d end - | Lstaticraise (i,ls) -> incr_exit i 1 !try_depth; List.iter count ls + | Lstaticraise (i,ls) -> + incr_exit i 1 try_depth; + List.iter (count ~try_depth) ls | Lstaticcatch (l1,(i,[]),Lstaticraise (j,[])) -> (* i will be replaced by j in l1, so each occurrence of i in l1 increases j's ref count *) - count l1 ; + count ~try_depth l1 ; let ic = get_exit i in - incr_exit j ic.count (max !try_depth ic.max_depth) + incr_exit j ic.count (Int.max try_depth ic.max_depth) | Lstaticcatch(l1, (i,_), l2) -> - count l1; + count ~try_depth l1; (* If l1 does not contain (exit i), l2 will be removed, so don't count its exits *) if (get_exit i).count > 0 then - count l2 - | Ltrywith(l1, _v, l2) -> incr try_depth; count l1; decr try_depth; count l2 - | Lifthenelse(l1, l2, l3) -> count l1; count l2; count l3 - | Lsequence(l1, l2) -> count l1; count l2 - | Lwhile(l1, l2) -> count l1; count l2 - | Lfor(_, l1, l2, _dir, l3) -> count l1; count l2; count l3 - | Lassign(_v, l) -> count l - | Lsend(_k, m, o, ll, _) -> List.iter count (m::o::ll) - | Levent(l, _) -> count l - | Lifused(_v, l) -> count l - - and count_default sw = match sw.sw_failaction with + count ~try_depth l2 + | Ltrywith(l1, _v, l2) -> + count ~try_depth:(try_depth+1) l1; + count ~try_depth l2; + | Lifthenelse(l1, l2, l3) -> + count ~try_depth l1; + count ~try_depth l2; + count ~try_depth l3 + | Lsequence(l1, l2) -> count ~try_depth l1; count ~try_depth l2 + | Lwhile(l1, l2) -> count ~try_depth l1; count ~try_depth l2 + | Lfor(_, l1, l2, _dir, l3) -> + count ~try_depth l1; + count ~try_depth l2; + count ~try_depth l3 + | Lassign(_v, l) -> count ~try_depth l + | Lsend(_k, m, o, ll, _) -> List.iter (count ~try_depth) (m::o::ll) + | Levent(l, _) -> count ~try_depth l + | Lifused(_v, l) -> count ~try_depth l + + and count_default ~try_depth sw = match sw.sw_failaction with | None -> () | Some al -> let nconsts = List.length sw.sw_consts @@ -174,14 +188,13 @@ let simplify_exits lam = if nconsts < sw.sw_numconsts && nblocks < sw.sw_numblocks then begin (* default action will occur twice in native code *) - count al ; count al + count ~try_depth al ; count ~try_depth al end else begin (* default action will occur once *) assert (nconsts < sw.sw_numconsts || nblocks < sw.sw_numblocks) ; - count al + count ~try_depth al end in - count lam; - assert(!try_depth = 0); + count ~try_depth:0 lam; (* Second pass simplify ``catch body with (i ...) handler'' @@ -201,49 +214,23 @@ let simplify_exits lam = *) let subst = Hashtbl.create 17 in - - let rec simplif = function - | (Lvar _|Lconst _) as l -> l + let rec simplif ~try_depth = function + | (Lvar _| Lmutvar _ | Lconst _) as l -> l | Lapply ap -> - Lapply{ap with ap_func = simplif ap.ap_func; - ap_args = List.map simplif ap.ap_args} + Lapply{ap with ap_func = simplif ~try_depth ap.ap_func; + ap_args = List.map (simplif ~try_depth) ap.ap_args} | Lfunction{kind; params; return; body = l; attr; loc} -> - Lfunction{kind; params; return; body = simplif l; attr; loc} - | Llet(str, kind, v, l1, l2) -> Llet(str, kind, v, simplif l1, simplif l2) + Lfunction{kind; params; return; body = simplif ~try_depth l; attr; loc} + | Llet(str, kind, v, l1, l2) -> + Llet(str, kind, v, simplif ~try_depth l1, simplif ~try_depth l2) + | Lmutlet(kind, v, l1, l2) -> + Lmutlet(kind, v, simplif ~try_depth l1, simplif ~try_depth l2) | Lletrec(bindings, body) -> - Lletrec(List.map (fun (v, l) -> (v, simplif l)) bindings, simplif body) + Lletrec(List.map (fun (v, l) -> (v, simplif ~try_depth l)) bindings, + simplif ~try_depth body) | Lprim(p, ll, loc) -> begin - let ll = List.map simplif ll in + let ll = List.map (simplif ~try_depth) ll in match p, ll with - (* Simplify %revapply, for n-ary functions with n > 1 *) - | Prevapply, [x; Lapply ap] - | Prevapply, [x; Levent (Lapply ap,_)] -> - Lapply {ap with ap_args = ap.ap_args @ [x]; ap_loc = loc} - | Prevapply, [x; f] -> - Lapply { - ap_loc=loc; - ap_func=f; - ap_args=[x]; - ap_tailcall=Default_tailcall; - ap_inlined=Default_inline; - ap_specialised=Default_specialise; - } - (* Simplify %apply, for n-ary functions with n > 1 *) - | Pdirapply, [Lapply ap; x] - | Pdirapply, [Levent (Lapply ap,_); x] -> - Lapply {ap with ap_args = ap.ap_args @ [x]; ap_loc = loc} - | Pdirapply, [f; x] -> - Lapply { - ap_loc=loc; - ap_func=f; - ap_args=[x]; - ap_tailcall=Default_tailcall; - ap_inlined=Default_inline; - ap_specialised=Default_specialise; - } - (* Simplify %identity *) - | Pidentity, [e] -> e - (* Simplify Obj.with_tag *) | Pccall { Primitive.prim_name = "caml_obj_with_tag"; _ }, [Lconst (Const_base (Const_int tag)); @@ -257,10 +244,12 @@ let simplify_exits lam = | _ -> Lprim(p, ll, loc) end | Lswitch(l, sw, loc) -> - let new_l = simplif l - and new_consts = List.map (fun (n, e) -> (n, simplif e)) sw.sw_consts - and new_blocks = List.map (fun (n, e) -> (n, simplif e)) sw.sw_blocks - and new_fail = Option.map simplif sw.sw_failaction in + let new_l = simplif ~try_depth l + and new_consts = + List.map (fun (n, e) -> (n, simplif ~try_depth e)) sw.sw_consts + and new_blocks = + List.map (fun (n, e) -> (n, simplif ~try_depth e)) sw.sw_blocks + and new_fail = Option.map (simplif ~try_depth) sw.sw_failaction in Lswitch (new_l, {sw with sw_consts = new_consts ; sw_blocks = new_blocks; @@ -268,8 +257,8 @@ let simplify_exits lam = loc) | Lstringswitch(l,sw,d,loc) -> Lstringswitch - (simplif l,List.map (fun (s,l) -> s,simplif l) sw, - Option.map simplif d,loc) + (simplif ~try_depth l,List.map (fun (s,l) -> s,simplif ~try_depth l) sw, + Option.map (simplif ~try_depth) d,loc) | Lstaticraise (i,[]) as l -> begin try let _,handler = Hashtbl.find subst i in @@ -278,7 +267,7 @@ let simplify_exits lam = | Not_found -> l end | Lstaticraise (i,ls) -> - let ls = List.map simplif ls in + let ls = List.map (simplif ~try_depth) ls in begin try let xs,handler = Hashtbl.find subst i in let ys = List.map (fun (x, k) -> Ident.rename x, k) xs in @@ -287,45 +276,53 @@ let simplify_exits lam = (fun (x, _) (y, _) env -> Ident.Map.add x y env) xs ys Ident.Map.empty in - List.fold_right2 - (fun (y, kind) l r -> Llet (Strict, kind, y, l, r)) - ys ls (Lambda.rename env handler) + (* The evaluation order for Lstaticraise arguments is currently + right-to-left in all backends. + To preserve this, we use fold_left2 instead of fold_right2 + (the first argument is inserted deepest in the expression, + so will be evaluated last). + *) + List.fold_left2 + (fun r (y, kind) l -> Llet (Strict, kind, y, l, r)) + (Lambda.rename env handler) ys ls with | Not_found -> Lstaticraise (i,ls) end | Lstaticcatch (l1,(i,[]),(Lstaticraise (_j,[]) as l2)) -> - Hashtbl.add subst i ([],simplif l2) ; - simplif l1 + Hashtbl.add subst i ([],simplif ~try_depth l2) ; + simplif ~try_depth l1 | Lstaticcatch (l1,(i,xs),l2) -> let {count; max_depth} = get_exit i in if count = 0 then (* Discard staticcatch: not matching exit *) - simplif l1 - else if count = 1 && max_depth <= !try_depth then begin + simplif ~try_depth l1 + else if + count = 1 && max_depth <= try_depth then begin (* Inline handler if there is a single occurrence and it is not nested within an inner try..with *) - assert(max_depth = !try_depth); - Hashtbl.add subst i (xs,simplif l2); - simplif l1 + assert(max_depth = try_depth); + Hashtbl.add subst i (xs,simplif ~try_depth l2); + simplif ~try_depth l1 end else - Lstaticcatch (simplif l1, (i,xs), simplif l2) + Lstaticcatch (simplif ~try_depth l1, (i,xs), simplif ~try_depth l2) | Ltrywith(l1, v, l2) -> - incr try_depth; - let l1 = simplif l1 in - decr try_depth; - Ltrywith(l1, v, simplif l2) - | Lifthenelse(l1, l2, l3) -> Lifthenelse(simplif l1, simplif l2, simplif l3) - | Lsequence(l1, l2) -> Lsequence(simplif l1, simplif l2) - | Lwhile(l1, l2) -> Lwhile(simplif l1, simplif l2) + let l1 = simplif ~try_depth:(try_depth + 1) l1 in + Ltrywith(l1, v, simplif ~try_depth l2) + | Lifthenelse(l1, l2, l3) -> Lifthenelse(simplif ~try_depth l1, + simplif ~try_depth l2, simplif ~try_depth l3) + | Lsequence(l1, l2) -> Lsequence(simplif ~try_depth l1, simplif ~try_depth l2) + | Lwhile(l1, l2) -> Lwhile(simplif ~try_depth l1, simplif ~try_depth l2) | Lfor(v, l1, l2, dir, l3) -> - Lfor(v, simplif l1, simplif l2, dir, simplif l3) - | Lassign(v, l) -> Lassign(v, simplif l) + Lfor(v, simplif ~try_depth l1, simplif ~try_depth l2, dir, + simplif ~try_depth l3) + | Lassign(v, l) -> Lassign(v, simplif ~try_depth l) | Lsend(k, m, o, ll, loc) -> - Lsend(k, simplif m, simplif o, List.map simplif ll, loc) - | Levent(l, ev) -> Levent(simplif l, ev) - | Lifused(v, l) -> Lifused (v,simplif l) + Lsend(k, simplif ~try_depth m, simplif ~try_depth o, + List.map (simplif ~try_depth) ll, loc) + | Levent(l, ev) -> Levent(simplif ~try_depth l, ev) + | Lifused(v, l) -> Lifused (v,simplif ~try_depth l) in - simplif lam + simplif ~try_depth:0 lam (* Compile-time beta-reduction of functions immediately applied: Lapply(Lfunction(Curried, params, body), args, loc) -> @@ -407,7 +404,8 @@ let simplify_lets lam = let rec count bv = function | Lconst _ -> () | Lvar v -> - use_var bv v 1 + use_var bv v 1 + | Lmutvar _ -> () | Lapply{ap_func = ll; ap_args = args} -> let no_opt () = count bv ll; List.iter (count bv) args in begin match ll with @@ -430,6 +428,9 @@ let simplify_lets lam = count (bind_var bv v) l2; (* If v is unused, l1 will be removed, so don't count its variables *) if str = Strict || count_var v > 0 then count bv l1 + | Lmutlet(_kind, _v, l1, l2) -> + count bv l1; + count bv l2 | Lletrec(bindings, body) -> List.iter (fun (_v, l) -> count bv l) bindings; count bv body @@ -491,10 +492,17 @@ let simplify_lets lam = (* This (small) optimisation is always legal, it may uncover some tail call later on. *) - let mklet str kind v e1 e2 = match e2 with - | Lvar w when optimize && Ident.same v w -> e1 - | _ -> Llet (str, kind,v,e1,e2) in + let mklet str kind v e1 e2 = + match e2 with + | Lvar w when optimize && Ident.same v w -> e1 + | _ -> Llet (str, kind,v,e1,e2) + in + let mkmutlet kind v e1 e2 = + match e2 with + | Lmutvar w when optimize && Ident.same v w -> e1 + | _ -> Lmutlet (kind,v,e1,e2) + in let rec simplif = function Lvar v as l -> @@ -503,7 +511,7 @@ let simplify_lets lam = with Not_found -> l end - | Lconst _ as l -> l + | Lmutvar _ | Lconst _ as l -> l | Lapply ({ap_func = ll; ap_args = args} as ap) -> let no_opt () = Lapply {ap with ap_func = simplif ap.ap_func; @@ -545,7 +553,7 @@ let simplify_lets lam = | Some [field_kind] -> field_kind | Some _ -> assert false in - mklet Variable kind v slinit (eliminate_ref v slbody) + mkmutlet kind v slinit (eliminate_ref v slbody) with Real_reference -> mklet Strict kind v (Lprim(prim, [slinit], loc)) slbody end @@ -561,6 +569,7 @@ let simplify_lets lam = | _ -> mklet StrictOpt kind v (simplif l1) (simplif l2) end | Llet(str, kind, v, l1, l2) -> mklet str kind v (simplif l1) (simplif l2) + | Lmutlet(kind, v, l1, l2) -> mkmutlet kind v (simplif l1) (simplif l2) | Lletrec(bindings, body) -> Lletrec(List.map (fun (v, l) -> (v, simplif l)) bindings, simplif body) | Lprim(p, ll, loc) -> Lprim(p, List.map simplif ll, loc) @@ -606,6 +615,7 @@ let simplify_lets lam = let rec emit_tail_infos is_tail lambda = match lambda with | Lvar _ -> () + | Lmutvar _ -> () | Lconst _ -> () | Lapply ap -> begin @@ -629,14 +639,13 @@ let rec emit_tail_infos is_tail lambda = list_emit_tail_infos false ap.ap_args | Lfunction {body = lam} -> emit_tail_infos true lam - | Llet (_str, _k, _, lam, body) -> + | Llet (_, _k, _, lam, body) + | Lmutlet (_k, _, lam, body) -> emit_tail_infos false lam; emit_tail_infos is_tail body | Lletrec (bindings, body) -> List.iter (fun (_, lam) -> emit_tail_infos false lam) bindings; emit_tail_infos is_tail body - | Lprim (Pidentity, [arg], _) -> - emit_tail_infos is_tail arg | Lprim ((Pbytes_to_string | Pbytes_of_string), [arg], _) -> emit_tail_infos is_tail arg | Lprim (Psequand, [arg1; arg2], _) diff --git a/lambda/translclass.ml b/lambda/translclass.ml index a4655798..b0ddfdf8 100644 --- a/lambda/translclass.ml +++ b/lambda/translclass.ml @@ -663,7 +663,8 @@ let free_methods l = | Lsend _ -> () | Lfunction{params} -> List.iter (fun (param, _) -> fv := Ident.Set.remove param !fv) params - | Llet(_str, _k, id, _arg, _body) -> + | Llet(_, _k, id, _arg, _body) + | Lmutlet(_k, id, _arg, _body) -> fv := Ident.Set.remove id !fv | Lletrec(decl, _body) -> List.iter (fun (id, _exp) -> fv := Ident.Set.remove id !fv) decl @@ -674,7 +675,7 @@ let free_methods l = | Lfor(v, _e1, _e2, _dir, _e3) -> fv := Ident.Set.remove v !fv | Lassign _ - | Lvar _ | Lconst _ | Lapply _ + | Lvar _ | Lmutvar _ | Lconst _ | Lapply _ | Lprim _ | Lswitch _ | Lstringswitch _ | Lstaticraise _ | Lifthenelse _ | Lsequence _ | Lwhile _ | Levent _ | Lifused _ -> () diff --git a/lambda/translcore.ml b/lambda/translcore.ml index 653f12ce..e9a3f659 100644 --- a/lambda/translcore.ml +++ b/lambda/translcore.ml @@ -88,20 +88,41 @@ type binding = | Bind_value of value_binding list | Bind_module of Ident.t * string option loc * module_presence * module_expr -let rec push_defaults loc bindings cases partial = +let wrap_bindings bindings exp = + List.fold_left + (fun exp binds -> + {exp with exp_desc = + match binds with + | Bind_value binds -> Texp_let(Nonrecursive, binds, exp) + | Bind_module (id, name, pres, mexpr) -> + Texp_letmodule (Some id, name, pres, mexpr, exp)}) + exp bindings + +let rec trivial_pat pat = + match pat.pat_desc with + Tpat_var _ + | Tpat_any -> true + | Tpat_construct (_, cd, [], _) -> + not cd.cstr_generalized && cd.cstr_consts = 1 && cd.cstr_nonconsts = 0 + | Tpat_tuple patl -> + List.for_all trivial_pat patl + | _ -> false + +let rec push_defaults loc bindings use_lhs cases partial = match cases with [{c_lhs=pat; c_guard=None; c_rhs={exp_desc = Texp_function { arg_label; param; cases; partial; } } - as exp}] -> - let cases = push_defaults exp.exp_loc bindings cases partial in + as exp}] when bindings = [] || trivial_pat pat -> + let cases = push_defaults exp.exp_loc bindings false cases partial in [{c_lhs=pat; c_guard=None; c_rhs={exp with exp_desc = Texp_function { arg_label; param; cases; partial; }}}] | [{c_lhs=pat; c_guard=None; c_rhs={exp_attributes=[{Parsetree.attr_name = {txt="#default"};_}]; exp_desc = Texp_let - (Nonrecursive, binds, ({exp_desc = Texp_function _} as e2))}}] -> - push_defaults loc (Bind_value binds :: bindings) + (Nonrecursive, binds, + ({exp_desc = Texp_function _} as e2))}}] -> + push_defaults loc (Bind_value binds :: bindings) true [{c_lhs=pat;c_guard=None;c_rhs=e2}] partial | [{c_lhs=pat; c_guard=None; @@ -109,21 +130,12 @@ let rec push_defaults loc bindings cases partial = exp_desc = Texp_letmodule (Some id, name, pres, mexpr, ({exp_desc = Texp_function _} as e2))}}] -> - push_defaults loc (Bind_module (id, name, pres, mexpr) :: bindings) + push_defaults loc (Bind_module (id, name, pres, mexpr) :: bindings) true [{c_lhs=pat;c_guard=None;c_rhs=e2}] partial - | [case] -> - let exp = - List.fold_left - (fun exp binds -> - {exp with exp_desc = - match binds with - | Bind_value binds -> Texp_let(Nonrecursive, binds, exp) - | Bind_module (id, name, pres, mexpr) -> - Texp_letmodule (Some id, name, pres, mexpr, exp)}) - case.c_rhs bindings - in - [{case with c_rhs=exp}] + | [{c_lhs=pat; c_guard=None; c_rhs=exp} as case] + when use_lhs || trivial_pat pat && exp.exp_desc <> Texp_unreachable -> + [{case with c_rhs = wrap_bindings bindings exp}] | {c_lhs=pat; c_rhs=exp; c_guard=_} :: _ when bindings <> [] -> let param = Typecore.name_cases "param" cases in let desc = @@ -145,13 +157,13 @@ let rec push_defaults loc bindings cases partial = (Path.Pident param, mknoloc (Longident.Lident name), desc)}, cases, partial) } in - push_defaults loc bindings - [{c_lhs={pat with pat_desc = Tpat_var (param, mknoloc name)}; - c_guard=None; c_rhs=exp}] - Total + [{c_lhs = {pat with pat_desc = Tpat_var (param, mknoloc name)}; + c_guard = None; c_rhs= wrap_bindings bindings exp}] | _ -> cases +let push_defaults loc = push_defaults loc [] false + (* Insertion of debugging events *) let event_before ~scopes exp lam = @@ -851,7 +863,7 @@ and transl_function ~scopes e param cases partial = let ((kind, params, return), body) = event_function ~scopes e (function repr -> - let pl = push_defaults e.exp_loc [] cases partial in + let pl = push_defaults e.exp_loc cases partial in let return_kind = function_return_value_kind e.exp_env e.exp_type in transl_curried_function ~scopes e.exp_loc return_kind repr partial param pl) diff --git a/lambda/translmod.ml b/lambda/translmod.ml index e1521aa3..d109f52d 100644 --- a/lambda/translmod.ml +++ b/lambda/translmod.ml @@ -1692,7 +1692,7 @@ let explanation_submsg (id, unsafe_info) = let report_error loc = function | Circular_dependency cycle -> - let[@manual.ref "s:recursive-modules"] chapter, section = 8, 2 in + let[@manual.ref "s:recursive-modules"] chapter, section = 10, 2 in Location.errorf ~loc ~sub:(List.map explanation_submsg cycle) "Cannot safely evaluate the definition of the following cycle@ \ of recursively-defined modules:@ %a.@ \ diff --git a/lambda/translprim.ml b/lambda/translprim.ml index 6c9bf92b..5770aa6c 100644 --- a/lambda/translprim.ml +++ b/lambda/translprim.ml @@ -88,6 +88,10 @@ type prim = | Send | Send_self | Send_cache + | Frame_pointers + | Identity + | Apply + | Revapply let used_primitives = Hashtbl.create 7 let add_used_primitive loc env path = @@ -111,12 +115,12 @@ let prim_sys_argv = let primitives_table = create_hashtable 57 [ - "%identity", Primitive (Pidentity, 1); + "%identity", Identity; "%bytes_to_string", Primitive (Pbytes_to_string, 1); "%bytes_of_string", Primitive (Pbytes_of_string, 1); "%ignore", Primitive (Pignore, 1); - "%revapply", Primitive (Prevapply, 2); - "%apply", Primitive (Pdirapply, 2); + "%revapply", Revapply; + "%apply", Apply; "%loc_LOC", Loc Loc_LOC; "%loc_FILE", Loc Loc_FILE; "%loc_LINE", Loc Loc_LINE; @@ -143,6 +147,7 @@ let primitives_table = "%ostype_unix", Primitive ((Pctconst Ostype_unix), 1); "%ostype_win32", Primitive ((Pctconst Ostype_win32), 1); "%ostype_cygwin", Primitive ((Pctconst Ostype_cygwin), 1); + "%frame_pointers", Frame_pointers; "%negint", Primitive (Pnegint, 1); "%succint", Primitive ((Poffsetint 1), 1); "%predint", Primitive ((Poffsetint(-1)), 1); @@ -690,10 +695,34 @@ let lambda_of_prim prim_name prim loc args arg_exps = | Send_self, [obj; meth] -> Lsend(Self, meth, obj, [], loc) | Send_cache, [obj; meth; cache; pos] -> - Lsend(Cached, meth, obj, [cache; pos], loc) + (* Cached mode only works in the native backend *) + if !Clflags.native_code then + Lsend(Cached, meth, obj, [cache; pos], loc) + else + Lsend(Public, meth, obj, [], loc) + | Frame_pointers, [] -> + let frame_pointers = + if !Clflags.native_code && Config.with_frame_pointers then 1 else 0 + in + Lconst (const_int frame_pointers) + | Identity, [arg] -> arg + | Apply, [func; arg] + | Revapply, [arg; func] -> + Lapply { + ap_func = func; + ap_args = [arg]; + ap_loc = loc; + (* CR-someday lwhite: it would be nice to be able to give + application attributes to functions applied with the application + operators. *) + ap_tailcall = Default_tailcall; + ap_inlined = Default_inline; + ap_specialised = Default_specialise; + } | (Raise _ | Raise_with_backtrace | Lazy_force | Loc _ | Primitive _ | Comparison _ - | Send | Send_self | Send_cache), _ -> + | Send | Send_self | Send_cache | Frame_pointers | Identity + | Apply | Revapply), _ -> raise(Error(to_location loc, Wrong_arity_builtin_primitive prim_name)) let check_primitive_arity loc p = @@ -709,6 +738,9 @@ let check_primitive_arity loc p = | Loc _ -> p.prim_arity = 1 || p.prim_arity = 0 | Send | Send_self -> p.prim_arity = 2 | Send_cache -> p.prim_arity = 4 + | Frame_pointers -> p.prim_arity = 0 + | Identity -> p.prim_arity = 1 + | Apply | Revapply -> p.prim_arity = 2 in if not ok then raise(Error(loc, Wrong_arity_builtin_primitive p.prim_name)) @@ -740,7 +772,6 @@ let transl_primitive loc p env ty path = body; } let lambda_primitive_needs_event_after = function - | Prevapply | Pdirapply (* PR#6920 *) (* We add an event after any primitive resulting in a C call that may raise an exception or allocate. These are places where we may collect the call stack. *) @@ -759,7 +790,7 @@ let lambda_primitive_needs_event_after = function | Pbigstring_set_16 _ | Pbigstring_set_32 _ | Pbigstring_set_64 _ | Pbbswap _ -> true - | Pidentity | Pbytes_to_string | Pbytes_of_string | Pignore | Psetglobal _ + | Pbytes_to_string | Pbytes_of_string | Pignore | Psetglobal _ | Pgetglobal _ | Pmakeblock _ | Pfield _ | Pfield_computed | Psetfield _ | Psetfield_computed _ | Pfloatfield _ | Psetfloatfield _ | Praise _ | Psequor | Psequand | Pnot | Pnegint | Paddint | Psubint | Pmulint @@ -777,8 +808,9 @@ let primitive_needs_event_after = function | External _ -> true | Comparison(comp, knd) -> lambda_primitive_needs_event_after (comparison_primitive comp knd) - | Lazy_force | Send | Send_self | Send_cache -> true - | Raise _ | Raise_with_backtrace | Loc _ -> false + | Lazy_force | Send | Send_self | Send_cache + | Apply | Revapply -> true + | Raise _ | Raise_with_backtrace | Loc _ | Frame_pointers | Identity -> false let transl_primitive_application loc p env ty path exp args arg_exps = let prim = diff --git a/lex/Makefile b/lex/Makefile index 5f6b1655..210d4ccb 100644 --- a/lex/Makefile +++ b/lex/Makefile @@ -17,17 +17,21 @@ ROOTDIR = .. +# NOTE: it is important that OCAMLLEX is defined *before* Makefile.common +# gets included, so that its definition here takes precedence +# over the one there. +OCAMLLEX ?= $(BOOT_OCAMLLEX) + include $(ROOTDIR)/Makefile.common -CAMLYACC ?= $(ROOTDIR)/yacc/ocamlyacc$(EXE) +OCAMLYACCFLAGS = -v CAMLC = $(BOOT_OCAMLC) -strict-sequence -nostdlib \ -I $(ROOTDIR)/boot -use-prims $(ROOTDIR)/runtime/primitives -CAMLOPT = $(CAMLRUN) $(ROOTDIR)/ocamlopt$(EXE) -nostdlib -I $(ROOTDIR)/stdlib -COMPFLAGS = -absname -w +a-4-9-41-42-44-45-48 -warn-error A \ +CAMLOPT = $(OCAMLRUN) $(ROOTDIR)/ocamlopt$(EXE) -nostdlib -I $(ROOTDIR)/stdlib +COMPFLAGS = -absname -w +a-4-9-41-42-44-45-48-70 -warn-error +A \ -safe-string -strict-sequence -strict-formats -bin-annot LINKFLAGS = -CAMLLEX = $(CAMLRUN) $(ROOTDIR)/boot/ocamllex CAMLDEP = $(BOOT_OCAMLC) -depend DEPFLAGS = -slash DEPINCLUDES = @@ -54,32 +58,23 @@ clean:: rm -f $(programs) $(programs:=.exe) rm -f *.cmo *.cmi *.cmx *.cmt *.cmti *.o *.obj -parser.ml parser.mli: parser.mly - $(CAMLYACC) -v parser.mly - clean:: rm -f parser.ml parser.mli parser.output beforedepend:: parser.ml parser.mli -lexer.ml: lexer.mll - $(CAMLLEX) $(OCAMLLEX_FLAGS) $< - clean:: rm -f lexer.ml beforedepend:: lexer.ml -.SUFFIXES: -.SUFFIXES: .ml .cmo .mli .cmi .cmx - -.ml.cmo: +%.cmo: %.ml $(CAMLC) -c $(COMPFLAGS) $< -.mli.cmi: +%.cmi: %.mli $(CAMLC) -c $(COMPFLAGS) $< -.ml.cmx: +%.cmx: %.ml $(CAMLOPT) -c $(COMPFLAGS) $< depend: beforedepend diff --git a/lex/common.ml b/lex/common.ml index 82f74eda..19c23463 100644 --- a/lex/common.ml +++ b/lex/common.ml @@ -55,7 +55,7 @@ let copy_buffer = Bytes.create 1024 let copy_chars_unix ic oc start stop = let n = ref (stop - start) in while !n > 0 do - let m = input ic copy_buffer 0 (min !n 1024) in + let m = input ic copy_buffer 0 (Int.min !n 1024) in output oc copy_buffer 0 m; n := !n - m done diff --git a/lex/cset.ml b/lex/cset.ml index 81515eae..b8f86f17 100644 --- a/lex/cset.ml +++ b/lex/cset.ml @@ -55,9 +55,9 @@ let rec inter l l' = match l, l' with else if c2' < c1 then inter l r' else if c2 < c2' then - (max c1 c1', c2)::inter r l' + (Int.max c1 c1', c2)::inter r l' else - (max c1 c1', c2')::inter l r' + (Int.max c1 c1', c2')::inter l r' let rec diff l l' = match l, l' with _, [] -> l diff --git a/lex/lexgen.ml b/lex/lexgen.ml index 184a8066..af79a342 100644 --- a/lex/lexgen.ml +++ b/lex/lexgen.ml @@ -85,7 +85,14 @@ module Ints = let id_compare (id1,_) (id2,_) = String.compare id1 id2 -let tag_compare t1 t2 = Stdlib.compare t1 t2 +let tag_compare + {id=id1; start=start1; action=action1} + {id=id2; start=start2; action=action2} = + let c = String.compare id1 id2 in + if c <> 0 then c else + let c = Bool.compare start1 start2 in + if c <> 0 then c else + Int.compare action1 action2 module Tags = Set.Make(struct type t = tag_info let compare = tag_compare end) @@ -487,7 +494,7 @@ let encode_casedef casedef = Alt(reg, Seq(r, Action count)), (count, m ,act) :: actions, (succ count), - max loc_ntags ntags) + Int.max loc_ntags ntags) (Empty, [], 0, 0) casedef in r diff --git a/man/ocamlc.m b/man/ocamlc.m index b0608d44..adc5ab80 100644 --- a/man/ocamlc.m +++ b/man/ocamlc.m @@ -526,6 +526,8 @@ produced. If the option is given, specify the name of the packed object file produced. If the .B \-output\-obj +or +.B \-output\-complete\-obj option is given, specify the name of the output file produced. This can also be used when compiling an interface or implementation @@ -559,6 +561,12 @@ option. This option can also be used to produce a C source file (.c extension) or a compiled shared/dynamic library (.so extension). .TP +.B \-output\-complete\-obj +Same as +.B \-output\-obj +except when creating an object file where it includes the runtime and +autolink libraries. +.TP .B \-pack Build a bytecode object file (.cmo file) and its associated compiled interface (.cmi) that combines the object @@ -1017,7 +1025,7 @@ mentioned here corresponds to the empty set. .IP The default setting is -.BR \-w\ +a\-4\-6\-7\-9\-27\-29\-30\-32..42\-44\-45\-48\-50\-60\-66\-67\-68 . +.BR \-w\ +a\-4\-7\-9\-27\-29\-30\-32..42\-44\-45\-48\-50\-60\-66..70 . Note that warnings .BR 5 \ and \ 10 are not always triggered, depending on the internals of the type checker. diff --git a/man/ocamlopt.m b/man/ocamlopt.m index 15400bd9..2c7c5a6c 100644 --- a/man/ocamlopt.m +++ b/man/ocamlopt.m @@ -475,6 +475,12 @@ must be set with the option. This option can also be used to produce a compiled shared/dynamic library (.so extension). +.B \-output\-complete\-obj +Same as +.B \-output\-obj +except the object file produced includes the runtime and +autolink libraries. +.TP .TP .B \-pack Build an object file (.cmx and .o files) and its associated compiled diff --git a/man/ocamlrun.m b/man/ocamlrun.m index ba59d20b..7c4734bb 100644 --- a/man/ocamlrun.m +++ b/man/ocamlrun.m @@ -151,8 +151,7 @@ The initial size of the major heap (in words). .BR a \ (allocation_policy) The policy used for allocating in the OCaml heap. Possible values are 0 for the next-fit policy, 1 for the first-fit -policy, and 2 for the best-fit policy. Best-fit is still experimental, -but probably the best of the three. The default is 0. +policy, and 2 for the best-fit policy. The default is 2. See the Gc module documentation for details. .TP .BR s \ (minor_heap_size) diff --git a/manual/Makefile b/manual/Makefile index afd7ea44..ab11c7a5 100644 --- a/manual/Makefile +++ b/manual/Makefile @@ -13,26 +13,26 @@ tools: $(MAKE) -C tests tools manual: tools - $(MAKE) -C manual all + $(MAKE) -C src all html: tools - $(MAKE) -C manual html + $(MAKE) -C src html web: tools - $(MAKE) -C manual web + $(MAKE) -C src web release: - $(MAKE) -C manual release + $(MAKE) -C src release # The pregen-etex target generates the latex files from the .etex # files to ensure that this phase of the manual build process, which # may execute OCaml fragments and expect certain outputs, is correct pregen-etex: tools - $(MAKE) -C manual etex-files + $(MAKE) -C src etex-files # pregen builds both .etex files and the documentation of the standard library pregen: tools - $(MAKE) -C manual files + $(MAKE) -C src files .PHONY: tests manual tools @@ -40,10 +40,10 @@ pregen: tools .PHONY: clean clean: - $(MAKE) -C manual clean + $(MAKE) -C src clean $(MAKE) -C tools clean $(MAKE) -C tests clean .PHONY: distclean -distclean: - $(MAKE) -C manual distclean +distclean: clean + $(MAKE) -C src distclean diff --git a/manual/README.md b/manual/README.md index 4df8b109..66bebe8d 100644 --- a/manual/README.md +++ b/manual/README.md @@ -4,7 +4,7 @@ OCAML DOCUMENTATION Prerequisites ------------- -- Any prerequisites required to build OCaml from sources. +- Any prerequisites required to build the OCaml compiler from sources. - A LaTeX installation. @@ -15,16 +15,19 @@ Note that you must make sure `hevea.sty` is installed into TeX properly. Your package manager may not do this for you. Run `kpsewhich hevea.sty` to check. -Building +Building the manual -------- -0. Install the OCaml distribution. +0. Build the OCaml compiler (including the native one) from sources. -1. Run `make` in the manual. +You don't need to install the compiler since the manual is built using +the one from the source tree. + +1. Run `make` in the manual directory. NB: If you already set `LD_LIBRARY_PATH` (OS X: `DYLD_LIBRARY_PATH`) - in your environment don't forget to add - `otherlibs/unix:otherlibs/str` to it in an absolute way. + in your environment don't forget to append the absolute paths to + `otherlibs/unix` and `otherlibs/str` to it. Outputs ------- @@ -41,10 +44,11 @@ In the manual: Source files ------------ -The manual is written in an extended dialect of latex and is split in many -source files. During the build process, the sources files are converted into -classical latex file using the tools available in `tools`. These files are -then converted to the different output formats using either latex or hevea. +The manual is written in an extended dialect of LaTeX and is split across many +source files. During the build process, these source files are converted into +classical LaTeX files using the tools available in the `manual/tools` +directory. These files are then converted to the different output +formats using either LaTeX or hevea. Each part of the manual corresponds to a specific directory, and each distinct chapters (or sometimes sections) are mapped to a distinct `.etex` file: @@ -57,12 +61,12 @@ chapters (or sometimes sections) are mapped to a distinct `.etex` file: - Advanced examples with classes and modules: `advexamples.etex` - Part II, The OCaml language: `refman` - This part is separated in two very distinct chapters; the + This part is divided in two very distinct chapters; the `OCaml language` chapter and the `Language extensions` chapter. - The OCaml language: `refman.etex` This chapter consists in a technical description of the OCaml language. - Each section of this chapter is mapped to a separated latex file: + Each section of this chapter is mapped to a separate LaTeX file: - `lex.etex`, `values.etex`, `names.etex`, `types.etex`, `const.etex`, `patterns.etex`, `expr.etex`, `typedecl.etex`, `classes.etex`, `modtypes.etex`, `compunit.etex` @@ -127,13 +131,13 @@ A similar macro, `\lparagraph`, is provided for paragraphs. ### Caml environments -The tool `tools/caml-tex` is used to generate the latex code for the examples +The tool `tools/caml-tex` is used to generate the LaTeX code for the examples in the introduction and language extension parts of the manual. It implements two pseudo-environments: `caml_example` and `caml_eval`. The pseudo-environment `caml_example` evaluates its contents using an ocaml interpreter and then translates both the input code and the interpreter output -to latex code, e.g. +to LaTeX code, e.g. ```latex \begin{caml_example}{toplevel} let f x = x;; diff --git a/manual/manual/.gitignore b/manual/manual/.gitignore deleted file mode 100644 index 04dd6ffc..00000000 --- a/manual/manual/.gitignore +++ /dev/null @@ -1,9 +0,0 @@ -allfiles.tex -biblio.tex -foreword.tex -version.tex -warnings.etex -warnings.tex -foreword.htex -manual.html -webman diff --git a/manual/manual/Makefile b/manual/manual/Makefile deleted file mode 100644 index 05622334..00000000 --- a/manual/manual/Makefile +++ /dev/null @@ -1,178 +0,0 @@ -SRC = $(abspath ../..) - -export LD_LIBRARY_PATH ?= "$(SRC)/otherlibs/unix/:$(SRC)/otherlibs/str/" -export DYLD_LIBRARY_PATH ?= "$(SRC)/otherlibs/unix/:$(SRC)/otherlibs/str/" -SET_LD_PATH = CAML_LD_LIBRARY_PATH=$(LD_LIBRARY_PATH) - -OCAMLDOC = $(if $(wildcard $(SRC)/ocamldoc/ocamldoc.opt),\ - $(SRC)/ocamldoc/ocamldoc.opt,\ - $(SET_LD_PATH) $(SRC)/runtime/ocamlrun $(SRC)/ocamldoc/ocamldoc)\ - -hide Stdlib -lib Stdlib -nostdlib \ - -pp "$(AWK) -v ocamldoc=true -f $(SRC)/stdlib/expand_module_aliases.awk" - - -# Import the list of mli files for the library docs -include $(SRC)/ocamldoc/Makefile.docfiles - -TEXQUOTE = $(SRC)/runtime/ocamlrun ../tools/texquote2 - - -FILES = allfiles.tex biblio.tex foreword.tex version.tex warnings-help.etex - -TEXINPUTS = ".:..:../refman:../library:../cmds:../tutorials:../../styles:" -RELEASE = $$HOME/release/$${RELEASENAME} -HEVEA = hevea -HACHA = hacha -# We suppress warnings in info and text mode (with -s) because hevea listings emit -# DIV blocks that the text modes do not know how to interpret. -INFO_FLAGS = -fix -exec xxdate.exe -info -w 79 -s -HTML_FLAGS = -fix -exec xxdate.exe -O -TEXT_FLAGS = -fix -exec xxdate.exe -text -w 79 -s - - -manual: files - cd texstuff \ - && TEXINPUTS=$(TEXINPUTS) pdflatex manual.tex - -index: - cd texstuff \ - && sh ../../tools/fix_index.sh manual.idx \ - && makeindex manual.idx \ - && makeindex manual.kwd.idx - - -# libref/style.css and comilerlibref/style.css are used as witness -# for the generation of the html stdlib and compilerlibs reference. -html: htmlman/libref/style.css htmlman/compilerlibref/style.css etex-files - cd htmlman \ - && $(HEVEA) $(HTML_FLAGS) \ - -I .. -I ../cmds -I ../library -I ../refman -I ../tutorials \ - -I ../../styles -I ../texstuff \ - manual.hva -e macros.tex ../manual.tex \ - && $(HACHA) -tocter manual.html - -htmlman/libref/style.css: style.css $(STDLIB_MLIS) $(DOC_STDLIB_TEXT) - mkdir -p htmlman/libref - $(OCAMLDOC) -colorize-code -sort -html \ - -charset "UTF-8" \ - -d htmlman/libref \ - $(DOC_STDLIB_INCLUDES) \ - $(DOC_STDLIB_TEXT:%=-text %) \ - $(STDLIB_MLIS) - cp style.css $@ - -COMPILERLIBS_MODULES=$(shell echo $(basename $(notdir $(COMPILERLIBS_MLIS))) \ -| sed "s/\<./\U&/g") - -library/compiler_libs.txt: library/compiler_libs.mld - cp $< $@ && echo "{!modules:$(COMPILERLIBS_MODULES)}" >> $@ - - -htmlman/compilerlibref/style.css: library/compiler_libs.txt style.css \ - $(COMPILERLIBS_MLIS) - mkdir -p htmlman/compilerlibref - $(OCAMLDOC) -colorize-code -sort -html \ - -charset "UTF-8" \ - -d htmlman/compilerlibref \ - -I $(SRC)/stdlib \ - $(DOC_COMPILERLIBS_INCLUDES) \ - -intro library/compiler_libs.txt \ - library/compiler_libs.txt \ - $(COMPILERLIBS_MLIS) - cp style.css $@ - - -info: files - cd infoman \ - && rm -f ocaml.info* \ - && $(HEVEA) $(INFO_FLAGS) -o ocaml.info.body \ - -I .. -I ../cmds -I ../library -I ../refman -I ../tutorials \ - -I ../../styles -I ../texstuff \ - ../manual.inf -e macros.tex ../manual.tex - cat manual.info.header infoman/ocaml.info.body > infoman/ocaml.info - cd infoman \ - && rm -f ocaml.info.tmp ocaml.info.body \ - && gzip -9 ocaml.info* - -text: files - cd textman \ - && $(HEVEA) $(TEXT_FLAGS) \ - -I .. -I ../cmds -I ../library -I ../refman -I ../tutorials \ - -I ../../styles -I ../texstuff \ - ../manual.inf -e macros.tex ../manual.tex - - -all: - $(MAKE) html text info manual - $(MAKE) manual - $(MAKE) index - $(MAKE) manual - -release: all - cp htmlman/manual.html $(RELEASE)refman.html - rm -f htmlman/manual.{html,haux,hmanual*,htoc} - tar zcf $(RELEASE)refman-html.tar.gz \ - htmlman/*.* htmlman/libref htmlman/compilerlibref htmlman/fonts - zip -8 $(RELEASE)refman-html.zip \ - htmlman/*.* htmlman/libref/*.* htmlman/compilerlibref/*.* \ - htmlman/fonts/*.* - cp texstuff/manual.pdf $(RELEASE)refman.pdf - cp textman/manual.txt $(RELEASE)refman.txt - tar cf - infoman/ocaml.info* | gzip > $(RELEASE)refman.info.tar.gz - -web: html - $(MAKE) -C html_processing all - -files: $(FILES) - $(MAKE) -C cmds all - $(MAKE) -C library all - $(MAKE) -C refman all - $(MAKE) -C tutorials all - -etex-files: $(FILES) - $(MAKE) -C cmds etex-files - $(MAKE) -C library etex-files - $(MAKE) -C refman etex-files - $(MAKE) -C tutorials etex-files - - -%.tex: %.etex - $(TEXQUOTE) < $< > $*.texquote_error.tex - mv $*.texquote_error.tex $@ - -version.tex: $(SRC)/VERSION - sed -n -e '1s/^\([0-9]*\.[0-9]*\).*$$/\\def\\ocamlversion{\1}/p' $< > $@ - -warnings-help.etex: $(SRC)/utils/warnings.ml $(SRC)/ocamlc - (echo "% This file is generated from (ocamlc -warn-help)";\ - echo "% according to a rule in manual/manual/Makefile.";\ - echo "% In particular, the reference to documentation sections";\ - echo "% are inserted through the Makefile, which should be updated";\ - echo "% when a new warning is documented.";\ - echo "%";\ - $(SET_LD_PATH) $(SRC)/boot/ocamlrun $(SRC)/ocamlc -warn-help \ - | sed -e 's/^ *\([0-9][0-9]*\) *\[\([a-z][a-z-]*\)\]\(.*\)/\\item[\1 "\2"] \3/' \ - -e 's/^ *\([0-9A-Z][0-9]*\) *\([^]].*\)/\\item[\1] \2/'\ - ) >$@ -# sed --inplace is not portable, emulate - for i in 52 57; do\ - sed\ - s'/\\item\[\('$$i'[^]]*\)\]/\\item\[\1 (see \\ref{ss:warn'$$i'})\]/'\ - $@ > $@.tmp;\ - mv $@.tmp $@;\ - done - - -.PHONY: clean -clean: - rm -f $(FILES) *.texquote_error - $(MAKE) -C cmds clean - $(MAKE) -C library clean - $(MAKE) -C refman clean - $(MAKE) -C tutorials clean - $(MAKE) -C html_processing clean - -rm -f texstuff/* - cd htmlman; rm -rf libref compilerlibref index.html \ - manual*.html *.haux *.hind *.svg - cd textman; rm -f manual.txt *.haux *.hind - cd infoman; rm -f ocaml.info ocaml.info-* *.haux *.hind diff --git a/manual/manual/allfiles.etex b/manual/manual/allfiles.etex deleted file mode 100644 index 3ece8a9c..00000000 --- a/manual/manual/allfiles.etex +++ /dev/null @@ -1,100 +0,0 @@ -\makeindex{\jobname} -\makeindex{\jobname.kwd} - -\setlength{\emergencystretch}{50pt} % pour que TeX resolve les overfull hbox lui-meme - -\begin{document} - -\thispagestyle{empty} -\begin{maintitle} -~\vfill -\Huge The OCaml system \\ - release \ocamlversion \\[1cm] -\Large Documentation and user's manual \\[1cm] -\large Xavier Leroy, \\ - Damien Doligez, Alain Frisch, Jacques Garrigue, Didier Rémy and Jérôme Vouillon \\[1cm] - \today \\ - ~ -\vfill -\normalsize Copyright \copyright\ \number\year\ Institut National de - Recherche en Informatique et en Automatique -\end{maintitle} -\cleardoublepage -\setcounter{page}{1} - -\begin{htmlonly} -\begin{maintitle} -\vspace*{2ex} -This manual is also available in -\ahref{https://ocaml.org/releases/\ocamlversion/ocaml-\ocamlversion-refman.pdf}{PDF}, -\ahref{https://ocaml.org/releases/\ocamlversion/ocaml-\ocamlversion-refman.txt}{plain text}, -as a -\ahref{https://ocaml.org/releases/\ocamlversion/ocaml-\ocamlversion-refman-html.tar.gz}{bundle of HTML files}, -and as a -\ahref{https://ocaml.org/releases/\ocamlversion/ocaml-\ocamlversion-refman.info.tar.gz}{bundle of Emacs Info files}. -\end{maintitle} -\end{htmlonly} - -\tableofcontents - -\input{foreword.tex} - -\part{An introduction to OCaml} -\label{p:tutorials} -\input{coreexamples.tex} -\input{moduleexamples.tex} -\input{objectexamples.tex} -\input{lablexamples.tex} -\input{polymorphism.tex} -\input{advexamples.tex} - -\part{The OCaml language} -\label{p:refman} -\input{refman.tex} -\input{exten.tex} - -\part{The OCaml tools} -\label{p:commands} - -\input{comp.tex} -\input{top.tex} -\input{runtime.tex} -\input{native.tex} -\input{lexyacc.tex} -\input{ocamldep.tex} -\input{ocamldoc.tex} -\input{debugger.tex} -\input{profil.tex} -\input{intf-c.tex} -\input{flambda.tex} -\input{afl-fuzz.tex} -\input{instrumented-runtime.tex} - -\part{The OCaml library} -\label{p:library} -\input{core.tex} -\input{stdlib-blurb.tex} -\input{compilerlibs.tex} -\input{libunix.tex} -\input{libstr.tex} -\input{libthreads.tex} -\input{libdynlink.tex} -\input{old.tex} - -\part{Indexes} -\label{p:indexes} - -\ifouthtml -\begin{links} -\item \ahref{libref/index_modules.html}{Index of modules} -\item \ahref{libref/index_module_types.html}{Index of module types} -\item \ahref{libref/index_types.html}{Index of types} -\item \ahref{libref/index_exceptions.html}{Index of exceptions} -\item \ahref{libref/index_values.html}{Index of values} -\end{links} -\else -\printindex{\jobname}{Index to the library} -\fi -\printindex{\jobname.kwd}{Index of keywords} - -\end{document} diff --git a/manual/manual/anchored_book.hva b/manual/manual/anchored_book.hva deleted file mode 100644 index 093d3859..00000000 --- a/manual/manual/anchored_book.hva +++ /dev/null @@ -1,30 +0,0 @@ -%hevea book class with anchor links in headers -\input{bookcommon.hva} -\newcommand{\@book@attr}[1]{\@secid\envclass@attr{#1}} -\newcommand{\@titlesecanchor}{\@open{a}{class="section-anchor" href="\#\@sec@id@attr" aria-hidden="true"}\@print@u{xfeff}\@close{a}} -\@makesection - {\part}{-2}{part} - {\@opencell{class="center"}{}{}\@open{h1}{\@book@attr{part}}}% - {\partname~\thepart}{\\}% - {\@close{h1}\@closecell} -\newstyle{.part}{margin:2ex auto;text-align:center} -\@makesection - {\chapter}{-1}{chapter} - {\@open{h1}{\@book@attr{chapter}}}{\chaptername~\thechapter}{\quad}{\@close{h1}} -\@makesection - {\section}{0}{section} - {\@open{h2}{\@book@attr{section}}\@titlesecanchor}{\thesection}{\quad}{\@close{h2}}% -\@makesection - {\subsection}{1}{subsection} - {\@open{h3}{\@book@attr{subsection}}\@titlesecanchor}{\thesubsection}{\quad}{\@close{h3}}% -\@makesection - {\subsubsection}{2}{subsubsection} - {\@open{h4}{\@book@attr{subsubsection}}\@titlesecanchor}{\thesubsubsection}{\quad}{\@close{h4}}% -\@makesection - {\paragraph}{3}{paragraph} - {\@open{h5}{\@book@attr{paragraph}}\@titlesecanchor}{\theparagraph}{\quad}{\@close{h5}}% -\@makesection - {\subparagraph}{4}{subparagraph} - {\@open{h6}{\@book@attr{subparagraph}}\@titlesecanchor}{\thesubparagraph}{\quad}{\@close{h6}}% -\newcommand{\hacha@style}{book}% -\styleloadedtrue diff --git a/manual/manual/biblio.etex b/manual/manual/biblio.etex deleted file mode 100644 index c1677702..00000000 --- a/manual/manual/biblio.etex +++ /dev/null @@ -1,240 +0,0 @@ -\chapter{Further reading} - -For the interested reader, we list below some references to books and -reports related (sometimes loosely) to Caml Light. - -\section{Programming in ML} - -The books below are programming courses taught in ML. Their main goal -is to teach programming, not to describe ML in full details --- though -most contain fairly good introductions to the ML language. Some of -those books use the Standard ML dialect instead of the Caml dialect, -so you will have to keep in mind the differences in syntax and in -semantics. - -\begin{itemize} - -\item Pierre Weis and Xavier Leroy. {\it Le langage Caml.} -InterÉditions, 1993. - -The natural companion to this manual, provided you read French. This -book is a step-by-step introduction to programming in Caml, and -presents many realistic examples of Caml programs. - -\item Guy Cousineau and Michel Mauny. {\it Approche fonctionnelle de -la programmation}. Ediscience, 1995. - -Another Caml programming course written in French, with many original -examples. - -\item Lawrence C.\ Paulson. {\it ML for the working programmer.} -Cambridge University Press, 1991. - -A good introduction to programming in Standard ML. Develops a -theorem prover as a complete example. Contains a presentation of -the module system of Standard ML. - -\item Jeffrey D.\ Ullman. {\it Elements of ML programming.} -Prentice Hall, 1993. - -Another good introduction to programming in Standard ML. No realistic -examples, but a very detailed presentation of the language constructs. - -\item Ryan Stansifer. {\em ML primer.} Prentice-Hall, 1992. - -A short, but nice introduction to programming in Standard ML. - -\item Thérèse Accart Hardin and Véronique Donzeau-Gouge Viguié. {\em -Concepts et outils de la programmation. Du fonctionnel à -l'impératif avec Caml et Ada.} InterÉditions, 1992. - -A first course in programming, that first introduces the main programming -notions in Caml, then shows them underlying Ada. Intended for -beginners; slow-paced for the others. - -\item Rachel Harrison. {\em Abstract Data Types in Standard ML}. -John Wiley \& Sons, 1993. - -A presentation of Standard ML from the standpoint of abstract data -types. Uses intensively the Standard ML module system. - -\item Harold Abelson and Gerald Jay Sussman. -{\em Structure and Interpretation of Computer Programs.} The MIT -press, 1985. (French translation: {\em Structure et interprétation -des programmes informatiques}, InterÉditions, 1989.) - -An outstanding course on programming, taught in Scheme, the modern -dialect of Lisp. Well worth reading, even if you are more interested -in ML than in Lisp. - -\end{itemize} - -\section{Descriptions of ML dialects} - -The books and reports below are descriptions of various programming -languages from the ML family. They assume some familiarity with ML. - -\begin{itemize} - -\item Xavier Leroy and Pierre Weis. {\em Manuel de référence du -langage Caml.} InterÉditions, 1993. - -The French edition of the present reference manual and user's manual. - -\item Robert Harper. {\em Introduction to Standard ML.} Technical -report ECS-LFCS-86-14, University of Edinburgh, 1986. - -An overview of Standard ML, including the module system. Terse, but -still readable. - -\item Robin Milner, Mads Tofte and Robert Harper. {\em The definition -of Standard ML.} The MIT press, 1990. - -A complete formal definition of Standard ML, in the framework of -structured operational semantics. This book is probably the most -mathematically precise definition of a programming language ever -written. It is heavy on formalism and extremely terse, so -even readers who are thoroughly familiar with ML will have -major difficulties with it. - -\item Robin Milner and Mads Tofte. {\em Commentary on Standard ML.} -The MIT Press, 1991. - -A commentary on the book above, that attempts to explain the most -delicate parts and motivate the design choices. Easier to read than the -Definition, but still rather involving. - -\item Guy Cousineau and Gérard Huet. {\em The CAML primer.} Technical -report~122, INRIA, 1990. - -A short description of the original Caml system, from which Caml Light -has evolved. Some familiarity with Lisp is assumed. - -\item Pierre Weis et al. {\em The CAML reference manual, version -2.6.1.} Technical report~121, INRIA, 1990. - -The manual for the original Caml system, from which Caml Light -has evolved. - -\item Michael J.\ Gordon, Arthur J.\ Milner and Christopher P.\ Wadsworth. -{\em Edinburgh LCF.} Lecture Notes in Computer Science -volume~78, Springer-Verlag, 1979. - -This is the first published description of the ML language, at the -time when it was nothing more than the control language for the LCF -system, a theorem prover. This book is now obsolete, since the ML -language has much evolved since then; but it is still of historical -interest. - -\item Paul Hudak, Simon Peyton-Jones and Philip Wadler. {\em -Report on the programming language Haskell, version 1.1.} Technical -report, Yale University, 1991. - -Haskell is a purely functional language with lazy semantics that -shares many important points with ML (full functionality, polymorphic -typing), but has interesting features of its own (dynamic overloading, -also called type classes). - -\end{itemize} - -\section{Implementing functional programming languages} - -The references below are intended for those who are curious to learn -how a language like Caml Light is compiled and implemented. - -\begin{itemize} - -\item Xavier Leroy. {\em The ZINC experiment: an economical -implementation of the ML language.} Technical report~117, INRIA, 1990. -(Available by anonymous FTP on "ftp.inria.fr".) - -A description of the ZINC implementation, the prototype ML -implementation that has evolved into Caml Light. Large parts of this -report still apply to the current Caml Light system, in particular the -description of the execution model and abstract machine. Other parts -are now obsolete. Yet this report still gives a complete overview of the -implementation techniques used in Caml Light. - -\item Simon Peyton-Jones. {\em The implementation of functional -programming languages.} Prentice-Hall, 1987. (French translation: -{\em Mise en \oe uvre des langages fonctionnels de programmation}, -Masson, 1990.) - -An excellent description of the implementation of purely functional -languages with lazy semantics, using the technique known as graph -reduction. The part of the book that deals with the transformation -from ML to enriched lambda-calculus directly applies to Caml Light. -You will find a good description of how pattern-matching is compiled -and how types are inferred. The remainder of the book does not apply -directly to Caml Light, since Caml Light is not purely functional (it -has side-effects), has strict semantics, and does not use graph -reduction at all. - -\item Andrew W.\ Appel. {\em Compiling with continuations.} Cambridge -University Press, 1992. - -A complete description of an optimizing compiler for Standard ML, -based on an intermediate representation called continuation-passing -style. Shows how many advanced program optimizations can be applied to -ML. Not directly relevant to the Caml Light system, since Caml Light -does not use continuation-passing style at all, and makes little -attempts at optimizing programs. - -\end{itemize} - -\section{Applications of ML} - -The following reports show ML at work in various, sometimes -unexpected, areas. - -\begin{itemize} - -\item Emmanuel Chailloux and Guy Cousineau. {\em The MLgraph primer.} -Technical report 92-15, École Normale Supérieure, 1992. (Available by -anonymous FTP on "ftp.ens.fr".) -%, répertoire "biblio", fichier -% "liens-92-15.A4.300dpi.ps.Z".) - -Describes a Caml Light library that produces Postscript pictures -through high-level drawing functions. - -\item Xavier Leroy. {\em Programmation du système Unix en Caml Light.} -Technical report~147, INRIA, 1992. (Available by anonymous FTP on -"ftp.inria.fr".) -%, répertoire "INRIA/publication", fichier "RT-0147.ps.Z".) - -A Unix systems programming course, demonstrating the use of the Caml -Light library that gives access to Unix system calls. - -\item John H.\ Reppy. {\em Concurrent programming with events --- The -concurrent ML manual.} Cornell University, 1990. -(Available by anonymous FTP on "research.att.com".) -%, répertoire "dist/ml", fichier "CML-0.9.8.tar.Z".) - -Concurrent ML extends Standard ML of New Jersey with concurrent -processes that communicate through channels and events. - -\item Jeannette M. Wing, Manuel Faehndrich, J.\ Gregory Morrisett and -Scottt Nettles. {\em Extensions to Standard ML to support -transactions.} Technical report CMU-CS-92-132, Carnegie-Mellon -University, 1992. (Available by anonymous FTP on -"reports.adm.cs.cmu.edu".) -% , répertoire "1992", fichier "CMU-CS-92-132.ps".) - -How to integrate the basic database operations to Standard ML. - -\item Emden R.\ Gansner and John H.\ Reppy. {\em eXene.} Bell Labs, -1991. (Available by anonymous FTP on "research.att.com".) -%, répertoire "dist/ml", fichier "eXene-0.4.tar.Z".) - -An interface between Standard ML of New Jersey and the X Windows -windowing system. - -%% \item Daniel de Rauglaudre. {\em X toolkit in Caml Light.} INRIA, -%% 1992. (Included in the Caml Light distribution.) -%% % Disponible par FTP anonyme sur -%% % "ftp.inria.fr", répertoire "lang/caml-light", fichier "rt5.tar.Z".) -%% -%% An interface between Caml Light and the X Windows windowing system. - -\end{itemize} diff --git a/manual/manual/cmds/.gitignore b/manual/manual/cmds/.gitignore deleted file mode 100644 index 0d45900b..00000000 --- a/manual/manual/cmds/.gitignore +++ /dev/null @@ -1,3 +0,0 @@ -*.tex -*.htex -warnings.etex diff --git a/manual/manual/cmds/Makefile b/manual/manual/cmds/Makefile deleted file mode 100644 index 273835b1..00000000 --- a/manual/manual/cmds/Makefile +++ /dev/null @@ -1,52 +0,0 @@ -TOPDIR = ../../.. -include $(TOPDIR)/Makefile.tools - -LD_PATH = "$(TOPDIR)/otherlibs/str:$(TOPDIR)/otherlibs/unix" - -TOOLS = ../../tools -CAMLLATEX = $(SET_LD_PATH) \ - $(OCAMLRUN) $(TOPDIR)/tools/caml-tex \ - -repo-root $(TOPDIR) -n 80 -v false -TEXQUOTE = $(OCAMLRUN) $(TOOLS)/texquote2 -TRANSF = $(SET_LD_PATH) $(OCAMLRUN) $(TOOLS)/transf - -FILES = comp.tex top.tex runtime.tex native.tex lexyacc.tex intf-c.tex \ - ocamldep.tex profil.tex debugger.tex ocamldoc.tex \ - warnings-help.tex flambda.tex \ - afl-fuzz.tex instrumented-runtime.tex unified-options.tex - -WITH_TRANSF = top.tex intf-c.tex flambda.tex \ - afl-fuzz.tex lexyacc.tex debugger.tex - -WITH_CAMLEXAMPLE = instrumented-runtime.tex ocamldoc.tex - - -etex-files: $(FILES) -all: $(FILES) - - -%.tex: %.etex - $(TEXQUOTE) < $< > $*.texquote_error.tex - mv $*.texquote_error.tex $@ - -$(WITH_TRANSF): %.tex: %.etex - $(TRANSF) < $< > $*.transf_error.tex - mv $*.transf_error.tex $*.transf_gen.tex - $(TEXQUOTE) < $*.transf_gen.tex > $*.texquote_error.tex - mv $*.texquote_error.tex $@ - -$(WITH_CAMLEXAMPLE): %.tex: %.etex - $(CAMLLATEX) $< -o $*.gen.tex - $(TRANSF) < $*.gen.tex > $*.transf_error.tex - mv $*.transf_error.tex $*.transf_gen.tex - $(TEXQUOTE) < $*.transf_gen.tex > $*.texquote_error.tex - mv $*.texquote_error.tex $@ - -warnings-help.etex: ../warnings-help.etex - cp $< $@ - - -.PHONY: clean -clean: - rm -f *.tex - rm -f warnings-help.etex diff --git a/manual/manual/cmds/afl-fuzz.etex b/manual/manual/cmds/afl-fuzz.etex deleted file mode 100644 index 5426918f..00000000 --- a/manual/manual/cmds/afl-fuzz.etex +++ /dev/null @@ -1,73 +0,0 @@ -\chapter{Fuzzing with afl-fuzz} -%HEVEA\cutname{afl-fuzz.html} - -\section{s:afl-overview}{Overview} - -American fuzzy lop (``afl-fuzz'') is a {\em fuzzer}, a tool for -testing software by providing randomly-generated inputs, searching for -those inputs which cause the program to crash. - -Unlike most fuzzers, afl-fuzz observes the internal behaviour of the -program being tested, and adjusts the test cases it generates to -trigger unexplored execution paths. As a result, test cases generated -by afl-fuzz cover more of the possible behaviours of the tested -program than other fuzzers. - -This requires that programs to be tested are instrumented to -communicate with afl-fuzz. The native-code compiler ``ocamlopt'' can -generate such instrumentation, allowing afl-fuzz to be used against -programs written in OCaml. - -For more information on afl-fuzz, see the website at -\ifouthtml -\ahref{http://lcamtuf.coredump.cx/afl/}{http://lcamtuf.coredump.cx/afl/}. -\else -{\tt http://lcamtuf.coredump.cx/afl/} -\fi - -\section{s:afl-generate}{Generating instrumentation} - -The instrumentation that afl-fuzz requires is not generated by -default, and must be explicitly enabled, by passing the {\tt - -afl-instrument} option to {\tt ocamlopt}. - -To fuzz a large system without modifying build tools, OCaml's {\tt - configure} script also accepts the {\tt afl-instrument} option. If -OCaml is configured with {\tt afl-instrument}, then all programs -compiled by {\tt ocamlopt} will be instrumented. - -\subsection{ss:afl-advanced}{Advanced options} - -In rare cases, it is useful to control the amount of instrumentation -generated. By passing the {\tt -afl-inst-ratio N} argument to {\tt - ocamlopt} with {\tt N} less than 100, instrumentation can be -generated for only N\% of branches. (See the afl-fuzz documentation on -the parameter {\tt AFL\_INST\_RATIO} for the precise effect of this). - -\section{s:afl-example}{Example} - -As an example, we fuzz-test the following program, {\tt readline.ml}: - -\begin{verbatim} -let _ = - let s = read_line () in - match Array.to_list (Array.init (String.length s) (String.get s)) with - ['s'; 'e'; 'c'; 'r'; 'e'; 't'; ' '; 'c'; 'o'; 'd'; 'e'] -> failwith "uh oh" - | _ -> () -\end{verbatim} - -There is a single input (the string ``secret code'') which causes this -program to crash, but finding it by blind random search is infeasible. - -Instead, we compile with afl-fuzz instrumentation enabled: -\begin{verbatim} -ocamlopt -afl-instrument readline.ml -o readline -\end{verbatim} -Next, we run the program under afl-fuzz: -\begin{verbatim} -mkdir input -echo asdf > input/testcase -mkdir output -afl-fuzz -i input -o output ./readline -\end{verbatim} -By inspecting instrumentation output, the fuzzer finds the crashing input quickly. diff --git a/manual/manual/cmds/comp.etex b/manual/manual/cmds/comp.etex deleted file mode 100644 index 649c9d56..00000000 --- a/manual/manual/cmds/comp.etex +++ /dev/null @@ -1,525 +0,0 @@ -\chapter{Batch compilation (ocamlc)} \label{c:camlc} -%HEVEA\cutname{comp.html} - -This chapter describes the OCaml batch compiler "ocamlc", -which compiles OCaml source files to bytecode object files and links -these object files to produce standalone bytecode executable files. -These executable files are then run by the bytecode interpreter -"ocamlrun". - -\section{s:comp-overview}{Overview of the compiler} - -The "ocamlc" command has a command-line interface similar to the one of -most C compilers. It accepts several types of arguments and processes them -sequentially, after all options have been processed: - -\begin{itemize} -\item -Arguments ending in ".mli" are taken to be source files for -compilation unit interfaces. Interfaces specify the names exported by -compilation units: they declare value names with their types, define -public data types, declare abstract data types, and so on. From the -file \var{x}".mli", the "ocamlc" compiler produces a compiled interface -in the file \var{x}".cmi". - -\item -Arguments ending in ".ml" are taken to be source files for compilation -unit implementations. Implementations provide definitions for the -names exported by the unit, and also contain expressions to be -evaluated for their side-effects. From the file \var{x}".ml", the "ocamlc" -compiler produces compiled object bytecode in the file \var{x}".cmo". - -If the interface file \var{x}".mli" exists, the implementation -\var{x}".ml" is checked against the corresponding compiled interface -\var{x}".cmi", which is assumed to exist. If no interface -\var{x}".mli" is provided, the compilation of \var{x}".ml" produces a -compiled interface file \var{x}".cmi" in addition to the compiled -object code file \var{x}".cmo". The file \var{x}".cmi" produced -corresponds to an interface that exports everything that is defined in -the implementation \var{x}".ml". - -\item -Arguments ending in ".cmo" are taken to be compiled object bytecode. These -files are linked together, along with the object files obtained -by compiling ".ml" arguments (if any), and the OCaml standard -library, to produce a standalone executable program. The order in -which ".cmo" and ".ml" arguments are presented on the command line is -relevant: compilation units are initialized in that order at -run-time, and it is a link-time error to use a component of a unit -before having initialized it. Hence, a given \var{x}".cmo" file must come -before all ".cmo" files that refer to the unit \var{x}. - -\item -Arguments ending in ".cma" are taken to be libraries of object bytecode. -A library of object bytecode packs in a single file a set of object -bytecode files (".cmo" files). Libraries are built with "ocamlc -a" -(see the description of the "-a" option below). The object files -contained in the library are linked as regular ".cmo" files (see -above), in the order specified when the ".cma" file was built. The -only difference is that if an object file contained in a library is -not referenced anywhere in the program, then it is not linked in. - -\item -Arguments ending in ".c" are passed to the C compiler, which generates -a ".o" object file (".obj" under Windows). This object file is linked -with the program if the "-custom" flag is set (see the description of -"-custom" below). - -\item -Arguments ending in ".o" or ".a" (".obj" or ".lib" under Windows) -are assumed to be C object files and libraries. They are passed to the -C linker when linking in "-custom" mode (see the description of -"-custom" below). - -\item -Arguments ending in ".so" (".dll" under Windows) -are assumed to be C shared libraries (DLLs). During linking, they are -searched for external C functions referenced from the OCaml code, -and their names are written in the generated bytecode executable. -The run-time system "ocamlrun" then loads them dynamically at program -start-up time. - -\end{itemize} - -The output of the linking phase is a file containing compiled bytecode -that can be executed by the OCaml bytecode interpreter: -the command named "ocamlrun". If "a.out" is the name of the file -produced by the linking phase, the command -\begin{alltt} - ocamlrun a.out \nth{arg}{1} \nth{arg}{2} \ldots \nth{arg}{n} -\end{alltt} -executes the compiled code contained in "a.out", passing it as -arguments the character strings \nth{arg}{1} to \nth{arg}{n}. -(See chapter~\ref{c:runtime} for more details.) - -On most systems, the file produced by the linking -phase can be run directly, as in: -\begin{alltt} - ./a.out \nth{arg}{1} \nth{arg}{2} \ldots \nth{arg}{n} -\end{alltt} -The produced file has the executable bit set, and it manages to launch -the bytecode interpreter by itself. - -The compiler is able to emit some information on its internal stages. -It can output ".cmt" files for the implementation of the compilation unit -and ".cmti" for signatures if the option "-bin-annot" is passed to it (see the -description of "-bin-annot" below). -Each such file contains a typed abstract syntax tree (AST), that is produced -during the type checking procedure. This tree contains all available information -about the location and the specific type of each term in the source file. -The AST is partial if type checking was unsuccessful. - -These ".cmt" and ".cmti" files are typically useful for code inspection tools. - -\section{s:comp-options}{Options} - -The following command-line options are recognized by "ocamlc". -The options "-pack", "-a", "-c" and "-output-obj" are mutually exclusive. -% Define boolean variables used by the macros in unified-options.etex -\newif\ifcomp \comptrue -\newif\ifnat \natfalse -\newif\iftop \topfalse -% unified-options gathers all options across the native/bytecode -% compilers and toplevel -\input{unified-options.tex} - -\paragraph{contextual-cli-control}{Contextual control of command-line options} - -The compiler command line can be modified ``from the outside'' -with the following mechanisms. These are experimental -and subject to change. They should be used only for experimental and -development work, not in released packages. - -\begin{options} -\item["OCAMLPARAM" \rm(environment variable)] -A set of arguments that will be inserted before or after the arguments from -the command line. Arguments are specified in a comma-separated list -of "name=value" pairs. A "_" is used to specify the position of -the command line arguments, i.e. "a=x,_,b=y" means that "a=x" should be -executed before parsing the arguments, and "b=y" after. Finally, -an alternative separator can be specified as the -first character of the string, within the set ":|; ,". -\item["ocaml_compiler_internal_params" \rm(file in the stdlib directory)] -A mapping of file names to lists of arguments that -will be added to the command line (and "OCAMLPARAM") arguments. -\item["OCAML_FLEXLINK" \rm(environment variable)] -Alternative executable to use on native -Windows for "flexlink" instead of the -configured value. Primarily used for bootstrapping. -\end{options} - -\section{s:modules-file-system}{Modules and the file system} - -This short section is intended to clarify the relationship between the -names of the modules corresponding to compilation units and the names -of the files that contain their compiled interface and compiled -implementation. - -The compiler always derives the module name by taking the capitalized -base name of the source file (".ml" or ".mli" file). That is, it -strips the leading directory name, if any, as well as the ".ml" or -".mli" suffix; then, it set the first letter to uppercase, in order to -comply with the requirement that module names must be capitalized. -For instance, compiling the file "mylib/misc.ml" provides an -implementation for the module named "Misc". Other compilation units -may refer to components defined in "mylib/misc.ml" under the names -"Misc."\var{name}; they can also do "open Misc", then use unqualified -names \var{name}. - -The ".cmi" and ".cmo" files produced by the compiler have the same -base name as the source file. Hence, the compiled files always have -their base name equal (modulo capitalization of the first letter) to -the name of the module they describe (for ".cmi" files) or implement -(for ".cmo" files). - -When the compiler encounters a reference to a free module identifier -"Mod", it looks in the search path for a file named "Mod.cmi" or "mod.cmi" -and loads the compiled interface -contained in that file. As a consequence, renaming ".cmi" files is not -advised: the name of a ".cmi" file must always correspond to the name -of the compilation unit it implements. It is admissible to move them -to another directory, if their base name is preserved, and the correct -"-I" options are given to the compiler. The compiler will flag an -error if it loads a ".cmi" file that has been renamed. - -Compiled bytecode files (".cmo" files), on the other hand, can be -freely renamed once created. That's because the linker never attempts -to find by itself the ".cmo" file that implements a module with a -given name: it relies instead on the user providing the list of ".cmo" -files by hand. - -\section{s:comp-errors}{Common errors} - -This section describes and explains the most frequently encountered -error messages. - -\begin{options} - -\item[Cannot find file \var{filename}] -The named file could not be found in the current directory, nor in the -directories of the search path. The \var{filename} is either a -compiled interface file (".cmi" file), or a compiled bytecode file -(".cmo" file). If \var{filename} has the format \var{mod}".cmi", this -means you are trying to compile a file that references identifiers -from module \var{mod}, but you have not yet compiled an interface for -module \var{mod}. Fix: compile \var{mod}".mli" or \var{mod}".ml" -first, to create the compiled interface \var{mod}".cmi". - -If \var{filename} has the format \var{mod}".cmo", this -means you are trying to link a bytecode object file that does not -exist yet. Fix: compile \var{mod}".ml" first. - -If your program spans several directories, this error can also appear -because you haven't specified the directories to look into. Fix: add -the correct "-I" options to the command line. - -\item[Corrupted compiled interface \var{filename}] -The compiler produces this error when it tries to read a compiled -interface file (".cmi" file) that has the wrong structure. This means -something went wrong when this ".cmi" file was written: the disk was -full, the compiler was interrupted in the middle of the file creation, -and so on. This error can also appear if a ".cmi" file is modified after -its creation by the compiler. Fix: remove the corrupted ".cmi" file, -and rebuild it. - -\item[This expression has type \nth{t}{1}, but is used with type \nth{t}{2}] -This is by far the most common type error in programs. Type \nth{t}{1} is -the type inferred for the expression (the part of the program that is -displayed in the error message), by looking at the expression itself. -Type \nth{t}{2} is the type expected by the context of the expression; it -is deduced by looking at how the value of this expression is used in -the rest of the program. If the two types \nth{t}{1} and \nth{t}{2} are not -compatible, then the error above is produced. - -In some cases, it is hard to understand why the two types \nth{t}{1} and -\nth{t}{2} are incompatible. For instance, the compiler can report that -``expression of type "foo" cannot be used with type "foo"'', and it -really seems that the two types "foo" are compatible. This is not -always true. Two type constructors can have the same name, but -actually represent different types. This can happen if a type -constructor is redefined. Example: -\begin{verbatim} - type foo = A | B - let f = function A -> 0 | B -> 1 - type foo = C | D - f C -\end{verbatim} -This result in the error message ``expression "C" of type "foo" cannot -be used with type "foo"''. - -\item[The type of this expression, \var{t}, contains type variables - that cannot be generalized] -Type variables ("'a", "'b", \ldots) in a type \var{t} can be in either -of two states: generalized (which means that the type \var{t} is valid -for all possible instantiations of the variables) and not generalized -(which means that the type \var{t} is valid only for one instantiation -of the variables). In a "let" binding "let "\var{name}" = "\var{expr}, -the type-checker normally generalizes as many type variables as -possible in the type of \var{expr}. However, this leads to unsoundness -(a well-typed program can crash) in conjunction with polymorphic -mutable data structures. To avoid this, generalization is performed at -"let" bindings only if the bound expression \var{expr} belongs to the -class of ``syntactic values'', which includes constants, identifiers, -functions, tuples of syntactic values, etc. In all other cases (for -instance, \var{expr} is a function application), a polymorphic mutable -could have been created and generalization is therefore turned off for -all variables occurring in contravariant or non-variant branches of the -type. For instance, if the type of a non-value is "'a list" the -variable is generalizable ("list" is a covariant type constructor), -but not in "'a list -> 'a list" (the left branch of "->" is -contravariant) or "'a ref" ("ref" is non-variant). - -Non-generalized type variables in a type cause no difficulties inside -a given structure or compilation unit (the contents of a ".ml" file, -or an interactive session), but they cannot be allowed inside -signatures nor in compiled interfaces (".cmi" file), because they -could be used inconsistently later. Therefore, the compiler -flags an error when a structure or compilation unit defines a value -\var{name} whose type contains non-generalized type variables. There -are two ways to fix this error: -\begin{itemize} -\item Add a type constraint or a ".mli" file to give a monomorphic -type (without type variables) to \var{name}. For instance, instead of -writing -\begin{verbatim} - let sort_int_list = List.sort Stdlib.compare - (* inferred type 'a list -> 'a list, with 'a not generalized *) -\end{verbatim} -write -\begin{verbatim} - let sort_int_list = (List.sort Stdlib.compare : int list -> int list);; -\end{verbatim} -\item If you really need \var{name} to have a polymorphic type, turn -its defining expression into a function by adding an extra parameter. -For instance, instead of writing -\begin{verbatim} - let map_length = List.map Array.length - (* inferred type 'a array list -> int list, with 'a not generalized *) -\end{verbatim} -write -\begin{verbatim} - let map_length lv = List.map Array.length lv -\end{verbatim} -\end{itemize} - -\item[Reference to undefined global \var{mod}] -This error appears when trying to link an incomplete or incorrectly -ordered set of files. Either you have forgotten to provide an -implementation for the compilation unit named \var{mod} on the command line -(typically, the file named \var{mod}".cmo", or a library containing -that file). Fix: add the missing ".ml" or ".cmo" file to the command -line. Or, you have provided an implementation for the module named -\var{mod}, but it comes too late on the command line: the -implementation of \var{mod} must come before all bytecode object files -that reference \var{mod}. Fix: change the order of ".ml" and ".cmo" -files on the command line. - -Of course, you will always encounter this error if you have mutually -recursive functions across modules. That is, function "Mod1.f" calls -function "Mod2.g", and function "Mod2.g" calls function "Mod1.f". -In this case, no matter what permutations you perform on the command -line, the program will be rejected at link-time. Fixes: -\begin{itemize} -\item Put "f" and "g" in the same module. -\item Parameterize one function by the other. -That is, instead of having -\begin{verbatim} -mod1.ml: let f x = ... Mod2.g ... -mod2.ml: let g y = ... Mod1.f ... -\end{verbatim} -define -\begin{verbatim} -mod1.ml: let f g x = ... g ... -mod2.ml: let rec g y = ... Mod1.f g ... -\end{verbatim} -and link "mod1.cmo" before "mod2.cmo". -\item Use a reference to hold one of the two functions, as in : -\begin{verbatim} -mod1.ml: let forward_g = - ref((fun x -> failwith "forward_g") : ) - let f x = ... !forward_g ... -mod2.ml: let g y = ... Mod1.f ... - let _ = Mod1.forward_g := g -\end{verbatim} -\end{itemize} - -\item[The external function \var{f} is not available] -This error appears when trying to link code that calls external -functions written in C. As explained in -chapter~\ref{c:intf-c}, such code must be linked with C libraries that -implement the required \var{f} C function. If the C libraries in -question are not shared libraries (DLLs), the code must be linked in -``custom runtime'' mode. Fix: add the required C libraries to the -command line, and possibly the "-custom" option. - -\end{options} - -\section{s:comp-warnings}{Warning reference} - -This section describes and explains in detail some warnings: - -\subsection{ss:warn9}{Warning 9: missing fields in a record pattern} - - When pattern matching on records, it can be useful to match only few - fields of a record. Eliding fields can be done either implicitly - or explicitly by ending the record pattern with "; _". - However, implicit field elision is at odd with pattern matching - exhaustiveness checks. - Enabling warning 9 prioritizes exhaustiveness checks over the - convenience of implicit field elision and will warn on implicit - field elision in record patterns. In particular, this warning can - help to spot exhaustive record pattern that may need to be updated - after the addition of new fields to a record type. - -\begin{verbatim} -type 'a point = {x : 'a; y : 'a} -let dx { x } = x (* implicit field elision: trigger warning 9 *) -let dy { y; _ } = y (* explicit field elision: do not trigger warning 9 *) -\end{verbatim} - -\subsection{ss:warn52}{Warning 52: fragile constant pattern} - - Some constructors, such as the exception constructors "Failure" and - "Invalid_argument", take as parameter a "string" value holding - a text message intended for the user. - - These text messages are usually not stable over time: call sites - building these constructors may refine the message in a future - version to make it more explicit, etc. Therefore, it is dangerous to - match over the precise value of the message. For example, until - OCaml 4.02, "Array.iter2" would raise the exception -\begin{verbatim} - Invalid_argument "arrays must have the same length" -\end{verbatim} - Since 4.03 it raises the more helpful message -\begin{verbatim} - Invalid_argument "Array.iter2: arrays must have the same length" -\end{verbatim} - but this means that any code of the form -\begin{verbatim} - try ... - with Invalid_argument "arrays must have the same length" -> ... -\end{verbatim} - is now broken and may suffer from uncaught exceptions. - - Warning 52 is there to prevent users from writing such fragile code - in the first place. It does not occur on every matching on a literal - string, but only in the case in which library authors expressed - their intent to possibly change the constructor parameter value in - the future, by using the attribute "ocaml.warn_on_literal_pattern" - (see the manual section on builtin attributes in - \ref{ss:builtin-attributes}): -\begin{verbatim} - type t = - | Foo of string [@ocaml.warn_on_literal_pattern] - | Bar of string - - let no_warning = function - | Bar "specific value" -> 0 - | _ -> 1 - - let warning = function - | Foo "specific value" -> 0 - | _ -> 1 - -> | Foo "specific value" -> 0 -> ^^^^^^^^^^^^^^^^ -> Warning 52: Code should not depend on the actual values of -> this constructor's arguments. They are only for information -> and may change in future versions. (See manual section 8.5) -\end{verbatim} - - In particular, all built-in exceptions with a string argument have - this attribute set: "Invalid_argument", "Failure", "Sys_error" will - all raise this warning if you match for a specific string argument. - - Additionally, built-in exceptions with a structured argument that - includes a string also have the attribute set: "Assert_failure" and - "Match_failure" will raise the warning for a pattern that uses a - literal string to match the first element of their tuple argument. - - If your code raises this warning, you should {\em not} change the - way you test for the specific string to avoid the warning (for - example using a string equality inside the right-hand-side instead - of a literal pattern), as your code would remain fragile. You should - instead enlarge the scope of the pattern by matching on all possible - values. - -\begin{verbatim} - -let warning = function - | Foo _ -> 0 - | _ -> 1 -\end{verbatim} - - This may require some care: if the scrutinee may return several - different cases of the same pattern, or raise distinct instances of - the same exception, you may need to modify your code to separate - those several cases. - - For example, -\begin{verbatim} -try (int_of_string count_str, bool_of_string choice_str) with - | Failure "int_of_string" -> (0, true) - | Failure "bool_of_string" -> (-1, false) -\end{verbatim} - should be rewritten into more atomic tests. For example, - using the "exception" patterns documented in Section~\ref{sss:exception-match}, - one can write: -\begin{verbatim} -match int_of_string count_str with - | exception (Failure _) -> (0, true) - | count -> - begin match bool_of_string choice_str with - | exception (Failure _) -> (-1, false) - | choice -> (count, choice) - end -\end{verbatim} - -The only case where that transformation is not possible is if a given -function call may raise distinct exceptions with the same constructor -but different string values. In this case, you will have to check for -specific string values. This is dangerous API design and it should be -discouraged: it's better to define more precise exception constructors -than store useful information in strings. - -\subsection{ss:warn57}{Warning 57: Ambiguous or-pattern variables under guard} - - The semantics of or-patterns in OCaml is specified with - a left-to-right bias: a value \var{v} matches the pattern \var{p} "|" \var{q} - if it matches \var{p} or \var{q}, but if it matches both, - the environment captured by the match is the environment captured by - \var{p}, never the one captured by \var{q}. - - While this property is generally intuitive, there is at least one specific - case where a different semantics might be expected. - Consider a pattern followed by a when-guard: - "|"~\var{p}~"when"~\var{g}~"->"~\var{e}, for example: -\begin{verbatim} - | ((Const x, _) | (_, Const x)) when is_neutral x -> branch -\end{verbatim} - The semantics is clear: - match the scrutinee against the pattern, if it matches, test the guard, - and if the guard passes, take the branch. - In particular, consider the input "(Const"~\var{a}", Const"~\var{b}")", where - \var{a} fails the test "is_neutral"~\var{a}, while \var{b} passes the test - "is_neutral"~\var{b}. With the left-to-right semantics, the clause above is - {\em not} taken by its input: matching "(Const"~\var{a}", Const"~\var{b}")" - against the or-pattern succeeds in the left branch, it returns the - environment \var{x}~"->"~\var{a}, and then the guard - "is_neutral"~\var{a} is tested and fails, the branch is not taken. - - However, another semantics may be considered more natural here: - any pair that has one side passing the test will take the branch. With this - semantics the previous code fragment would be equivalent to -\begin{verbatim} - | (Const x, _) when is_neutral x -> branch - | (_, Const x) when is_neutral x -> branch -\end{verbatim} - This is {\em not} the semantics adopted by OCaml. - - Warning 57 is dedicated to these confusing cases where the - specified left-to-right semantics is not equivalent to a non-deterministic - semantics (any branch can be taken) relatively to a specific guard. - More precisely, it warns when guard uses ``ambiguous'' variables, that are bound - to different parts of the scrutinees by different sides of a or-pattern. diff --git a/manual/manual/cmds/debugger.etex b/manual/manual/cmds/debugger.etex deleted file mode 100644 index e43d7f79..00000000 --- a/manual/manual/cmds/debugger.etex +++ /dev/null @@ -1,704 +0,0 @@ -\chapter{The debugger (ocamldebug)} \label{c:debugger} -%HEVEA\cutname{debugger.html} - -This chapter describes the OCaml source-level replay debugger -"ocamldebug". - -\begin{unix} The debugger is available on Unix systems that provide -BSD sockets. -\end{unix} - -\begin{windows} The debugger is available under the Cygwin port of -OCaml, but not under the native Win32 ports. -\end{windows} - -\section{s:debugger-compilation}{Compiling for debugging} - -Before the debugger can be used, the program must be compiled and -linked with the "-g" option: all ".cmo" and ".cma" files that are part -of the program should have been created with "ocamlc -g", and they -must be linked together with "ocamlc -g". - -Compiling with "-g" entails no penalty on the running time of -programs: object files and bytecode executable files are bigger and -take longer to produce, but the executable files run at -exactly the same speed as if they had been compiled without "-g". - -\section{s:debugger-invocation}{Invocation} - -\subsection{ss:debugger-start}{Starting the debugger} - -The OCaml debugger is invoked by running the program -"ocamldebug" with the name of the bytecode executable file as first -argument: -\begin{alltt} - ocamldebug \optvar{options} \var{program} \optvar{arguments} -\end{alltt} -The arguments following \var{program} are optional, and are passed as -command-line arguments to the program being debugged. (See also the -"set arguments" command.) - -The following command-line options are recognized: -\begin{options} -\item["-c " \var{count}] -Set the maximum number of simultaneously live checkpoints to \var{count}. - -\item["-cd " \var{dir}] -Run the debugger program from the working directory \var{dir}, -instead of the current directory. (See also the "cd" command.) - -\item["-emacs"] -Tell the debugger it is executed under Emacs. (See -section~\ref{s:inf-debugger} for information on how to run the -debugger under Emacs.) - -\item["-I "\var{directory}] -Add \var{directory} to the list of directories searched for source -files and compiled files. (See also the "directory" command.) - -\item["-s "\var{socket}] -Use \var{socket} for communicating with the debugged program. See the -description of the command "set socket" (section~\ref{ss:debugger-communication}) -for the format of \var{socket}. - -\item["-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-help" or "--help"] -Display a short usage summary and exit. -% -\end{options} - -\subsection{ss:debugger-init-file}{Initialization file} - -On start-up, the debugger will read commands from an initialization -file before giving control to the user. The default file is -".ocamldebug" in the current directory if it exists, otherwise -".ocamldebug" in the user's home directory. - -\subsection{ss:debugger-exut}{Exiting the debugger} - -The command "quit" exits the debugger. You can also exit the debugger -by typing an end-of-file character (usually "ctrl-D"). - -Typing an interrupt character (usually "ctrl-C") will not exit the -debugger, but will terminate the action of any debugger command that is in -progress and return to the debugger command level. - -\section{s:debugger-commands}{Commands} - -A debugger command is a single line of input. It starts with a command -name, which is followed by arguments depending on this name. Examples: -\begin{verbatim} - run - goto 1000 - set arguments arg1 arg2 -\end{verbatim} - -A command name can be truncated as long as there is no ambiguity. For -instance, "go 1000" is understood as "goto 1000", since there are no -other commands whose name starts with "go". For the most frequently -used commands, ambiguous abbreviations are allowed. For instance, "r" -stands for "run" even though there are others commands starting with -"r". You can test the validity of an abbreviation using the "help" command. - -If the previous command has been successful, a blank line (typing just -"RET") will repeat it. - -\subsection{ss:debugger-help}{Getting help} - -The OCaml debugger has a simple on-line help system, which gives -a brief description of each command and variable. - -\begin{options} -\item["help"] -Print the list of commands. - -\item["help "\var{command}] -Give help about the command \var{command}. - -\item["help set "\var{variable}, "help show "\var{variable}] -Give help about the variable \var{variable}. The list of all debugger -variables can be obtained with "help set". - -\item["help info "\var{topic}] -Give help about \var{topic}. Use "help info" to get a list of known topics. -\end{options} - -\subsection{ss:debugger-state}{Accessing the debugger state} - -\begin{options} -\item["set "\var{variable} \var{value}] -Set the debugger variable \var{variable} to the value \var{value}. - -\item["show "\var{variable}] -Print the value of the debugger variable \var{variable}. - -\item["info "\var{subject}] -Give information about the given subject. -For instance, "info breakpoints" will print the list of all breakpoints. -\end{options} - -\section{s:debugger-execution}{Executing a program} - -\subsection{ss:debugger-events}{Events} - -Events are ``interesting'' locations in the source code, corresponding -to the beginning or end of evaluation of ``interesting'' -sub-expressions. Events are the unit of single-stepping (stepping goes -to the next or previous event encountered in the program execution). -Also, breakpoints can only be set at events. Thus, events play the -role of line numbers in debuggers for conventional languages. - -During program execution, a counter is incremented at each event -encountered. The value of this counter is referred as the {\em current -time}. Thanks to reverse execution, it is possible to jump back and -forth to any time of the execution. - -Here is where the debugger events (written \event) are located in -the source code: -\begin{itemize} -\item Following a function application: -\begin{alltt} -(f arg)\event -\end{alltt} -\item On entrance to a function: -\begin{alltt} -fun x y z -> \event ... -\end{alltt} -\item On each case of a pattern-matching definition (function, -"match"\ldots"with" construct, "try"\ldots"with" construct): -\begin{alltt} -function pat1 -> \event expr1 - | ... - | patN -> \event exprN -\end{alltt} -\item Between subexpressions of a sequence: -\begin{alltt} -expr1; \event expr2; \event ...; \event exprN -\end{alltt} -\item In the two branches of a conditional expression: -\begin{alltt} -if cond then \event expr1 else \event expr2 -\end{alltt} -\item At the beginning of each iteration of a loop: -\begin{alltt} -while cond do \event body done -for i = a to b do \event body done -\end{alltt} -\end{itemize} -Exceptions: A function application followed by a function return is replaced -by the compiler by a jump (tail-call optimization). In this case, no -event is put after the function application. -% Also, no event is put after a function application when the function -% is external (written in C). - -\subsection{ss:debugger-starting-program}{Starting the debugged program} - -The debugger starts executing the debugged program only when needed. -This allows setting breakpoints or assigning debugger variables before -execution starts. There are several ways to start execution: -\begin{options} -\item["run"] Run the program until a breakpoint is hit, or the program -terminates. -\item["goto 0"] Load the program and stop on the first event. -\item["goto "\var{time}] Load the program and execute it until the -given time. Useful when you already know approximately at what time -the problem appears. Also useful to set breakpoints on function values -that have not been computed at time 0 (see section~\ref{s:breakpoints}). -\end{options} - -The execution of a program is affected by certain information it -receives when the debugger starts it, such as the command-line -arguments to the program and its working directory. The debugger -provides commands to specify this information ("set arguments" and "cd"). -These commands must be used before program execution starts. If you try -to change the arguments or the working directory after starting your -program, the debugger will kill the program (after asking for confirmation). - -\subsection{ss:debugger-running}{Running the program} - -The following commands execute the program forward or backward, -starting at the current time. The execution will stop either when -specified by the command or when a breakpoint is encountered. - -\begin{options} -\item["run"] Execute the program forward from current time. Stops at -next breakpoint or when the program terminates. -\item["reverse"] Execute the program backward from current time. -Mostly useful to go to the last breakpoint encountered before the -current time. -\item["step "\optvar{count}] Run the program and stop at the next -event. With an argument, do it \var{count} times. If \var{count} is 0, -run until the program terminates or a breakpoint is hit. -\item["backstep "\optvar{count}] Run the program backward and stop at -the previous event. With an argument, do it \var{count} times. -\item["next "\optvar{count}] Run the program and stop at the next -event, skipping over function calls. With an argument, do it -\var{count} times. -\item["previous "\optvar{count}] Run the program backward and stop at -the previous event, skipping over function calls. With an argument, do -it \var{count} times. -\item["finish"] Run the program until the current function returns. -\item["start"] Run the program backward and stop at the first event -before the current function invocation. -\end{options} - -\subsection{ss:debugger-time-travel}{Time travel} - -You can jump directly to a given time, without stopping on -breakpoints, using the "goto" command. - -As you move through the program, the debugger maintains an history of -the successive times you stop at. The "last" command can be used to -revisit these times: each "last" command moves one step back through -the history. That is useful mainly to undo commands such as "step" -and "next". - -\begin{options} -\item["goto "\var{time}] -Jump to the given time. -\item["last "\optvar{count}] -Go back to the latest time recorded in the execution history. With an -argument, do it \var{count} times. -\item["set history "\var{size}] -Set the size of the execution history. -\end{options} - -\subsection{ss:debugger-kill}{Killing the program} - -\begin{options} -\item["kill"] Kill the program being executed. This command is mainly -useful if you wish to recompile the program without leaving the debugger. -\end{options} - -\section{s:breakpoints}{Breakpoints} - -A breakpoint causes the program to stop whenever a certain point in -the program is reached. It can be set in several ways using the -"break" command. Breakpoints are assigned numbers when set, for -further reference. The most comfortable way to set breakpoints is -through the Emacs interface (see section~\ref{s:inf-debugger}). - -\begin{options} -\item["break"] -Set a breakpoint at the current position in the program execution. The -current position must be on an event (i.e., neither at the beginning, -nor at the end of the program). - -\item["break "\var{function}] -Set a breakpoint at the beginning of \var{function}. This works only -when the functional value of the identifier \var{function} has been -computed and assigned to the identifier. Hence this command cannot be -used at the very beginning of the program execution, when all -identifiers are still undefined; use "goto" \var{time} to advance -execution until the functional value is available. - -\item["break \@" \optvar{module} \var{line}] -Set a breakpoint in module \var{module} (or in the current module if -\var{module} is not given), at the first event of line \var{line}. - -\item["break \@" \optvar{module} \var{line} \var{column}] -Set a breakpoint in module \var{module} (or in the current module if -\var{module} is not given), at the event closest to line \var{line}, -column \var{column}. - -\item["break \@" \optvar{module} "#" \var{character}] -Set a breakpoint in module \var{module} at the event closest to -character number \var{character}. - -\item["break " \var{frag}":"\var{pc}, "break " \var{pc}] -Set a breakpoint at code address \var{frag}":"\var{pc}. The integer -\var{frag} is the identifier of a code fragment, a set of modules that -have been loaded at once, either initially or with the "Dynlink" -module. The integer \var{pc} is the instruction counter within this -code fragment. If \var{frag} is omitted, it defaults to 0, which is -the code fragment of the program loaded initially. - -\item["delete "\optvar{breakpoint-numbers}] -Delete the specified breakpoints. Without argument, all breakpoints -are deleted (after asking for confirmation). - -\item["info breakpoints"] Print the list of all breakpoints. -\end{options} - -\section{s:debugger-callstack}{The call stack} - -Each time the program performs a function application, it saves the -location of the application (the return address) in a block of data -called a stack frame. The frame also contains the local variables of -the caller function. All the frames are allocated in a region of -memory called the call stack. The command "backtrace" (or "bt") -displays parts of the call stack. - -At any time, one of the stack frames is ``selected'' by the debugger; several -debugger commands refer implicitly to the selected frame. In particular, -whenever you ask the debugger for the value of a local variable, the -value is found in the selected frame. The commands "frame", "up" and "down" -select whichever frame you are interested in. - -When the program stops, the debugger automatically selects the -currently executing frame and describes it briefly as the "frame" -command does. - -\begin{options} -\item["frame"] -Describe the currently selected stack frame. - -\item["frame" \var{frame-number}] -Select a stack frame by number and describe it. The frame currently -executing when the program stopped has number 0; its caller has number -1; and so on up the call stack. - -\item["backtrace "\optvar{count}, "bt "\optvar{count}] -Print the call stack. This is useful to see which sequence of function -calls led to the currently executing frame. With a positive argument, -print only the innermost \var{count} frames. -With a negative argument, print only the outermost -\var{count} frames. - -\item["up" \optvar{count}] -Select and display the stack frame just ``above'' the selected frame, -that is, the frame that called the selected frame. An argument says how -many frames to go up. - -\item["down "\optvar{count}] -Select and display the stack frame just ``below'' the selected frame, -that is, the frame that was called by the selected frame. An argument -says how many frames to go down. -\end{options} - -\section{s:debugger-examining-values}{Examining variable values} - -The debugger can print the current value of simple expressions. The -expressions can involve program variables: all the identifiers that -are in scope at the selected program point can be accessed. - -Expressions that can be printed are a subset of OCaml -expressions, as described by the following grammar: -\begin{syntax} -simple-expr: - lowercase-ident - | { capitalized-ident '.' } lowercase-ident - | '*' - | '$' integer - | simple-expr '.' lowercase-ident - | simple-expr '.(' integer ')' - | simple-expr '.[' integer ']' - | '!' simple-expr - | '(' simple-expr ')' -\end{syntax} -The first two cases refer to a value identifier, either unqualified or -qualified by the path to the structure that define it. -"*" refers to the result just computed (typically, the value of a -function application), and is valid only if the selected event is an -``after'' event (typically, a function application). -@'$' integer@ refer to a previously printed value. The remaining four -forms select part of an expression: respectively, a record field, an -array element, a string element, and the current contents of a -reference. - -\begin{options} -\item["print "\var{variables}] -Print the values of the given variables. "print" can be abbreviated as -"p". -\item["display "\var{variables}] -Same as "print", but limit the depth of printing to 1. Useful to -browse large data structures without printing them in full. -"display" can be abbreviated as "d". -\end{options} - -When printing a complex expression, a name of the form "$"\var{integer} -is automatically assigned to its value. Such names are also assigned -to parts of the value that cannot be printed because the maximal -printing depth is exceeded. Named values can be printed later on -with the commands "p $"\var{integer} or "d $"\var{integer}. -Named values are valid only as long as the program is stopped. They -are forgotten as soon as the program resumes execution. - -\begin{options} -\item["set print_depth" \var{d}] -Limit the printing of values to a maximal depth of \var{d}. -\item["set print_length" \var{l}] -Limit the printing of values to at most \var{l} nodes printed. -\end{options} - -\section{s:debugger-control}{Controlling the debugger} - -\subsection{ss:debugger-name-and-arguments}{Setting the program name and arguments} - -\begin{options} -\item["set program" \var{file}] -Set the program name to \var{file}. -\item["set arguments" \var{arguments}] -Give \var{arguments} as command-line arguments for the program. -\end{options} - -A shell is used to pass the arguments to the debugged program. You can -therefore use wildcards, shell variables, and file redirections inside -the arguments. To debug programs that read from standard input, it is -recommended to redirect their input from a file (using -"set arguments < input-file"), otherwise input to the program and -input to the debugger are not properly separated, and inputs are not -properly replayed when running the program backwards. - -\subsection{ss:debugger-loading}{How programs are loaded} - -The "loadingmode" variable controls how the program is executed. - -\begin{options} -\item["set loadingmode direct"] -The program is run directly by the debugger. This is the default mode. -\item["set loadingmode runtime"] -The debugger execute the OCaml runtime "ocamlrun" on the program. -Rarely useful; moreover it prevents the debugging of programs compiled -in ``custom runtime'' mode. -\item["set loadingmode manual"] -The user starts manually the program, when asked by the debugger. -Allows remote debugging (see section~\ref{ss:debugger-communication}). -\end{options} - -\subsection{ss:debugger-search-path}{Search path for files} - -The debugger searches for source files and compiled interface files in -a list of directories, the search path. The search path initially -contains the current directory "." and the standard library directory. -The "directory" command adds directories to the path. - -Whenever the search path is modified, the debugger will clear any -information it may have cached about the files. - -\begin{options} -\item["directory" \var{directorynames}] -Add the given directories to the search path. These directories are -added at the front, and will therefore be searched first. - -\item["directory" \var{directorynames} "for" \var{modulename}] -Same as "directory" \var{directorynames}, but the given directories will be -searched only when looking for the source file of a module that has -been packed into \var{modulename}. - -\item["directory"] -Reset the search path. This requires confirmation. -\end{options} - -\subsection{ss:debugger-working-dir}{Working directory} - -Each time a program is started in the debugger, it inherits its working -directory from the current working directory of the debugger. This -working directory is initially whatever it inherited from its parent -process (typically the shell), but you can specify a new working -directory in the debugger with the "cd" command or the "-cd" -command-line option. - -\begin{options} -\item["cd" \var{directory}] -Set the working directory for "ocamldebug" to \var{directory}. - -\item["pwd"] -Print the working directory for "ocamldebug". -\end{options} - -\subsection{ss:debugger-reverse-execution}{Turning reverse execution on and off} - -In some cases, you may want to turn reverse execution off. This speeds -up the program execution, and is also sometimes useful for interactive -programs. - -Normally, the debugger takes checkpoints of the program state from -time to time. That is, it makes a copy of the current state of the -program (using the Unix system call "fork"). If the variable -\var{checkpoints} is set to "off", the debugger will not take any -checkpoints. - -\begin{options} -\item["set checkpoints" \var{on/off}] -Select whether the debugger makes checkpoints or not. -\end{options} - -\subsection{ss:debugger-fork}{Behavior of the debugger with respect to "fork"} - -When the program issues a call to "fork", the debugger can either -follow the child or the parent. By default, the debugger follows the -parent process. The variable \var{follow_fork_mode} controls this -behavior: - -\begin{options} -\item["set follow_fork_mode" \var{child/parent}] -Select whether to follow the child or the parent in case of a call to -"fork". -\end{options} - -\subsection{ss:debugger-stop-at-new-load}{Stopping execution when new code is loaded} - -The debugger is compatible with the "Dynlink" module. However, when an -external module is not yet loaded, it is impossible to set a -breakpoint in its code. In order to facilitate setting breakpoints in -dynamically loaded code, the debugger stops the program each time new -modules are loaded. This behavior can be disabled using the -\var{break_on_load} variable: - -\begin{options} -\item["set break_on_load" \var{on/off}] -Select whether to stop after loading new code. -\end{options} - -\subsection{ss:debugger-communication}{Communication between the debugger and the program} - -The debugger communicate with the program being debugged through a -Unix socket. You may need to change the socket name, for example if -you need to run the debugger on a machine and your program on another. - -\begin{options} -\item["set socket" \var{socket}] -Use \var{socket} for communication with the program. \var{socket} can be -either a file name, or an Internet port specification -\var{host}:\var{port}, where \var{host} is a host name or an Internet -address in dot notation, and \var{port} is a port number on the host. -\end{options} - -On the debugged program side, the socket name is passed through the -"CAML_DEBUG_SOCKET" environment variable. - -\subsection{ss:debugger-fine-tuning}{Fine-tuning the debugger} - -Several variables enables to fine-tune the debugger. Reasonable -defaults are provided, and you should normally not have to change them. - -\begin{options} -\item["set processcount" \var{count}] -Set the maximum number of checkpoints to \var{count}. More checkpoints -facilitate going far back in time, but use more memory and create more -Unix processes. -\end{options} - -As checkpointing is quite expensive, it must not be done too often. On -the other hand, backward execution is faster when checkpoints are -taken more often. In particular, backward single-stepping is more -responsive when many checkpoints have been taken just before the -current time. To fine-tune the checkpointing strategy, the debugger -does not take checkpoints at the same frequency for long displacements -(e.g. "run") and small ones (e.g. "step"). The two variables "bigstep" -and "smallstep" contain the number of events between two checkpoints -in each case. - -\begin{options} -\item["set bigstep" \var{count}] -Set the number of events between two checkpoints for long displacements. -\item["set smallstep" \var{count}] -Set the number of events between two checkpoints for small -displacements. -\end{options} - -The following commands display information on checkpoints and events: - -\begin{options} -\item["info checkpoints"] -Print a list of checkpoints. -\item["info events" \optvar{module}] -Print the list of events in the given module (the current module, by default). -\end{options} - -\subsection{ss:debugger-printers}{User-defined printers} - -Just as in the toplevel system (section~\ref{s:toplevel-directives}), -the user can register functions for printing values of certain types. -For technical reasons, the debugger cannot call printing functions -that reside in the program being debugged. The code for the printing -functions must therefore be loaded explicitly in the debugger. - -\begin{options} -\item["load_printer \""\var{file-name}"\""] -Load in the debugger the indicated ".cmo" or ".cma" object file. The -file is loaded in an environment consisting only of the OCaml -standard library plus the definitions provided by object files -previously loaded using "load_printer". If this file depends on other -object files not yet loaded, the debugger automatically loads them if -it is able to find them in the search path. The loaded file does not -have direct access to the modules of the program being debugged. - -\item["install_printer "\var{printer-name}] -Register the function named \var{printer-name} (a -value path) as a printer for objects whose types match the argument -type of the function. That is, the debugger will call -\var{printer-name} when it has such an object to print. -The printing function \var{printer-name} must use the "Format" library -module to produce its output, otherwise its output will not be -correctly located in the values printed by the toplevel loop. - -The value path \var{printer-name} must refer to one of the functions -defined by the object files loaded using "load_printer". It cannot -reference the functions of the program being debugged. - -\item["remove_printer "\var{printer-name}] -Remove the named function from the table of value printers. -\end{options} - -\section{s:debugger-misc-cmds}{Miscellaneous commands} - -\begin{options} -\item["list" \optvar{module} \optvar{beginning} \optvar{end}] -List the source of module \var{module}, from line number -\var{beginning} to line number \var{end}. By default, 20 lines of the -current module are displayed, starting 10 lines before the current -position. -\item["source" \var{filename}] -Read debugger commands from the script \var{filename}. -\end{options} - -\section{s:inf-debugger}{Running the debugger under Emacs} - -The most user-friendly way to use the debugger is to run it under Emacs with -the OCaml mode available through MELPA and also at -\url{https://github.com/ocaml/caml-mode}. - -The OCaml debugger is started under Emacs by the command "M-x -camldebug", with argument the name of the executable file -\var{progname} to debug. Communication with the debugger takes place -in an Emacs buffer named "*camldebug-"\var{progname}"*". The editing -and history facilities of Shell mode are available for interacting -with the debugger. - -In addition, Emacs displays the source files containing the current -event (the current position in the program execution) and highlights -the location of the event. This display is updated synchronously with -the debugger action. - -The following bindings for the most common debugger commands are -available in the "*camldebug-"\var{progname}"*" buffer: - -\begin{options} -\item["C-c C-s"] (command "step"): execute the program one step forward. -\item["C-c C-k"] (command "backstep"): execute the program one step backward. -\item["C-c C-n"] (command "next"): execute the program one step -forward, skipping over function calls. -\item[Middle mouse button] (command "display"): display named value. -"$"\var{n} under mouse cursor (support incremental browsing of large -data structures). -\item["C-c C-p"] (command "print"): print value of identifier at point. -\item["C-c C-d"] (command "display"): display value of identifier at point. -\item["C-c C-r"] (command "run"): execute the program forward to next -breakpoint. -\item["C-c C-v"] (command "reverse"): execute the program backward to -latest breakpoint. -\item["C-c C-l"] (command "last"): go back one step in the command history. -\item["C-c C-t"] (command "backtrace"): display backtrace of function calls. -\item["C-c C-f"] (command "finish"): run forward till the current -function returns. -\item["C-c <"] (command "up"): select the stack frame below the -current frame. -\item["C-c >"] (command "down"): select the stack frame above the -current frame. -\end{options} - -In all buffers in OCaml editing mode, the following debugger commands -are also available: - -\begin{options} -\item["C-x C-a C-b"] (command "break"): set a breakpoint at event closest -to point -\item["C-x C-a C-p"] (command "print"): print value of identifier at point -\item["C-x C-a C-d"] (command "display"): display value of identifier at point -\end{options} diff --git a/manual/manual/cmds/flambda.etex b/manual/manual/cmds/flambda.etex deleted file mode 100644 index c5b2ac4a..00000000 --- a/manual/manual/cmds/flambda.etex +++ /dev/null @@ -1,1344 +0,0 @@ -\chapter{Optimisation with Flambda} -%HEVEA\cutname{flambda.html} - -\section{s:flambda-overview}{Overview} - -{\em Flambda} is the term used to describe a series of optimisation passes -provided by the native code compilers as of OCaml 4.03. - -Flambda aims to make it easier to write idiomatic OCaml code without -incurring performance penalties. - -To use the Flambda optimisers it is necessary to pass the {\tt -flambda} -option to the OCaml {\tt configure} script. (There is no support for a -single compiler that can operate in both Flambda and non-Flambda modes.) -Code compiled with Flambda -cannot be linked into the same program as code compiled without Flambda. -Attempting to do this will result in a compiler error. - -Whether or not a particular {\tt ocamlopt} uses Flambda may be -determined by invoking it with the {\tt -config} option and looking -for any line starting with ``{\tt flambda:}''. If such a line is present -and says ``{\tt true}'', then Flambda is supported, otherwise it is not. - -Flambda provides full optimisation across different compilation units, -so long as the {\tt .cmx} files for the dependencies of the unit currently -being compiled are available. (A compilation unit corresponds to a -single {\tt .ml} source file.) However it does not yet act entirely as -a whole-program compiler: for example, elimination of dead code across -a complete set of compilation units is not supported. - -Optimisation with Flambda is not currently supported when generating -bytecode. - -Flambda should not in general affect the semantics of existing programs. -Two exceptions to this rule are: possible elimination of pure code -that is being benchmarked (see section\ \ref{s:flambda-inhibition}) and changes in -behaviour of code using unsafe operations (see section\ \ref{s:flambda-unsafe}). - -Flambda does not yet optimise array or string bounds checks. Neither -does it take hints for optimisation from any assertions written by the -user in the code. - -Consult the {\em Glossary} at the end of this chapter for definitions of -technical terms used below. - -\section{s:flambda-cli}{Command-line flags} - -The Flambda optimisers provide a variety of command-line flags that may -be used to control their behaviour. Detailed descriptions of each flag -are given in the referenced sections. Those sections also describe any -arguments which the particular flags take. - -Commonly-used options: -\begin{options} -\item[\machine{-O2}] Perform more optimisation than usual. Compilation -times may be lengthened. (This flag is an abbreviation for a certain -set of parameters described in section\ \ref{s:flambda-defaults}.) -\item[\machine{-O3}] Perform even more optimisation than usual, possibly -including unrolling of recursive functions. Compilation times may be -significantly lengthened. -\item[\machine{-Oclassic}] Make inlining decisions at the point of -definition of a function rather than at the call site(s). This mirrors -the behaviour of OCaml compilers not using Flambda. Compared to compilation -using the new Flambda inlining heuristics (for example at {\tt -O2}) it -produces -smaller {\tt .cmx} files, shorter compilation times and code that probably -runs rather slower. When using {\tt -Oclassic}, only the following options -described in this section are relevant: {\tt -inlining-report} and -{\tt -inline}. If any other of the options described in this section are -used, the behaviour is undefined and may cause an error in future versions -of the compiler. -\item[\machine{-inlining-report}] Emit {\tt .inlining} files (one per -round of optimisation) showing all of the inliner's decisions. -\end{options} - -Less commonly-used options: -\begin{options} -\item[\machine{-remove-unused-arguments}] Remove unused function arguments -even when the argument is not specialised. This may have a small -performance penalty. -See section\ \ref{ss:flambda-remove-unused-args}. -\item[\machine{-unbox-closures}] Pass free variables via specialised arguments -rather than closures (an optimisation for reducing allocation). See -section\ \ref{ss:flambda-unbox-closures}. This may have a small performance penalty. -\end{options} - -Advanced options, only needed for detailed tuning: -\begin{options} -\item[\machine{-inline}] The behaviour depends on whether {\tt -Oclassic} -is used. -\begin{itemize} -\item When not in {\tt -Oclassic} mode, {\tt -inline} limits the total -size of functions considered for inlining during any speculative inlining -search. (See section\ \ref{ss:flambda-speculation}.) Note that -this parameter does -{\bf not} control the assessment as to whether any particular function may -be inlined. Raising it to excessive amounts will not necessarily cause -more functions to be inlined. -\item When in {\tt -Oclassic} mode, {\tt -inline} behaves as in -previous versions of the compiler: it is the maximum size of function to -be considered for inlining. See section\ \ref{ss:flambda-classic}. -\end{itemize} -\item[\machine{-inline-toplevel}] The equivalent of {\tt -inline} but used -when speculative inlining starts at toplevel. See -section\ \ref{ss:flambda-speculation}. -Not used in {\tt -Oclassic} mode. -\item[\machine{-inline-branch-factor}] Controls how the inliner assesses -whether a code path is likely to be hot or cold. See -section\ \ref{ss:flambda-assessment-inlining}. -\item[\machine{-inline-alloc-cost}, - \machine{-inline-branch-cost}, - \machine{-inline-call-cost}] Controls how the inliner assesses the runtime - performance penalties associated with various operations. See - section\ \ref{ss:flambda-assessment-inlining}. -\item[\machine{-inline-indirect-cost}, - \machine{-inline-prim-cost}] Likewise. -\item[\machine{-inline-lifting-benefit}] Controls inlining of functors -at toplevel. See section\ \ref{ss:flambda-assessment-inlining}. -\item[\machine{-inline-max-depth}] The maximum depth of any -speculative inlining search. See section\ \ref{ss:flambda-speculation}. -\item[\machine{-inline-max-unroll}] The maximum depth of any unrolling of -recursive functions during any speculative inlining search. -See section\ \ref{ss:flambda-speculation}. -\item[\machine{-no-unbox-free-vars-of-closures}] % -Do not unbox closure variables. See section\ \ref{ss:flambda-unbox-fvs}. -\item[\machine{-no-unbox-specialised-args}] % -Do not unbox arguments to which functions have been specialised. See -section\ \ref{ss:flambda-unbox-spec-args}. -\item[\machine{-rounds}] How many rounds of optimisation to perform. -See section\ \ref{ss:flambda-rounds}. -\item[\machine{-unbox-closures-factor}] Scaling factor for benefit -calculation when using {\tt -unbox-closures}. See -section\ \ref{ss:flambda-unbox-closures}. -\end{options} - -\paragraph{Notes} -\begin{itemize} -\item The set of command line flags relating to optimisation should typically -be specified to be the same across an entire project. Flambda does not -currently record the requested flags in the {\tt .cmx} files. As such, -inlining of functions from previously-compiled units will subject their code -to the optimisation parameters of the unit currently being compiled, rather -than those specified when they were previously compiled. It is hoped to -rectify this deficiency in the future. - -\item Flambda-specific flags do not affect linking with the exception of -affecting the optimisation of code in the startup file (containing -generated functions such as currying helpers). Typically such optimisation -will not be significant, so eliding such flags at link time might be -reasonable. - -\item Flambda-specific flags are silently accepted even when the -{\tt -flambda} option was not provided to the {\tt configure} script. -(There is no means provided to change this behaviour.) -This is intended to make it more -straightforward to run benchmarks with and without the Flambda optimisers -in effect. -\item Some of the Flambda flags may be subject to change in future -releases. -\end{itemize} - -\subsection{ss:flambda-rounds}{Specification of optimisation parameters by round} - -Flambda operates in {\em rounds}: one round consists of a certain sequence -of transformations that may then be repeated in order to achieve more -satisfactory results. The number of rounds can be set manually using the -{\tt -rounds} parameter (although this is not necessary when using -predefined optimisation levels such as with {\tt -O2} and {\tt -O3}). -For high optimisation the number of rounds might be set at 3 or 4. - -Command-line flags that may apply per round, for example those with -{\tt "-cost"} in the name, accept arguments of the form: -\begin{center} -{\em n}{\tt\ |\ }{\em round}{\tt =}{\em n}[{\tt,}...] -\end{center} -\begin{itemize} -\item If the first form is used, with a single integer specified, -the value will apply to all rounds. -\item If the second form is used, zero-based {\em round} integers specify -values which are to be used only for those rounds. -\end{itemize} - -The flags {\tt -Oclassic}, {\tt -O2} and {\tt -O3} are applied before all -other flags, meaning that certain parameters may be overridden without -having to specify every parameter usually invoked by the given optimisation -level. - -\section{s:flambda-inlining}{Inlining} - -{\em Inlining} refers to the copying of the code of a function to a -place where the function is called. -The code of the function will be surrounded by bindings of its parameters -to the corresponding arguments. - -The aims of inlining are: -\begin{itemize} -\item to reduce the runtime overhead caused by function calls (including -setting up for such calls and returning afterwards); -\item to reduce instruction cache misses by expressing frequently-taken -paths through the program using fewer machine instructions; and -\item to reduce the amount of allocation (especially of closures). -\end{itemize} -These goals are often reached not just by inlining itself but also by -other optimisations that the compiler is able to perform as a result of -inlining. - -When a recursive call to a function (within the definition of that function -or another in the same mutually-recursive group) is inlined, the procedure is -also known as {\em unrolling}. This is somewhat akin to loop peeling. -For example, given the following code: -\begin{verbatim} -let rec fact x = - if x = 0 then - 1 - else - x * fact (x - 1) - -let n = fact 4 -\end{verbatim} -unrolling once at the call site {\tt fact 4} produces (with the body of -{\tt fact} unchanged): -\begin{verbatim} -let n = - if 4 = 0 then - 1 - else - 4 * fact (4 - 1) -\end{verbatim} -This simplifies to: -\begin{verbatim} -let n = 4 * fact 3 -\end{verbatim} - -%% CR pchambart: A specific section for unrolling might be worth (telling -%% when this is beneficial) - -Flambda provides significantly enhanced inlining capabilities relative to -previous versions of the compiler. - -\subsubsection{sss:flambda-inlining-aside}{Aside: when inlining is performed} - -Inlining is performed together with all of the other Flambda optimisation -passes, that is to say, after closure conversion. This has three particular -advantages over a potentially more straightforward implementation prior to -closure conversion: -\begin{itemize} -\item It permits higher-order inlining, for example when a non-inlinable -function always returns the same function yet with different environments -of definition. Not all such cases are supported yet, but it is intended -that such support will be improved in future. -\item It is easier to integrate with cross-module optimisation, since -imported information about other modules is already in the correct -intermediate language. -\item It becomes more straightforward to optimise closure allocations since -the layout of closures does not have to be estimated in any way: it is -known. Similarly, -it becomes more straightforward to control which variables end up -in which closures, helping to avoid closure bloat. -\end{itemize} - -\subsection{ss:flambda-classic}{Classic inlining heuristic} - -In {\tt -Oclassic} mode the behaviour of the Flambda inliner -mimics previous versions -of the compiler. (Code may still be subject to further optimisations not -performed by previous versions of the compiler: functors may be inlined, -constants are lifted and unused code is eliminated all as described elsewhere -in this chapter. See sections \ref{sss:flambda-functors},\ \ref{ss:flambda-lift-const} % -and\ \ref{s:flambda-remove-unused}. -At the definition site of a function, the body of the -function is measured. It will then be marked as eligible for inlining -(and hence inlined at every direct call site) if: -\begin{itemize} -\item the measured size (in unspecified units) is smaller than that of a -function call plus the argument of the {\tt -inline} command-line flag; and -\item the function is not recursive. -\end{itemize} - -Non-Flambda versions of the compiler cannot inline functions that -contain a definition of another function. However {\tt -Oclassic} does -permit this. Further, non-Flambda versions also cannot inline functions -that are only themselves exposed as a result of a previous pass of inlining, -but again this is permitted by {\tt -Oclassic}. -For example: -\begin{verbatim} -module M : sig - val i : int -end = struct - let f x = - let g y = x + y in - g - let h = f 3 - let i = h 4 (* h is correctly discovered to be g and inlined *) -end -\end{verbatim} - -All of this contrasts with the normal Flambda mode, that is to say -without {\tt -Oclassic}, where: -\begin{itemize} -\item the inlining decision is made at the {\bf call site}; and -\item recursive functions can be handled, by {\em specialisation} (see -below). -\end{itemize} -The Flambda mode is described in the next section. - -\subsection{ss:flambda-inlining-overview}{Overview of ``Flambda'' inlining heuristics} - -The Flambda inlining heuristics, used whenever the compiler is configured -for Flambda and {\tt -Oclassic} was not specified, make inlining decisions -at call sites. This helps in situations where the context is important. -For example: -\begin{verbatim} -let f b x = - if b then - x - else - ... big expression ... - -let g x = f true x -\end{verbatim} -In this case, we would like to inline {\tt f} into {\tt g}, because a -conditional jump can be eliminated and the code size should reduce. If the -inlining decision has been made after the declaration of {\tt f} without -seeing the use, its size would have probably made it ineligible for -inlining; but at the call site, its final size can be known. Further, -this function should probably not be inlined systematically: if {\tt b} -is unknown, or indeed {\tt false}, there is little benefit to trade off -against a large increase in code size. In the existing non-Flambda inliner -this isn't a great problem because chains of inlining were cut off fairly -quickly. However it has led to excessive use of overly-large inlining -parameters such as {\tt -inline 10000}. - -In more detail, at each call site the following procedure is followed: -\begin{itemize} -\item Determine whether it is clear that inlining would be beneficial -without, for the moment, doing any inlining within the function itself. -(The exact assessment of {\em benefit} is described below.) If so, the -function is inlined. -\item If inlining the function is not clearly beneficial, then inlining -will be performed {\em speculatively} inside the function itself. The -search for speculative inlining possibilities is controlled by two -parameters: the {\em inlining threshold} and the {\em inlining depth}. -(These are described in more detail below.) -\begin{itemize} -\item If such speculation shows that performing some inlining inside the -function would be beneficial, then such inlining is performed and the -resulting function inlined at the original call site. -\item Otherwise, nothing happens. -\end{itemize} -\end{itemize} -Inlining within recursive functions of calls to other -functions in the same mutually-recursive group is kept in check by -an {\em unrolling depth}, described below. This ensures that functions are -not unrolled to excess. (Unrolling is only enabled -if {\tt -O3} optimisation level is selected and/or the -{\tt -inline-max-unroll} -flag is passed with an argument greater than zero.) - -\subsection{ss:flambda-by-constructs}{Handling of specific language constructs} - -\subsubsection{sss:flambda-functors}{Functors} - -There is nothing particular about functors that inhibits inlining compared -to normal functions. To the inliner, these both look the same, except -that functors are marked as such. - -Applications of functors at toplevel are biased in favour of inlining. -(This bias may be adjusted: -see the documentation for {\tt -inline-lifting-benefit} below.) - -Applications of functors not at toplevel, for example in a local module -inside some other expression, are treated by the inliner identically to -normal function calls. - -\subsubsection{sss:flambda-first-class-modules}{First-class modules} - -The inliner will be able to consider inlining a call to a function in a first -class module if it knows which particular function is going to be called. -The presence of the first-class module record that wraps the set of functions -in the module does not per se inhibit inlining. - -\subsubsection{sss:flambda-objects}{Objects} - -Method calls to objects are not at present inlined by Flambda. - -\subsection{ss:flambda-inlining-reports}{Inlining reports} - -If the {\tt -inlining-report} option is provided to the compiler then a file -will be emitted corresponding to each round of optimisation. For the -OCaml source file {\em basename}{\tt .ml} the files -are named {\em basename}{\tt .}{\em round}{\tt.inlining.org}, -with {\em round} a -zero-based integer. Inside the files, which are formatted as ``org mode'', -will be found English prose describing the decisions that the inliner took. - -\subsection{ss:flambda-assessment-inlining}{Assessment of inlining benefit} - -Inlining typically -results in an increase in code size, which if left unchecked, may not only -lead to grossly large executables and excessive compilation times but also -a decrease in performance due to worse locality. As such, the -Flambda inliner trades off the change in code size against -the expected runtime performance benefit, with the benefit being computed -based on the number of operations that the compiler observes may be removed -as a result of inlining. - -For example given the following code: -\begin{verbatim} -let f b x = - if b then - x - else - ... big expression ... - -let g x = f true x -\end{verbatim} -it would be observed that inlining of {\tt f} would remove: -\begin{itemize} -\item one direct call; -\item one conditional branch. -\end{itemize} - -Formally, an estimate of runtime performance benefit is computed by -first summing -the cost of the operations that are known to be removed as a result of the -inlining and subsequent simplification of the inlined body. -The individual costs for the various kinds of operations may be adjusted -using the various {\tt -inline-...-cost} flags as follows. Costs are -specified as integers. All of these flags accept a single argument -describing such integers using the conventions -detailed in section\ \ref{ss:flambda-rounds}. -\begin{options} -\item[\machine{-inline-alloc-cost}] The cost of an allocation. -\item[\machine{-inline-branch-cost}] The cost of a branch. -\item[\machine{-inline-call-cost}] The cost of a direct function call. -\item[\machine{-inline-indirect-cost}] The cost of an indirect function call. -\item[\machine{-inline-prim-cost}] The cost of a {\em primitive}. Primitives -encompass operations including arithmetic and memory access. -\end{options} -(Default values are described in section\ \ref{s:flambda-defaults} below.) - -The initial benefit value is then scaled by a factor that attempts to -compensate for the fact that the current point in the code, if under some -number of conditional branches, may be cold. (Flambda does not currently -compute hot and cold paths.) The factor---the estimated probability that -the inliner really is on a {\em hot} path---is calculated as -$\frac{1}{(1 + f)^{d}}$, where $f$ is set by -{\tt -inline-branch-factor} and $d$ is the nesting depth of branches -at the current point. As the inliner descends into more deeply-nested -branches, the benefit of inlining thus lessens. - -The resulting benefit value is known as the {\em estimated benefit}. - -The change in code size is also estimated: morally speaking it should be the -change in machine code size, but since that is not available to the inliner, -an approximation is used. - -If the estimated benefit exceeds the increase in code size then the inlined -version of the function will be kept. Otherwise the function will not be -inlined. - -Applications of functors at toplevel will be given -an additional benefit (which may be controlled by the -{\tt -inline-lifting-benefit} flag) to bias inlining in such situations -towards keeping the inlined version. - -\subsection{ss:flambda-speculation}{Control of speculation} - -As described above, there are three parameters that restrict the search -for inlining opportunities during speculation: -\begin{itemize} -\item the {\em inlining threshold}; -\item the {\em inlining depth}; -\item the {\em unrolling depth}. -\end{itemize} -These parameters are ultimately bounded by the arguments provided to -the corresponding command-line flags (or their default values): -\begin{itemize} -\item {\tt -inline} (or, if the call site that triggered speculation is -at toplevel, {\tt -inline-toplevel}); -\item {\tt -inline-max-depth}; -\item {\tt -inline-max-unroll}. -\end{itemize} -{\bf Note in particular} that {\tt -inline} does not have the meaning that -it has in the previous compiler or in {\tt -Oclassic} mode. In both of those -situations {\tt -inline} was effectively some kind of basic assessment of -inlining benefit. However in Flambda inlining mode it corresponds to a -constraint on the search; the assessment of benefit is independent, as -described above. - -When speculation starts the inlining threshold starts at the value set -by {\tt -inline} (or {\tt -inline-toplevel} if appropriate, see above). -Upon making a speculative inlining decision the -threshold is reduced by the code size of the function being inlined. -If the threshold becomes exhausted, at or below zero, no further speculation -will be performed. - -The inlining depth starts at zero -and is increased by one every time the inliner -descends into another function. It is then decreased by one every time the -inliner leaves such function. If the depth exceeds the value set by -{\tt -inline-max-depth} then speculation stops. This parameter is intended -as a general backstop for situations where the inlining -threshold does not control the search sufficiently. - -The unrolling depth applies to calls within the same mutually-recursive -group of functions. Each time an inlining of such a call is performed -the depth is incremented by one when examining the resulting body. If the -depth reaches the limit set by {\tt -inline-max-unroll} then speculation -stops. - -\section{s:flambda-specialisation}{Specialisation} - -The inliner may discover a call site to a recursive function where -something is known about the arguments: for example, they may be equal to -some other variables currently in scope. In this situation it may be -beneficial to {\em specialise} the function to those arguments. This is -done by copying the declaration of the function (and any others involved -in any same mutually-recursive declaration) and noting the extra information -about the arguments. The arguments augmented by this information are known -as {\em specialised arguments}. In order to try to ensure that specialisation -is not performed uselessly, arguments are only specialised if it can be shown -that they are {\em invariant}: in other words, during the execution of the -recursive function(s) themselves, the arguments never change. - -Unless overridden by an attribute (see below), specialisation of a function -will not be attempted if: -\begin{itemize} -\item the compiler is in {\tt -Oclassic} mode; -\item the function is not obviously recursive; -\item the function is not closed. -\end{itemize} - -The compiler can prove invariance of function arguments across multiple -functions within a recursive group (although this has some limitations, -as shown by the example below). - -It should be noted that the {\em unboxing of closures} pass (see below) -can introduce specialised arguments on non-recursive functions. (No other -place in the compiler currently does this.) - -\paragraph{Example: the well-known {\tt List.iter} function} -This function might be written like so: -\begin{verbatim} -let rec iter f l = - match l with - | [] -> () - | h :: t -> - f h; - iter f t -\end{verbatim} -and used like this: -\begin{verbatim} -let print_int x = - print_endline (Int.to_string x) - -let run xs = - iter print_int (List.rev xs) -\end{verbatim} -The argument {\tt f} to {\tt iter} is invariant so the function may be -specialised: -\begin{verbatim} -let run xs = - let rec iter' f l = - (* The compiler knows: f holds the same value as foo throughout iter'. *) - match l with - | [] -> () - | h :: t -> - f h; - iter' f t - in - iter' print_int (List.rev xs) -\end{verbatim} -The compiler notes down that for the function {\tt iter'}, the argument -{\tt f} is specialised to the constant closure {\tt print\_int}. This -means that the body of {\tt iter'} may be simplified: -\begin{verbatim} -let run xs = - let rec iter' f l = - (* The compiler knows: f holds the same value as foo throughout iter'. *) - match l with - | [] -> () - | h :: t -> - print_int h; (* this is now a direct call *) - iter' f t - in - iter' print_int (List.rev xs) -\end{verbatim} -The call to {\tt print\_int} can indeed be inlined: -\begin{verbatim} -let run xs = - let rec iter' f l = - (* The compiler knows: f holds the same value as foo throughout iter'. *) - match l with - | [] -> () - | h :: t -> - print_endline (Int.to_string h); - iter' f t - in - iter' print_int (List.rev xs) -\end{verbatim} -The unused specialised argument {\tt f} may now be removed, leaving: -\begin{verbatim} -let run xs = - let rec iter' l = - match l with - | [] -> () - | h :: t -> - print_endline (Int.to_string h); - iter' t - in - iter' (List.rev xs) -\end{verbatim} - -\paragraph{Aside on invariant parameters.} The compiler cannot currently -detect invariance in cases such as the following. -\begin{verbatim} -let rec iter_swap f g l = - match l with - | [] -> () - | 0 :: t -> - iter_swap g f l - | h :: t -> - f h; - iter_swap f g t -\end{verbatim} - -\subsection{ss:flambda-assessment-specialisation}{Assessment of specialisation benefit} - -The benefit of specialisation is assessed in a similar way as for inlining. -Specialised argument information may mean that the body of the function -being specialised can be simplified: the removed operations are accumulated -into a benefit. This, together with the size of the duplicated (specialised) -function declaration, is then assessed against the size of the call to the -original function. - -\section{s:flambda-defaults}{Default settings of parameters} - -The default settings (when not using {\tt -Oclassic}) are for one -round of optimisation using the following parameters. -% CR-soon mshinwell: for 4.04, let's autogenerate these. - -\begin{tableau}{|l|l|}{Parameter}{Setting} -\entree{{\tt -inline}}{10} -\entree{{\tt -inline-branch-factor}}{0.1} -\entree{{\tt -inline-alloc-cost}}{7} -\entree{{\tt -inline-branch-cost}}{5} -\entree{{\tt -inline-call-cost}}{5} -\entree{{\tt -inline-indirect-cost}}{4} -\entree{{\tt -inline-prim-cost}}{3} -\entree{{\tt -inline-lifting-benefit}}{1300} -\entree{{\tt -inline-toplevel}}{160} -\entree{{\tt -inline-max-depth}}{1} -\entree{{\tt -inline-max-unroll}}{0} -\entree{{\tt -unbox-closures-factor}}{10} -\end{tableau} - -\subsection{ss:flambda-o2}{Settings at -O2 optimisation level} - -When {\tt -O2} is specified two rounds of optimisation are performed. -The first round uses the default parameters (see above). The second uses -the following parameters. - -\begin{tableau}{|l|l|}{Parameter}{Setting} -\entree{{\tt -inline}}{25} -\entree{{\tt -inline-branch-factor}}{Same as default} -\entree{{\tt -inline-alloc-cost}}{Double the default} -\entree{{\tt -inline-branch-cost}}{Double the default} -\entree{{\tt -inline-call-cost}}{Double the default} -\entree{{\tt -inline-indirect-cost}}{Double the default} -\entree{{\tt -inline-prim-cost}}{Double the default} -\entree{{\tt -inline-lifting-benefit}}{Same as default} -\entree{{\tt -inline-toplevel}}{400} -\entree{{\tt -inline-max-depth}}{2} -\entree{{\tt -inline-max-unroll}}{Same as default} -\entree{{\tt -unbox-closures-factor}}{Same as default} -\end{tableau} - -\subsection{ss:flambda-o3}{Settings at -O3 optimisation level} - -When {\tt -O3} is specified three rounds of optimisation are performed. -The first two rounds are as for {\tt -O2}. The third round uses -the following parameters. - -\begin{tableau}{|l|l|}{Parameter}{Setting} -\entree{{\tt -inline}}{50} -\entree{{\tt -inline-branch-factor}}{Same as default} -\entree{{\tt -inline-alloc-cost}}{Triple the default} -\entree{{\tt -inline-branch-cost}}{Triple the default} -\entree{{\tt -inline-call-cost}}{Triple the default} -\entree{{\tt -inline-indirect-cost}}{Triple the default} -\entree{{\tt -inline-prim-cost}}{Triple the default} -\entree{{\tt -inline-lifting-benefit}}{Same as default} -\entree{{\tt -inline-toplevel}}{800} -\entree{{\tt -inline-max-depth}}{3} -\entree{{\tt -inline-max-unroll}}{1} -\entree{{\tt -unbox-closures-factor}}{Same as default} -\end{tableau} - -\section{s:flambda-manual-control}{Manual control of inlining and specialisation} - -Should the inliner prove recalcitrant and refuse to inline a particular -function, or if the observed inlining decisions are not to the programmer's -satisfaction for some other reason, inlining behaviour can be dictated by the -programmer directly in the source code. -One example where this might be appropriate is when the programmer, -but not the compiler, knows that a particular function call is on a cold -code path. It might be desirable to prevent inlining of the function so -that the code size along the hot path is kept smaller, so as to increase -locality. - -The inliner is directed using attributes. -For non-recursive functions (and one-step unrolling of recursive functions, -although {\tt \@unroll} is more clear for this purpose) -the following are supported: -\begin{options} -\item[{\machine{\@\@inline always}} or {\machine{\@\@inline never}}] Attached -to a {\em declaration} of a function or functor, these direct the inliner to -either -always or never inline, irrespective of the size/benefit calculation. (If -the function is recursive then the body is substituted and no special -action is taken for the recursive call site(s).) -{\machine{\@\@inline}} with no argument is equivalent to -{\machine{\@\@inline always}}. -\item[{\machine{\@inlined always}} or {\machine{\@inlined never}}] Attached -to a function {\em application}, these direct the inliner likewise. These -attributes at call sites override any other attribute that may be present -on the corresponding declaration. -{\machine{\@inlined}} with no argument is equivalent to -{\machine{\@inlined always}}. {\machine{\@\@inlined hint}} is equivalent to -{\machine{\@\@inline always}} except that it will not trigger warning 55 if -the function application cannot be inlined. -\end{options} - -For recursive functions the relevant attributes are: -\begin{options} -\item[{\machine{\@\@specialise always}} or {\machine{\@\@specialise never}}]% -Attached to a declaration of a function -or functor, this directs the inliner to either always or never -specialise the function so -long as it has appropriate contextual knowledge, irrespective of the -size/benefit calculation. -{\machine{\@\@specialise}} with no argument is equivalent to -{\machine{\@\@specialise always}}. -\item[{\machine{\@specialised always}} or {\machine{\@specialised never}}]% -Attached to a function application, this -directs the inliner likewise. This attribute at a call site overrides any -other attribute that may be present on the corresponding declaration. -(Note that the function will still only be specialised if there exist -one or more invariant parameters whose values are known.) -{\machine{\@specialised}} with no argument is equivalent to -{\machine{\@specialised always}}. -\item[{\machine{\@unrolled }}$n$] This attribute is attached to a function -application and always takes an integer argument. Each time the inliner sees -the attribute it behaves as follows: -\begin{itemize} -\item If $n$ is zero or less, nothing happens. -\item Otherwise the function being called is substituted at the call site -with its body having been rewritten such that -any recursive calls to that function {\em or -any others in the same mutually-recursive group} are annotated with the -attribute {\tt unrolled(}$n - 1${\tt )}. Inlining may continue on that body. -\end{itemize} -As such, $n$ behaves as the ``maximum depth of unrolling''. -\end{options} - -A compiler warning will be emitted if it was found impossible to obey an -annotation from an {\tt \@inlined} or {\tt \@specialised} attribute. - -\paragraph{Example showing correct placement of attributes} -\begin{verbatim} -module F (M : sig type t end) = struct - let[@inline never] bar x = - x * 3 - - let foo x = - (bar [@inlined]) (42 + x) -end [@@inline never] - -module X = F [@inlined] (struct type t = int end) -\end{verbatim} - -\section{s:flambda-simplification}{Simplification} - -Simplification, which is run in conjunction with inlining, -propagates information (known as {\em approximations}) about which -variables hold what values at runtime. Certain relationships between -variables and symbols are also tracked: for example, some variable may be -known to always hold the same value as some other variable; or perhaps -some variable may be known to always hold the value pointed to by some -symbol. - -The propagation can help to eliminate allocations in cases such as: -\begin{verbatim} -let f x y = - ... - let p = x, y in - ... - ... (fst p) ... (snd p) ... -\end{verbatim} -The projections from {\tt p} may be replaced by uses of the variables -{\tt x} and {\tt y}, potentially meaning that {\tt p} becomes unused. - -The propagation performed by the simplification pass is also important for -discovering which functions flow to indirect call sites. This can enable -the transformation of such call sites into direct call sites, which makes -them eligible for an inlining transformation. - -Note that no information is propagated about the contents of strings, -even in {\tt safe-string} mode, because it cannot yet be guaranteed -that they are immutable throughout a given program. - -\section{s:flambda-other-transfs}{Other code motion transformations} - -\subsection{ss:flambda-lift-const}{Lifting of constants} - -Expressions found to be constant will be lifted to symbol -bindings---that is to say, they will be statically allocated in the -object file---when -they evaluate to boxed values. Such constants may be straightforward numeric -constants, such as the floating-point number {\tt 42.0}, or more complicated -values such as constant closures. - -Lifting of constants to toplevel reduces allocation at runtime. - -The compiler aims to share constants lifted to toplevel such that there -are no duplicate definitions. However if {\tt .cmx} files are hidden -from the compiler then maximal sharing may not be possible. - -\paragraph{Notes about float arrays} % -The following language semantics apply specifically to constant float arrays. -(By ``constant float array'' is meant an array consisting entirely of floating -point numbers that are known at compile time. A common case is a literal -such as {\tt [| 42.0; 43.0; |]}. -\begin{itemize} -\item Constant float arrays at the toplevel are mutable and never shared. -(That is to say, for each -such definition there is a distinct symbol in the data section of the object -file pointing at the array.) -\item Constant float arrays not at toplevel are mutable and are created each -time the expression is evaluated. This can be thought of as an operation that -takes an immutable array (which in the source code has no associated name; let -us call it the {\em initialising array}) and -duplicates it into a fresh mutable array. -\begin{itemize} -\item If the array is of size four or less, the expression will create a -fresh block and write the values into it one by one. There is no reference -to the initialising array as a whole. - -\item Otherwise, the initialising array is lifted out and subject to the -normal constant sharing procedure; -creation of the array consists of bulk copying the initialising array -into a fresh value on the OCaml heap. -\end{itemize} -\end{itemize} - -\subsection{ss:flambda-lift-toplevel-let}{Lifting of toplevel let bindings} - -Toplevel {\tt let}-expressions may be lifted to symbol bindings to ensure -that the corresponding bound variables are not captured by closures. If the -defining expression of a given binding is found to be constant, it is bound -as such (the technical term is a {\em let-symbol} binding). - -Otherwise, the symbol is bound to a (statically-allocated) -{\em preallocated block} containing one field. At runtime, the defining -expression will be evaluated and the first field of the block filled with -the resulting value. This {\em initialise-symbol} binding -causes one extra indirection but ensures, by -virtue of the symbol's address being known at compile time, that uses of the -value are not captured by closures. - -It should be noted that the blocks corresponding to initialise-symbol -bindings are kept alive forever, by virtue of them occurring in a static -table of GC roots within the object file. This extended lifetime of -expressions may on occasion be surprising. If it is desired to create -some non-constant value (for example when writing GC tests) that does not -have this -extended lifetime, then it may be created and used inside a function, -with the application point of that function (perhaps at toplevel)---or -indeed the function declaration itself---marked -as to never be inlined. This technique prevents lifting of the definition -of the value in question (assuming of course that it is not constant). - -\section{s:flambda-unboxing}{Unboxing transformations} - -The transformations in this section relate to the splitting apart of -{\em boxed} (that is to say, non-immediate) values. They are largely -intended to reduce allocation, which tends to result in a runtime -performance profile with lower variance and smaller tails. - -\subsection{ss:flambda-unbox-fvs}{Unboxing of closure variables} - -This transformation is enabled unless -{\tt -no-unbox-free-vars-of-closures} is provided. - -Variables that appear in closure environments may themselves be boxed -values. As such, they may be split into further closure variables, each -of which corresponds to some projection from the original closure variable(s). -This transformation is called {\em unboxing of closure variables} or -{\em unboxing of free variables of closures}. It is only applied when -there is -reasonable certainty that there are no uses of the boxed free variable itself -within the corresponding function bodies. -% CR-someday mshinwell: Actually, we probably don't check this carefully -% enough. It needs a global analysis in case there is an out-of-scope -% projection. - -\paragraph{Example:} In the following code, the compiler observes that -the closure returned from the function {\tt f} contains a variable {\tt pair} -(free in the body of {\tt f}) that may be split into two separate variables. -\begin{verbatim} -let f x0 x1 = - let pair = x0, x1 in - Printf.printf "foo\n"; - fun y -> - fst pair + snd pair + y -\end{verbatim} -After some simplification one obtains: -\begin{verbatim} -let f x0 x1 = - let pair_0 = x0 in - let pair_1 = x1 in - Printf.printf "foo\n"; - fun y -> - pair_0 + pair_1 + y -\end{verbatim} -and then: -\begin{verbatim} -let f x0 x1 = - Printf.printf "foo\n"; - fun y -> - x0 + x1 + y -\end{verbatim} -The allocation of the pair has been eliminated. - -This transformation does not operate if it would cause the closure to -contain more than twice as many closure variables as it did beforehand. - -\subsection{ss:flambda-unbox-spec-args}{Unboxing of specialised arguments} - -This transformation is enabled unless -{\tt -no-unbox-specialised-args} is provided. - -It may become the case during compilation that one or more invariant arguments -to a function become specialised to a particular value. When such values are -themselves boxed the corresponding specialised arguments may be split into -more specialised arguments corresponding to the projections out of the boxed -value that occur within the function body. This transformation is called -{\em unboxing of specialised arguments}. It is only applied when there is -reasonable certainty that the boxed argument itself is unused within the -function. - -If the function in question is involved in a recursive group then unboxing -of specialised arguments may be immediately replicated across the group -based on the dataflow between invariant arguments. - -\paragraph{Example:} Having been given the following code, the compiler -will inline {\tt loop} into {\tt f}, and then observe {\tt inv} -being invariant and always the pair formed by adding {\tt 42} and {\tt 43} -to the argument {\tt x} of the function {\tt f}. -\begin{verbatim} -let rec loop inv xs = - match xs with - | [] -> fst inv + snd inv - | x::xs -> x + loop2 xs inv -and loop2 ys inv = - match ys with - | [] -> 4 - | y::ys -> y - loop inv ys - -let f x = - Printf.printf "%d\n" (loop (x + 42, x + 43) [1; 2; 3]) -\end{verbatim} -Since the functions have sufficiently few arguments, more specialised -arguments will be added. After some simplification one obtains: -\begin{verbatim} -let f x = - let rec loop' xs inv_0 inv_1 = - match xs with - | [] -> inv_0 + inv_1 - | x::xs -> x + loop2' xs inv_0 inv_1 - and loop2' ys inv_0 inv_1 = - match ys with - | [] -> 4 - | y::ys -> y - loop' ys inv_0 inv_1 - in - Printf.printf "%d\n" (loop' [1; 2; 3] (x + 42) (x + 43)) -\end{verbatim} -The allocation of the pair within {\tt f} has been removed. (Since the -two closures for {\tt loop'} and {\tt loop2'} are constant they will also be -lifted to toplevel with no runtime allocation penalty. This -would also happen without having run the transformation to unbox -specialise arguments.) - -The transformation to unbox specialised arguments never introduces extra -allocation. - -The transformation will not unbox arguments if it would result in the -original function having sufficiently many arguments so as to inhibit -tail-call optimisation. - -The transformation is implemented by creating a wrapper function that -accepts the original arguments. Meanwhile, the original function is renamed -and extra arguments are added corresponding to the unboxed specialised -arguments; this new function -is called from the wrapper. The wrapper will then be inlined -at direct call sites. Indeed, all call sites will be direct unless -{\tt -unbox-closures} is being used, since they will have been generated -by the compiler when originally specialising the function. (In the case -of {\tt -unbox-closures} other functions may appear with specialised -arguments; in this case there may be indirect calls and these will incur -a small penalty owing to having to bounce through the wrapper. The technique -of {\em direct call surrogates} used for {\tt -unbox-closures} is not -used by the transformation to unbox specialised arguments.) - -\subsection{ss:flambda-unbox-closures}{Unboxing of closures} - -This transformation is {\em not} enabled by default. It may be enabled -using the {\tt -unbox-closures} flag. - -The transformation replaces closure variables by specialised arguments. -The aim is to cause more closures to become closed. It is particularly -applicable, as a means of reducing allocation, where the function concerned -cannot be inlined or specialised. For example, some non-recursive function -might be too large to inline; or some recursive function might offer -no opportunities for specialisation perhaps because its only argument is -one of type {\tt unit}. - -At present there may be a small penalty in terms of actual runtime -performance when this transformation is enabled, although more stable -performance may be obtained due to reduced allocation. It is recommended -that developers experiment to determine whether the option is beneficial -for their code. (It is expected that in the future it will be possible -for the performance degradation to be removed.) - -\paragraph{Simple example:} In the following code (which might typically -occur when {\tt g} is too large to inline) the value of {\tt x} would usually -be communicated to the application of the {\tt +} function via the closure -of {\tt g}. -\begin{verbatim} -let f x = - let g y = - x + y - in - (g [@inlined never]) 42 -\end{verbatim} -Unboxing of the closure causes the value for {\tt x} inside {\tt g} to -be passed as an argument to {\tt g} rather than through its closure. This -means that the closure of {\tt g} becomes constant and may be lifted to -toplevel, eliminating the runtime allocation. - -The transformation is implemented by adding a new wrapper function in the -manner of that used when unboxing specialised arguments. The closure -variables are still free in the wrapper, but the intention is that when -the wrapper is inlined at direct call sites, the relevant values are -passed directly to the main function via the new specialised arguments. - -Adding such a wrapper will penalise indirect calls to the function -(which might exist in arbitrary places; remember that this transformation -is not for example applied only on functions the compiler has produced -as a result of specialisation) since such calls will bounce through -the wrapper. To -mitigate this, if a function is small enough when weighed up against -the number of free variables being removed, it will be duplicated by the -transformation to obtain two versions: the original (used for indirect calls, -since we can do no better) and the wrapper/rewritten function pair as -described in the previous paragraph. The wrapper/rewritten function pair -will only be used at direct call sites of the function. (The wrapper in -this case is known as a {\em direct call surrogate}, since -it takes the place of another function---the unchanged version used for -indirect calls---at direct call sites.) - -The {\tt -unbox-closures-factor} command line flag, which takes an -integer, may be used to adjust the point at which a function is deemed -large enough to be ineligible for duplication. The benefit of -duplication is scaled by the integer before being evaluated against the -size. - -\paragraph{Harder example:} In the following code, there are two closure -variables that would typically cause closure allocations. One is called -{\tt fv} and occurs inside the function {\tt baz}; the other is called -{\tt z} and occurs inside the function {\tt bar}. -In this toy (yet sophisticated) example we again use an attribute to -simulate the typical situation where the first argument of {\tt baz} is -too large to inline. -\begin{verbatim} -let foo c = - let rec bar zs fv = - match zs with - | [] -> [] - | z::zs -> - let rec baz f = function - | [] -> [] - | a::l -> let r = fv + ((f [@inlined never]) a) in r :: baz f l - in - (map2 (fun y -> z + y) [z; 2; 3; 4]) @ bar zs fv - in - Printf.printf "%d" (List.length (bar [1; 2; 3; 4] c)) -\end{verbatim} -The code resulting from applying {\tt -O3 -unbox-closures} to this code -passes the free variables via function arguments in -order to eliminate all closure allocation in this example (aside from any -that might be performed inside {\tt printf}). - -\section{s:flambda-remove-unused}{Removal of unused code and values} - -\subsection{ss:flambda-redundant-let}{Removal of redundant let expressions} - -The simplification pass removes unused {\tt let} bindings so long as -their corresponding defining expressions have ``no effects''. See -the section ``Treatment of effects'' below for the precise definition of -this term. - -\subsection{ss:flambda-redundant}{Removal of redundant program constructs} - -This transformation is analogous to the removal of {\tt let}-expressions -whose defining expressions have no effects. It operates instead on symbol -bindings, removing those that have no effects. - -\subsection{ss:flambda-remove-unused-args}{Removal of unused arguments} - -This transformation is only enabled by default for specialised arguments. -It may be enabled for all arguments using the {\tt -remove-unused-arguments} -flag. - -The pass analyses functions to determine which arguments are unused. -Removal is effected by creating a wrapper function, which will be inlined -at every direct call site, that accepts the original arguments and then -discards the unused ones before calling the original function. As a -consequence, this transformation may be detrimental if the original -function is usually indirectly called, since such calls will now bounce -through the wrapper. (The technique of {\em direct call surrogates} used -to reduce this penalty during unboxing of closure variables (see above) -does not yet apply to the pass that removes unused arguments.) - -\subsection{ss:flambda-removal-closure-vars}{Removal of unused closure variables} - -This transformation performs an analysis across -the whole compilation unit to determine whether there exist closure variables -that are never used. Such closure variables are then eliminated. (Note that -this has to be a whole-unit analysis because a projection of a closure -variable from some particular closure may have propagated to an arbitrary -location within the code due to inlining.) - -\section{s:flambda-other}{Other code transformations} - -\subsection{ss:flambda-non-escaping-refs}{Transformation of non-escaping references into mutable variables} - -Flambda performs a simple analysis analogous to that performed elsewhere -in the compiler that can transform {\tt ref}s into mutable variables -that may then be held in registers (or on the stack as appropriate) rather -than being allocated on the OCaml heap. This only happens so long as the -reference concerned can be shown to not escape from its defining scope. - -\subsection{ss:flambda-subst-closure-vars}{Substitution of closure variables for specialised arguments} - -This transformation discovers closure variables that are known to be -equal to specialised arguments. Such closure variables are replaced by -the specialised arguments; the closure variables may then be removed by -the ``removal of unused closure variables'' pass (see below). - -\section{s:flambda-effects}{Treatment of effects} - -The Flambda optimisers classify expressions in order to determine whether -an expression: -\begin{itemize} -\item does not need to be evaluated at all; and/or -\item may be duplicated. -\end{itemize} - -This is done by forming judgements on the {\em effects} and the {\em coeffects} -that might be performed were the expression to be executed. Effects talk -about how the expression might affect the world; coeffects talk about how -the world might affect the expression. - -Effects are classified as follows: -\begin{options} -\item[{\bf No effects:}] The expression does not change the observable state -of the world. For example, it must not write to any mutable storage, -call arbitrary external functions or change control flow (e.g. by raising -an exception). Note that allocation is {\em not} classed as having -``no effects'' (see below). -\begin{itemize} -\item It is assumed in the compiler that expressions with no -effects, whose results are not used, may be eliminated. (This typically -happens where the expression in question is the defining expression of a -{\tt let}; in such cases the {\tt let}-expression will be -eliminated.) It is further -assumed that such expressions with no effects may be -duplicated (and thus possibly executed more than once). -\item Exceptions arising from allocation points, for example -``out of memory'' or -exceptions propagated from finalizers or signal handlers, are treated as -``effects out of the ether'' and thus ignored for our determination here -of effectfulness. The same goes for floating point operations that may -cause hardware traps on some platforms. -\end{itemize} -\item[{\bf Only generative effects:}] The expression does not change the -observable state of the world save for possibly affecting the state of -the garbage collector by performing an allocation. Expressions -that only have generative effects and whose results are unused -may be eliminated by the compiler. However, unlike expressions with -``no effects'', such expressions will never be eligible for duplication. -\item[{\bf Arbitrary effects:}] All other expressions. -\end{options} - -There is a single classification for coeffects: -\begin{options} -\item[{\bf No coeffects:}] The expression does not observe the effects (in -the sense described above) of other expressions. For example, it must not -read from any mutable storage or call arbitrary external functions. -\end{options} - -It is assumed in the compiler that, subject to data dependencies, -expressions with neither effects nor coeffects may be reordered with -respect to other expressions. - -\section{s:flambda-static-modules}{Compilation of statically-allocated modules} - -Compilation of modules that are able to be statically allocated (for example, -the module corresponding to an entire compilation unit, as opposed to a first -class module dependent on values computed at runtime) initially follows the -strategy used for bytecode. A sequence of {\tt let}-bindings, which may be -interspersed with arbitrary effects, surrounds a record creation that becomes -the module block. The Flambda-specific transformation follows: these bindings -are lifted to toplevel symbols, as described above. - -\section{s:flambda-inhibition}{Inhibition of optimisation} - -Especially when writing benchmarking suites that run non-side-effecting -algorithms in loops, it may be found that the optimiser entirely -elides the code being benchmarked. This behaviour can be prevented by -using the {\tt Sys.opaque\_identity} function (which indeed behaves as a -normal OCaml function and does not possess any ``magic'' semantics). The -documentation of the {\tt Sys} module should be consulted for further details. - -\section{s:flambda-unsafe}{Use of unsafe operations} - -The behaviour of the Flambda simplification pass means that certain unsafe -operations, which may without Flambda or when using previous versions of -the compiler be safe, must not be used. This specifically refers to -functions found in the {\tt Obj} module. - -In particular, it is forbidden to change any value (for example using -{\tt Obj.set\_field} or {\tt Obj.set\_tag}) that is not mutable. -(Values returned from C stubs -are always treated as mutable.) The compiler will emit warning 59 if it -detects such a write---but it cannot warn in all cases. Here is an example -of code that will trigger the warning: -\begin{verbatim} -let f x = - let a = 42, x in - (Obj.magic a : int ref) := 1; - fst a -\end{verbatim} -The reason this is unsafe is because the simplification pass believes that -{\tt fst a} holds the value {\tt 42}; and indeed it must, unless type -soundness has been broken via unsafe operations. - -If it must be the case that code has to be written that triggers warning 59, -but the code is known to actually be correct (for some definition of -correct), then {\tt Sys.opaque\_identity} may be used to wrap the value -before unsafe operations are performed upon it. Great care must be taken -when doing this to ensure that the opacity is added at the correct place. -It must be emphasised that this use of {\tt Sys.opaque\_identity} is only -for {\bf exceptional} cases. It should not be used in normal code or to -try to guide the optimiser. - -As an example, this code will return the integer {\tt 1}: -\begin{verbatim} -let f x = - let a = Sys.opaque_identity (42, x) in - (Obj.magic a : int ref) := 1; - fst a -\end{verbatim} -However the following code will still return {\tt 42}: -\begin{verbatim} -let f x = - let a = 42, x in - Sys.opaque_identity (Obj.magic a : int ref) := 1; - fst a -\end{verbatim} - -High levels of inlining performed by Flambda may expose bugs in code -thought previously to be correct. Take care, for example, not -to add type annotations that claim some mutable value is always immediate -if it might be possible for an unsafe operation to update it to a boxed -value. - -\section{s:flambda-glossary}{Glossary} - -The following terminology is used in this chapter of the manual. - -\begin{options} -\item[{\bf Call site}] See {\em direct call site} and % -{\em indirect call site} below. -\item[{\bf Closed function}] A function whose body has no free variables -except its parameters and any to which are bound other functions within -the same (possibly mutually-recursive) declaration. -\item[{\bf Closure}] The runtime representation of a function. This -includes pointers to the code of the function -together with the values of any variables that are used in the body of -the function but actually defined outside of the function, in the -enclosing scope. -The values of such variables, collectively known as the -{\em environment}, are required because the function may be -invoked from a place where the original bindings of such variables are -no longer in scope. A group of possibly -mutually-recursive functions defined using {\em let rec} all share a -single closure. (Note to developers: in the Flambda source code a -{\em closure} always corresponds to a single function; a -{\em set of closures} refers to a group of such.) -\item[{\bf Closure variable}] A member of the environment held within the -closure of a given function. -\item[{\bf Constant}] Some entity (typically an expression) the value of which -is known by the compiler at compile time. Constantness may be explicit from -the source code or inferred by the Flambda optimisers. -\item[{\bf Constant closure}] A closure that is statically allocated in an -object file. It is almost always the case that the environment portion of -such a closure is empty. -\item[{\bf Defining expression}] The expression {\tt e} in % -{\tt let x = e in e'}. -\item[{\bf Direct call site}] A place in a program's code where a function is -called and it is known at compile time which function it will always be. -\item[{\bf Indirect call site}] A place in a program's code where a function -is called but is not known to be a {\em direct call site}. -\item[{\bf Program}] A collection of {\em symbol bindings} forming the -definition of a single compilation unit (i.e. {\tt .cmx} file). -\item[{\bf Specialised argument}] An argument to a function that is known -to always hold a particular value at runtime. These are introduced by the -inliner when specialising recursive functions; and the {\tt unbox-closures} -pass. (See section\ \ref{s:flambda-specialisation}.) -\item[{\bf Symbol}] A name referencing a particular place in an object file -or executable image. At that particular place will be some constant value. -Symbols may be examined using operating system-specific tools (for -example {\tt objdump} on Linux). -\item[{\bf Symbol binding}] Analogous to a {\tt let}-expression but working -at the level of symbols defined in the object file. The address of a symbol is -fixed, but it may be bound to both constant and non-constant expressions. -\item[{\bf Toplevel}] An expression in the current program which is not -enclosed within any function declaration. -\item[{\bf Variable}] A named entity to which some OCaml value is bound by a -{\tt let} expression, pattern-matching construction, or similar. -\end{options} diff --git a/manual/manual/cmds/instrumented-runtime.etex b/manual/manual/cmds/instrumented-runtime.etex deleted file mode 100644 index 6826f7c7..00000000 --- a/manual/manual/cmds/instrumented-runtime.etex +++ /dev/null @@ -1,315 +0,0 @@ -\chapter{Runtime tracing with the instrumented runtime} -%HEVEA\cutname{instrumented-runtime.html} - -This chapter describes the OCaml instrumented runtime, a runtime variant -allowing the collection of events and metrics. - -Collected metrics include time spent executing the {\em garbage collector}. -The overall execution time of individual pauses are measured -down to the time spent in specific parts of the garbage collection. -Insight is also given on memory allocation and motion by recording -the size of allocated memory blocks, as well as value promotions from the -{\em minor heap} to the {\em major heap}. - -\section{s:instr-runtime-overview}{Overview} - -Once compiled and linked with the instrumented runtime, any OCaml program -can generate {\em trace files} that can then be read -and analyzed by users in order to understand specific runtime behaviors. - -The generated trace files are stored using the {\em Common Trace Format}, which -is a general purpose binary tracing format. -A complete trace consists of: -\begin{itemize} -\item a {\em metadata file}, part of the OCaml distribution -\item and a {\em trace file}, generated by the runtime\ - in the program being traced. -\end{itemize} - -For more information on the {\em Common Trace Format}, see -\href{https://diamon.org/ctf/}{https://diamon.org/ctf/}. - -\section{s:instr-runtime-enabling}{Enabling runtime instrumentation} - - -For the following examples, we will use the following example program: - -\begin{caml_example*}{verbatim} -module SMap = Map.Make(String) - -let s i = String.make 512 (Char.chr (i mod 256)) - -let clear map = SMap.fold (fun k _ m -> SMap.remove k m) map map - -let rec seq i = - if i = 0 then Seq.empty else fun () -> (Seq.Cons (i, seq (i - 1))) - -let () = - seq 1_000_000 - |> Seq.fold_left (fun m i -> SMap.add (s i) i m) SMap.empty - |> clear - |> ignore -\end{caml_example*} - -The next step is to compile and link the program with the instrumented runtime. -This can be done by using the "-runtime-variant" flag: - -\begin{verbatim} - ocamlopt -runtime-variant i program.ml -o program -\end{verbatim} - -Note that the instrumented runtime is an alternative runtime for OCaml -programs. It is only referenced during the linking stage of the final -executable. This means that the compilation stage does not need to be altered -to enable instrumentation. - -The resulting program can then be traced by running it with the environment -variable "OCAML_EVENTLOG_ENABLED": - -\begin{verbatim} - OCAML_EVENTLOG_ENABLED=1 ./program -\end{verbatim} - -During execution, a trace file will be generated in the -program's current working directory. - -\subsubsection*{sss:instr-runtime-build-more}{More build examples} - -When using the {\em dune} build system, this compiler invocation can be -replicated using the {\tt flags} {\tt stanza} when building an executable. - -\begin{verbatim} - (executable - (name program) - (flags "-runtime-variant=i")) -\end{verbatim} - -The instrumented runtime can also be used with the OCaml bytecode interpreter. -This can be done by either using the -"-runtime-variant=i" flag when linking the program with {\tt ocamlc}, or by running the generated -bytecode through {\tt ocamlruni}: - -\begin{verbatim} - ocamlc program.ml -o program.byte - OCAML_EVENTLOG_ENABLED=1 ocamlruni program.byte -\end{verbatim} - -See chapter~\ref{c:camlc} and chapter~\ref{c:runtime} for more information about -{\tt ocamlc} and {\tt ocamlrun}. - -\section{s:instr-runtime-read}{Reading traces} - -Traces generated by the instrumented runtime can be analyzed with tooling -available outside of the OCaml distribution. - -A complete trace consists of a {\em metadata file} and a {\em trace file}. -Two simple ways to work with the traces are the {\em eventlog-tools} and -{\em babeltrace} libraries. - -\subsection{ss:instr-runtime-tools}{eventlog-tools} -{\em eventlog-tools} is a library implementing a parser, as well as a -a set of tools that allows to perform basic format conversions and analysis. - -For more information about {\em eventlog-tools}, refer to the project's -main page: \href{https://github.com/ocaml-multicore/eventlog-tools}{https://github.com/ocaml-multicore/eventlog-tools} - -\subsection{ss:instr-runtime-babeltrace}{babeltrace} - -{\em babeltrace} is a C library, as well as a Python binding and set of tools -that serve as the reference implementation for the {\em Common Trace Format}. -The {\em babeltrace} command line utility allows for a basic rendering -of a trace's content, while the high level Python API can be used to -decode the trace and process them programmatically with libraries -such as {\em numpy} or {\em Jupyter}. - -Unlike {\em eventlog-tools}, which possesses a specific knowledge of -OCaml's {\em Common Trace Format} schema, it is required to provide -the OCaml {\em metadata} file to {\em babeltrace}. - -The metadata file is available in the OCaml installation. -Its location can be obtained using the following command: - -\begin{verbatim} - ocamlc -where -\end{verbatim} - -The {\em eventlog_metadata} file can be found at this path and -copied in the same directory as the generated trace file. -However, {\em babeltrace} expects the file to be named -{\tt metadata} in order to process the trace. -Thus, it will need to be renamed when copied to the trace's directory. - -Here is a naive decoder example, using {\em babeltrace}'s Python -library, and {\em Python 3.8}: - -\begin{verbatim} - -import subprocess -import shutil -import sys -import babeltrace as bt - -def print_event(ev): - print(ev['timestamp']) - print(ev['pid']) - if ev.name == "entry": - print('entry_event') - print(ev['phase']) - if ev.name == "exit": - print('exit_event') - print(ev['phase']) - if ev.name == "alloc": - print(ev['count']) - print(ev['bucket']) - if ev.name == "counter": - print(ev['count']) - print(ev['kind']) - if ev.name == "flush": - print("flush") - -def get_ocaml_dir(): - # Fetching OCaml's installation directory to extract the CTF metadata - ocamlc_where = subprocess.run(['ocamlc', '-where'], stdout=subprocess.PIPE) - ocaml_dir = ocamlc_where.stdout.decode('utf-8').rstrip('\n') - return(ocaml_dir) - -def main(): - trace_dir = sys.argv[1] - ocaml_dir = get_ocaml_dir() - metadata_path = ocaml_dir + "/eventlog_metadata" - # copying the metadata to the trace's directory, - # and renaming it to 'metadata'. - shutil.copyfile(metadata_path, trace_dir + "/metadata") - tr = bt.TraceCollection() - tr.add_trace(trace_dir, 'ctf') - for event in tr.events: - print_event(event) - -if __name__ == '__main__': - main() - -\end{verbatim} - -This script expect to receive as an argument the directory containing the -trace file. It will then copy the {\em CTF} metadata file to the trace's -directory, and then decode the trace, printing each event in the process. - -For more information on {\em babeltrace}, see the website at: -\href{https://babeltrace.org/}{https://babeltrace.org/} - -\section{s:instr-runtime-more}{Controlling instrumentation and limitations} - -\subsection{ss:instr-runtime-prefix}{Trace filename} - -The default trace filename is {\tt caml-\{PID\}.eventlog}, where {\tt \{PID\}} -is the process identifier of the traced program. - -This filename can also be specified using the -"OCAML_EVENTLOG_PREFIX" environment variable. -The given path will be suffixed with {\tt \{.PID\}.eventlog}. - -\begin{verbatim} - OCAML_EVENTLOG_PREFIX=/tmp/a_prefix OCAML_EVENTLOG_ENABLED=1 ./program -\end{verbatim} - -In this example, the trace will be available at path -{\tt /tmp/a_prefix.\{PID\}.eventlog}. - -Note that this will only affect the prefix of the trace file, there is no -option to specify the full effective file name. -This restriction is in place to make room for future improvements to the -instrumented runtime, where the single trace file per session design -may be replaced. - -For scripting purpose, matching against `\{PID\}`, as well as the -{\tt .eventlog} file extension should provide enough control over -the generated files. - -Note as well that parent directories in the given path will not be created -when opening the trace. The runtime assumes the path is -accessible for creating and writing the trace. The program will -fail to start if this requirement isn't met. - -\subsection{ss:instr-runtime-pause}{Pausing and resuming tracing} -Mechanisms are available to control event collection at runtime. - -"OCAML_EVENTLOG_ENABLED" can be set to the {\tt p} flag in order -to start the program with event collection paused. - -\begin{verbatim} - OCAML_EVENTLOG_ENABLED=p ./program -\end{verbatim} - -The program will have to start event collection explicitly. -Starting and stopping event collection programmatically can be done by calling -{\tt Gc.eventlog_resume} and {\tt Gc.eventlog_pause}) from within the program. -Refer to the {\stdmoduleref{Gc}} module documentation for more information. - -Running the program provided earlier with "OCAML_EVENTLOG_ENABLED=p" -will for example yield the following result. - -\begin{verbatim} -$ OCAML_EVENTLOG_ENABLED=p ./program -$ ocaml-eventlog-report caml-{PID}.eventlog -==== eventlog/flush -median flush time: 58ns -total flush time: 58ns -flush count: 1 -\end{verbatim} - -The resulting trace contains only one event payload, namely a {\em flush} event, -indicating how much time was spent flushing the trace file to disk. - -However, if the program is changed to include a call to -{\tt Gc.eventlog_resume}, events payloads can be seen again -in the trace file. - -\begin{caml_example*}{verbatim} - let () = - Gc.eventlog_resume(); - seq 1_000_000 - |> Seq.fold_left (fun m i -> SMap.add (s i) i m) SMap.empty - |> clear - |> ignore - -\end{caml_example*} - -The resulting trace will contain all events encountered during -the program's execution: - -\begin{verbatim} - $ ocaml-eventlog-report caml-{PID}.eventlog - [..omitted..] - ==== force_minor/alloc_small - 100.0K..200.0K: 174 - 20.0K..30.0K: 1 - 0..100: 1 - - ==== eventlog/flush - median flush time: 207.8us - total flush time: 938.1us - flush count: 5 -\end{verbatim} - -\subsection{ss:instr-runtime-limitations}{Limitations} - -The instrumented runtime does not support the {\tt fork} system call. -A child process forked from an instrumented program will not be traced. - -The instrumented runtime aims to provide insight into the runtime's execution -while maintaining a low overhead. -However, this overhead may become more noticeable depending on how a program -executes. -The instrumented runtime currently puts a strong emphasis on -tracing {\em garbage collection} events. This means that programs -with heavy garbage collection activity may be more susceptible to -tracing induced performance penalties. - -While providing an accurate estimate of potential performance loss is difficult, -test on various OCaml programs showed a total running time increase ranging -from 1\% to 8\%. - -For a program with an extended running time where the collection of only a -small sample of events is required, using the {\em eventlog_resume} and -{\em eventlog_pause} primitives may help relieve some of the -tracing induced performance impact. diff --git a/manual/manual/cmds/intf-c.etex b/manual/manual/cmds/intf-c.etex deleted file mode 100644 index 5c00cfb0..00000000 --- a/manual/manual/cmds/intf-c.etex +++ /dev/null @@ -1,2817 +0,0 @@ -\chapter{Interfacing\label{c:intf-c} C with OCaml} -%HEVEA\cutname{intfc.html} - -This chapter describes how user-defined primitives, written in C, can -be linked with OCaml code and called from OCaml functions, and how -these C functions can call back to OCaml code. - -\section{s:c-overview}{Overview and compilation information} - -\subsection{ss:c-prim-decl}{Declaring primitives} - -\begin{syntax} -definition: ... - | 'external' value-name ':' typexpr '=' external-declaration -; -external-declaration: string-literal [ string-literal [ string-literal ] ] -\end{syntax} - -User primitives are declared in an implementation file or -@"struct"\ldots"end"@ module expression using the @"external"@ keyword: -\begin{alltt} - external \var{name} : \var{type} = \var{C-function-name} -\end{alltt} -This defines the value name \var{name} as a function with type -\var{type} that executes by calling the given C function. -For instance, here is how the "seek_in" primitive is declared in the -standard library module "Stdlib": -\begin{verbatim} - external seek_in : in_channel -> int -> unit = "caml_ml_seek_in" -\end{verbatim} -Primitives with several arguments are always curried. The C function -does not necessarily have the same name as the ML function. - -External functions thus defined can be specified in interface files or -@"sig"\ldots"end"@ signatures either as regular values -\begin{alltt} - val \var{name} : \var{type} -\end{alltt} -thus hiding their implementation as C functions, or explicitly as -``manifest'' external functions -\begin{alltt} - external \var{name} : \var{type} = \var{C-function-name} -\end{alltt} -The latter is slightly more efficient, as it allows clients of the -module to call directly the C function instead of going through the -corresponding OCaml function. On the other hand, it should not be used -in library modules if they have side-effects at toplevel, as this -direct call interferes with the linker's algorithm for removing unused -modules from libraries at link-time. - -The arity (number of arguments) of a primitive is automatically -determined from its OCaml type in the "external" declaration, by -counting the number of function arrows in the type. For instance, -"seek_in" above has arity 2, and the "caml_ml_seek_in" C function -is called with two arguments. Similarly, -\begin{verbatim} - external seek_in_pair: in_channel * int -> unit = "caml_ml_seek_in_pair" -\end{verbatim} -has arity 1, and the "caml_ml_seek_in_pair" C function receives one argument -(which is a pair of OCaml values). - -Type abbreviations are not expanded when determining the arity of a -primitive. For instance, -\begin{verbatim} - type int_endo = int -> int - external f : int_endo -> int_endo = "f" - external g : (int -> int) -> (int -> int) = "f" -\end{verbatim} -"f" has arity 1, but "g" has arity 2. This allows a primitive to -return a functional value (as in the "f" example above): just remember -to name the functional return type in a type abbreviation. - -The language accepts external declarations with one or two -flag strings in addition to the C function's name. These flags are -reserved for the implementation of the standard library. - -\subsection{ss:c-prim-impl}{Implementing primitives} - -User primitives with arity $n \leq 5$ are implemented by C functions -that take $n$ arguments of type "value", and return a result of type -"value". The type "value" is the type of the representations for OCaml -values. It encodes objects of several base types (integers, -floating-point numbers, strings,~\ldots) as well as OCaml data -structures. The type "value" and the associated conversion -functions and macros are described in detail below. For instance, -here is the declaration for the C function implementing the "input" -primitive: -\begin{verbatim} -CAMLprim value input(value channel, value buffer, value offset, value length) -{ - ... -} -\end{verbatim} -When the primitive function is applied in an OCaml program, the C -function is called with the values of the expressions to which the -primitive is applied as arguments. The value returned by the function is -passed back to the OCaml program as the result of the function -application. - -User primitives with arity greater than 5 should be implemented by two -C functions. The first function, to be used in conjunction with the -bytecode compiler "ocamlc", receives two arguments: a pointer to an -array of OCaml values (the values for the arguments), and an -integer which is the number of arguments provided. The other function, -to be used in conjunction with the native-code compiler "ocamlopt", -takes its arguments directly. For instance, here are the two C -functions for the 7-argument primitive "Nat.add_nat": -\begin{verbatim} -CAMLprim value add_nat_native(value nat1, value ofs1, value len1, - value nat2, value ofs2, value len2, - value carry_in) -{ - ... -} -CAMLprim value add_nat_bytecode(value * argv, int argn) -{ - return add_nat_native(argv[0], argv[1], argv[2], argv[3], - argv[4], argv[5], argv[6]); -} -\end{verbatim} -The names of the two C functions must be given in the primitive -declaration, as follows: -\begin{alltt} - external \var{name} : \var{type} = - \var{bytecode-C-function-name} \var{native-code-C-function-name} -\end{alltt} -For instance, in the case of "add_nat", the declaration is: -\begin{verbatim} - external add_nat: nat -> int -> int -> nat -> int -> int -> int -> int - = "add_nat_bytecode" "add_nat_native" -\end{verbatim} - -Implementing a user primitive is actually two separate tasks: on the -one hand, decoding the arguments to extract C values from the given -OCaml values, and encoding the return value as an OCaml -value; on the other hand, actually computing the result from the arguments. -Except for very simple primitives, it is often preferable to have two -distinct C functions to implement these two tasks. The first function -actually implements the primitive, taking native C values as -arguments and returning a native C value. The second function, -often called the ``stub code'', is a simple wrapper around the first -function that converts its arguments from OCaml values to C values, -call the first function, and convert the returned C value to OCaml -value. For instance, here is the stub code for the "input" -primitive: -\begin{verbatim} -CAMLprim value input(value channel, value buffer, value offset, value length) -{ - return Val_long(getblock((struct channel *) channel, - &Byte(buffer, Long_val(offset)), - Long_val(length))); -} -\end{verbatim} -(Here, "Val_long", "Long_val" and so on are conversion macros for the -type "value", that will be described later. The "CAMLprim" macro -expands to the required compiler directives to ensure that the -function is exported and accessible from OCaml.) -The hard work is performed by the function "getblock", which is -declared as: -\begin{verbatim} -long getblock(struct channel * channel, char * p, long n) -{ - ... -} -\end{verbatim} - -To write C code that operates on OCaml values, the following -include files are provided: -\begin{tableau}{|l|p{12cm}|}{Include file}{Provides} -\entree{"caml/mlvalues.h"}{definition of the "value" type, and conversion -macros} -\entree{"caml/alloc.h"}{allocation functions (to create structured OCaml -objects)} -\entree{"caml/memory.h"}{miscellaneous memory-related functions -and macros (for GC interface, in-place modification of structures, etc).} -\entree{"caml/fail.h"}{functions for raising exceptions -(see section~\ref{ss:c-exceptions})} -\entree{"caml/callback.h"}{callback from C to OCaml (see -section~\ref{s:c-callback}).} -\entree{"caml/custom.h"}{operations on custom blocks (see -section~\ref{s:c-custom}).} -\entree{"caml/intext.h"}{operations for writing user-defined -serialization and deserialization functions for custom blocks -(see section~\ref{s:c-custom}).} -\entree{"caml/threads.h"}{operations for interfacing in the presence - of multiple threads (see section~\ref{s:C-multithreading}).} -\end{tableau} -Before including any of these files, you should define the "CAML_NAME_SPACE" -macro. For instance, -\begin{verbatim} -#define CAML_NAME_SPACE -#include "caml/mlvalues.h" -#include "caml/fail.h" -\end{verbatim} -These files reside in the "caml/" subdirectory of the OCaml -standard library directory, which is returned by the command -"ocamlc -where" (usually "/usr/local/lib/ocaml" or "/usr/lib/ocaml"). - -{\bf Note:} -Including the header files without first defining "CAML_NAME_SPACE" -introduces in scope short names for most functions. -Those short names are deprecated, and may be removed in the future -because they usually produce clashes with names defined by other -C libraries. - -\subsection{ss:staticlink-c-code}{Statically linking C code with OCaml code} - -The OCaml runtime system comprises three main parts: the bytecode -interpreter, the memory manager, and a set of C functions that -implement the primitive operations. Some bytecode instructions are -provided to call these C functions, designated by their offset in a -table of functions (the table of primitives). - -In the default mode, the OCaml linker produces bytecode for the -standard runtime system, with a standard set of primitives. References -to primitives that are not in this standard set result in the -``unavailable C primitive'' error. (Unless dynamic loading of C -libraries is supported -- see section~\ref{ss:dynlink-c-code} below.) - -In the ``custom runtime'' mode, the OCaml linker scans the -object files and determines the set of required primitives. Then, it -builds a suitable runtime system, by calling the native code linker with: -\begin{itemize} -\item the table of the required primitives; -\item a library that provides the bytecode interpreter, the -memory manager, and the standard primitives; -\item libraries and object code files (".o" files) mentioned on the -command line for the OCaml linker, that provide implementations -for the user's primitives. -\end{itemize} -This builds a runtime system with the required primitives. The OCaml -linker generates bytecode for this custom runtime system. The -bytecode is appended to the end of the custom runtime system, so that -it will be automatically executed when the output file (custom -runtime + bytecode) is launched. - -To link in ``custom runtime'' mode, execute the "ocamlc" command with: -\begin{itemize} -\item the "-custom" option; -\item the names of the desired OCaml object files (".cmo" and ".cma" files) ; -\item the names of the C object files and libraries (".o" and ".a" -files) that implement the required primitives. Under Unix and Windows, -a library named "lib"\var{name}".a" (respectively, ".lib") residing in one of -the standard library directories can also be specified as "-cclib -l"\var{name}. -\end{itemize} - -If you are using the native-code compiler "ocamlopt", the "-custom" -flag is not needed, as the final linking phase of "ocamlopt" always -builds a standalone executable. To build a mixed OCaml/C executable, -execute the "ocamlopt" command with: -\begin{itemize} -\item the names of the desired OCaml native object files (".cmx" and -".cmxa" files); -\item the names of the C object files and libraries (".o", ".a", -".so" or ".dll" files) that implement the required primitives. -\end{itemize} - -Starting with Objective Caml 3.00, it is possible to record the -"-custom" option as well as the names of C libraries in an OCaml -library file ".cma" or ".cmxa". For instance, consider an OCaml library -"mylib.cma", built from the OCaml object files "a.cmo" and "b.cmo", -which reference C code in "libmylib.a". If the library is -built as follows: -\begin{alltt} - ocamlc -a -o mylib.cma -custom a.cmo b.cmo -cclib -lmylib -\end{alltt} -users of the library can simply link with "mylib.cma": -\begin{alltt} - ocamlc -o myprog mylib.cma ... -\end{alltt} -and the system will automatically add the "-custom" and "-cclib --lmylib" options, achieving the same effect as -\begin{alltt} - ocamlc -o myprog -custom a.cmo b.cmo ... -cclib -lmylib -\end{alltt} -The alternative is of course to build the library without extra -options: -\begin{alltt} - ocamlc -a -o mylib.cma a.cmo b.cmo -\end{alltt} -and then ask users to provide the "-custom" and "-cclib -lmylib" -options themselves at link-time: -\begin{alltt} - ocamlc -o myprog -custom mylib.cma ... -cclib -lmylib -\end{alltt} -The former alternative is more convenient for the final users of the -library, however. - -\subsection{ss:dynlink-c-code}{Dynamically linking C code with OCaml code} - -Starting with Objective Caml 3.03, an alternative to static linking of C code -using the "-custom" code is provided. In this mode, the OCaml linker -generates a pure bytecode executable (no embedded custom runtime -system) that simply records the names of dynamically-loaded libraries -containing the C code. The standard OCaml runtime system "ocamlrun" -then loads dynamically these libraries, and resolves references to the -required primitives, before executing the bytecode. - -This facility is currently available on all platforms supported by -OCaml except Cygwin 64 bits. - -To dynamically link C code with OCaml code, the C code must first be -compiled into a shared library (under Unix) or DLL (under Windows). -This involves 1- compiling the C files with appropriate C compiler -flags for producing position-independent code (when required by the -operating system), and 2- building a -shared library from the resulting object files. The resulting shared -library or DLL file must be installed in a place where "ocamlrun" can -find it later at program start-up time (see -section~\ref{s:ocamlrun-dllpath}). -Finally (step 3), execute the "ocamlc" command with -\begin{itemize} -\item the names of the desired OCaml object files (".cmo" and ".cma" files) ; -\item the names of the C shared libraries (".so" or ".dll" files) that -implement the required primitives. Under Unix and Windows, -a library named "dll"\var{name}".so" (respectively, ".dll") residing -in one of the standard library directories can also be specified as -"-dllib -l"\var{name}. -\end{itemize} -Do {\em not} set the "-custom" flag, otherwise you're back to static linking -as described in section~\ref{ss:staticlink-c-code}. -The "ocamlmklib" tool (see section~\ref{s:ocamlmklib}) -automates steps 2 and 3. - -As in the case of static linking, it is possible (and recommended) to -record the names of C libraries in an OCaml ".cma" library archive. -Consider again an OCaml library -"mylib.cma", built from the OCaml object files "a.cmo" and "b.cmo", -which reference C code in "dllmylib.so". If the library is -built as follows: -\begin{alltt} - ocamlc -a -o mylib.cma a.cmo b.cmo -dllib -lmylib -\end{alltt} -users of the library can simply link with "mylib.cma": -\begin{alltt} - ocamlc -o myprog mylib.cma ... -\end{alltt} -and the system will automatically add the "-dllib -lmylib" option, -achieving the same effect as -\begin{alltt} - ocamlc -o myprog a.cmo b.cmo ... -dllib -lmylib -\end{alltt} -Using this mechanism, users of the library "mylib.cma" do not need to -known that it references C code, nor whether this C code must be -statically linked (using "-custom") or dynamically linked. - -\subsection{ss:c-static-vs-dynamic}{Choosing between static linking and dynamic linking} - -After having described two different ways of linking C code with OCaml -code, we now review the pros and cons of each, to help developers of -mixed OCaml/C libraries decide. - -The main advantage of dynamic linking is that it preserves the -platform-independence of bytecode executables. That is, the bytecode -executable contains no machine code, and can therefore be compiled on -platform $A$ and executed on other platforms $B$, $C$, \ldots, as long -as the required shared libraries are available on all these -platforms. In contrast, executables generated by "ocamlc -custom" run -only on the platform on which they were created, because they embark a -custom-tailored runtime system specific to that platform. In -addition, dynamic linking results in smaller executables. - -Another advantage of dynamic linking is that the final users of the -library do not need to have a C compiler, C linker, and C runtime -libraries installed on their machines. This is no big deal under -Unix and Cygwin, but many Windows users are reluctant to install -Microsoft Visual C just to be able to do "ocamlc -custom". - -There are two drawbacks to dynamic linking. The first is that the -resulting executable is not stand-alone: it requires the shared -libraries, as well as "ocamlrun", to be installed on the machine -executing the code. If you wish to distribute a stand-alone -executable, it is better to link it statically, using "ocamlc -custom --ccopt -static" or "ocamlopt -ccopt -static". Dynamic linking also -raises the ``DLL hell'' problem: some care must be taken to ensure -that the right versions of the shared libraries are found at start-up -time. - -The second drawback of dynamic linking is that it complicates the -construction of the library. The C compiler and linker flags to -compile to position-independent code and build a shared library vary -wildly between different Unix systems. Also, dynamic linking is not -supported on all Unix systems, requiring a fall-back case to static -linking in the Makefile for the library. The "ocamlmklib" command -(see section~\ref{s:ocamlmklib}) tries to hide some of these system -dependencies. - -In conclusion: dynamic linking is highly recommended under the native -Windows port, because there are no portability problems and it is much -more convenient for the end users. Under Unix, dynamic linking should -be considered for mature, frequently used libraries because it -enhances platform-independence of bytecode executables. For new or -rarely-used libraries, static linking is much simpler to set up in a -portable way. - -\subsection{ss:custom-runtime}{Building standalone custom runtime systems} - -It is sometimes inconvenient to build a custom runtime system each -time OCaml code is linked with C libraries, like "ocamlc -custom" does. -For one thing, the building of the runtime system is slow on some -systems (that have bad linkers or slow remote file systems); for -another thing, the platform-independence of bytecode files is lost, -forcing to perform one "ocamlc -custom" link per platform of interest. - -An alternative to "ocamlc -custom" is to build separately a custom -runtime system integrating the desired C libraries, then generate -``pure'' bytecode executables (not containing their own runtime -system) that can run on this custom runtime. This is achieved by the -"-make-runtime" and "-use-runtime" flags to "ocamlc". For example, -to build a custom runtime system integrating the C parts of the -``Unix'' and ``Threads'' libraries, do: -\begin{verbatim} - ocamlc -make-runtime -o /home/me/ocamlunixrun unix.cma threads.cma -\end{verbatim} -To generate a bytecode executable that runs on this runtime system, -do: -\begin{alltt} - ocamlc -use-runtime /home/me/ocamlunixrun -o myprog \char92 - unix.cma threads.cma {\it{your .cmo and .cma files}} -\end{alltt} -The bytecode executable "myprog" can then be launched as usual: -"myprog" \var{args} or "/home/me/ocamlunixrun myprog" \var{args}. - -Notice that the bytecode libraries "unix.cma" and "threads.cma" must -be given twice: when building the runtime system (so that "ocamlc" -knows which C primitives are required) and also when building the -bytecode executable (so that the bytecode from "unix.cma" and -"threads.cma" is actually linked in). - -\section{s:c-value}{The \texttt{value} type} - -All OCaml objects are represented by the C type "value", -defined in the include file "caml/mlvalues.h", along with macros to -manipulate values of that type. An object of type "value" is either: -\begin{itemize} -\item an unboxed integer; -\item or a pointer to a block inside the heap, -allocated through one of the \verb"caml_alloc_*" functions described -in section~\ref{ss:c-block-allocation}. -\end{itemize} - -\subsection{ss:c-int}{Integer values} - -Integer values encode 63-bit signed integers (31-bit on 32-bit -architectures). They are unboxed (unallocated). - -\subsection{ss:c-blocks}{Blocks} - -Blocks in the heap are garbage-collected, and therefore have strict -structure constraints. Each block includes a header containing the -size of the block (in words), and the tag of the block. -The tag governs how the contents of the blocks are structured. A tag -lower than "No_scan_tag" indicates a structured block, containing -well-formed values, which is recursively traversed by the garbage -collector. A tag greater than or equal to "No_scan_tag" indicates a -raw block, whose contents are not scanned by the garbage collector. -For the benefit of ad-hoc polymorphic primitives such as equality and -structured input-output, structured and raw blocks are further -classified according to their tags as follows: -\begin{tableau}{|l|p{10cm}|}{Tag}{Contents of the block} -\entree{0 to $\hbox{"No_scan_tag"}-1$}{A structured block (an array of -OCaml objects). Each field is a "value".} -\entree{"Closure_tag"}{A closure representing a functional value. The first -word is a pointer to a piece of code, the remaining words are -"value" containing the environment.} -\entree{"String_tag"}{A character string or a byte sequence.} -\entree{"Double_tag"}{A double-precision floating-point number.} -\entree{"Double_array_tag"}{An array or record of double-precision -floating-point numbers.} -\entree{"Abstract_tag"}{A block representing an abstract datatype.} -\entree{"Custom_tag"}{A block representing an abstract datatype - with user-defined finalization, comparison, hashing, - serialization and deserialization functions attached.} -\end{tableau} - -\subsection{ss:c-outside-head}{Pointers outside the heap} - -In earlier versions of OCaml, it was possible to use -word-aligned pointers to addresses outside the heap as OCaml values, -just by casting the pointer to type "value". Starting with OCaml -4.11, this usage is deprecated and will stop being supported in OCaml 5.00. - -A correct way to manipulate pointers to out-of-heap blocks from -OCaml is to store those pointers in OCaml blocks with tag -"Abstract_tag" or "Custom_tag", then use the blocks as the OCaml -values. - -Here is an example of encapsulation of out-of-heap pointers of C type -"ty *" inside "Abstract_tag" blocks. Section~\ref{s:c-intf-example} -gives a more complete example using "Custom_tag" blocks. -\begin{verbatim} -/* Create an OCaml value encapsulating the pointer p */ -static value val_of_typtr(ty * p) -{ - value v = caml_alloc(1, Abstract_tag); - *((ty **) Data_abstract_val(v)) = p; - return v; -} - -/* Extract the pointer encapsulated in the given OCaml value */ -static ty * typtr_of_val(value v) -{ - return *((ty **) Data_abstract_val(v)); -} -\end{verbatim} -Alternatively, out-of-heap pointers can be treated as ``native'' -integers, that is, boxed 32-bit integers on a 32-bit platform and -boxed 64-bit integers on a 64-bit platform. -\begin{verbatim} -/* Create an OCaml value encapsulating the pointer p */ -static value val_of_typtr(ty * p) -{ - return caml_copy_nativeint((intnat) p); -} - -/* Extract the pointer encapsulated in the given OCaml value */ -static ty * typtr_of_val(value v) -{ - return (ty *) Nativeint_val(v); -} -\end{verbatim} -For pointers that are at least 2-aligned (the low bit is guaranteed to -be zero), we have yet another valid representation as an OCaml tagged -integer. -\begin{verbatim} -/* Create an OCaml value encapsulating the pointer p */ -static value val_of_typtr(ty * p) -{ - assert (((uintptr_t) p & 1) == 0); /* check correct alignment */ - return (value) p | 1; -} - -/* Extract the pointer encapsulated in the given OCaml value */ -static ty * typtr_of_val(value v) -{ - return (ty *) (v & ~1); -} -\end{verbatim} - - -\section{s:c-ocaml-datatype-repr}{Representation of OCaml data types} - -This section describes how OCaml data types are encoded in the -"value" type. - -\subsection{ss:c-atomic}{Atomic types} - -\begin{tableau}{|l|l|}{OCaml type}{Encoding} -\entree{"int"}{Unboxed integer values.} -\entree{"char"}{Unboxed integer values (ASCII code).} -\entree{"float"}{Blocks with tag "Double_tag".} -\entree{"bytes"}{Blocks with tag "String_tag".} -\entree{"string"}{Blocks with tag "String_tag".} -\entree{"int32"}{Blocks with tag "Custom_tag".} -\entree{"int64"}{Blocks with tag "Custom_tag".} -\entree{"nativeint"}{Blocks with tag "Custom_tag".} -\end{tableau} - -\subsection{ss:c-tuples-and-records}{Tuples and records} - -Tuples are represented by pointers to blocks, with tag~0. - -Records are also represented by zero-tagged blocks. The ordering of -labels in the record type declaration determines the layout of -the record fields: the value associated to the label -declared first is stored in field~0 of the block, the value associated -to the second label goes in field~1, and so on. - -As an optimization, records whose fields all have static type "float" -are represented as arrays of floating-point numbers, with tag -"Double_array_tag". (See the section below on arrays.) - -As another optimization, unboxable record types are represented -specially; unboxable record types are the immutable record types that -have only one field. An unboxable type will be represented in one of -two ways: boxed or unboxed. Boxed record types are represented as -described above (by a block with tag 0 or "Double_array_tag"). An -unboxed record type is represented directly by the value of its field -(i.e. there is no block to represent the record itself). - -The representation is chosen according to the following, in decreasing -order of priority: -\begin{itemize} -\item An attribute ("[\@\@boxed]" or "[\@\@unboxed]") on the type declaration. -\item A compiler option ("-unboxed-types" or "-no-unboxed-types"). -\item The default representation. In the present version of OCaml, the -default is the boxed representation. -\end{itemize} - -\subsection{ss:c-arrays}{Arrays} - -Arrays of integers and pointers are represented like tuples, -that is, as pointers to blocks tagged~0. They are accessed with the -"Field" macro for reading and the "caml_modify" function for writing. - -Arrays of floating-point numbers (type "float array") -have a special, unboxed, more efficient representation. -These arrays are represented by pointers to blocks with tag -"Double_array_tag". They should be accessed with the "Double_field" -and "Store_double_field" macros. - -\subsection{ss:c-concrete-datatypes}{Concrete data types} - -Constructed terms are represented either by unboxed integers (for -constant constructors) or by blocks whose tag encode the constructor -(for non-constant constructors). The constant constructors and the -non-constant constructors for a given concrete type are numbered -separately, starting from 0, in the order in which they appear in the -concrete type declaration. A constant constructor is represented by -the unboxed integer equal to its constructor number. A non-constant -constructor declared with $n$ arguments is represented by -a block of size $n$, tagged with the constructor number; the $n$ -fields contain its arguments. Example: - -\begin{tableau}{|l|p{8cm}|}{Constructed term}{Representation} -\entree{"()"}{"Val_int(0)"} -\entree{"false"}{"Val_int(0)"} -\entree{"true"}{"Val_int(1)"} -\entree{"[]"}{"Val_int(0)"} -\entree{"h::t"}{Block with size = 2 and tag = 0; first field -contains "h", second field "t".} -\end{tableau} - -As a convenience, "caml/mlvalues.h" defines the macros "Val_unit", -"Val_false" and "Val_true" to refer to "()", "false" and "true". - -The following example illustrates the assignment of -integers and block tags to constructors: -\begin{verbatim} -type t = - | A (* First constant constructor -> integer "Val_int(0)" *) - | B of string (* First non-constant constructor -> block with tag 0 *) - | C (* Second constant constructor -> integer "Val_int(1)" *) - | D of bool (* Second non-constant constructor -> block with tag 1 *) - | E of t * t (* Third non-constant constructor -> block with tag 2 *) -\end{verbatim} - - -As an optimization, unboxable concrete data types are represented -specially; a concrete data type is unboxable if it has exactly one -constructor and this constructor has exactly one argument. Unboxable -concrete data types are represented in the same ways as unboxable -record types: see the description in -section~\ref{ss:c-tuples-and-records}. - -\subsection{ss:c-objects}{Objects} - -Objects are represented as blocks with tag "Object_tag". The first -field of the block refers to the object's class and associated method -suite, in a format that cannot easily be exploited from C. The second -field contains a unique object ID, used for comparisons. The remaining -fields of the object contain the values of the instance variables of -the object. It is unsafe to access directly instance variables, as the -type system provides no guarantee about the instance variables -contained by an object. -% Instance variables are stored in the order in which they -% appear in the class definition (taking inherited classes into -% account). - -One may extract a public method from an object using the C function -"caml_get_public_method" (declared in "".) -Since public method tags are hashed in the same way as variant tags, -and methods are functions taking self as first argument, if you want -to do the method call "foo#bar" from the C side, you should call: -\begin{verbatim} - callback(caml_get_public_method(foo, hash_variant("bar")), foo); -\end{verbatim} - -\subsection{ss:c-polyvar}{Polymorphic variants} - -Like constructed terms, polymorphic variant values are represented either -as integers (for polymorphic variants without argument), or as blocks -(for polymorphic variants with an argument). Unlike constructed -terms, variant constructors are not numbered starting from 0, but -identified by a hash value (an OCaml integer), as computed by the C function -"hash_variant" (declared in ""): -the hash value for a variant constructor named, say, "VConstr" -is "hash_variant(\"VConstr\")". - -The variant value "`VConstr" is represented by -"hash_variant(\"VConstr\")". The variant value "`VConstr("\var{v}")" is -represented by a block of size 2 and tag 0, with field number 0 -containing "hash_variant(\"VConstr\")" and field number 1 containing -\var{v}. - -Unlike constructed values, polymorphic variant values taking several -arguments are not flattened. -That is, "`VConstr("\var{v}", "\var{w}")" is represented by a block -of size 2, whose field number 1 contains the representation of the -pair "("\var{v}", "\var{w}")", rather than a block of size 3 -containing \var{v} and \var{w} in fields 1 and 2. - -\section{s:c-ops-on-values}{Operations on values} - -\subsection{ss:c-kind-tests}{Kind tests} - -\begin{itemize} -\item "Is_long("\var{v}")" is true if value \var{v} is an immediate integer, -false otherwise -\item "Is_block("\var{v}")" is true if value \var{v} is a pointer to a block, -and false if it is an immediate integer. -\item "Is_none("\var{v}")" is true if value \var{v} is "None". -\item "Is_some("\var{v}")" is true if value \var{v} (assumed to be of option -type) corresponds to the "Some" constructor. -\end{itemize} - -\subsection{ss:c-int-ops}{Operations on integers} - -\begin{itemize} -\item "Val_long("\var{l}")" returns the value encoding the "long int" \var{l}. -\item "Long_val("\var{v}")" returns the "long int" encoded in value \var{v}. -\item "Val_int("\var{i}")" returns the value encoding the "int" \var{i}. -\item "Int_val("\var{v}")" returns the "int" encoded in value \var{v}. -\item "Val_bool("\var{x}")" returns the OCaml boolean representing the -truth value of the C integer \var{x}. -\item "Bool_val("\var{v}")" returns 0 if \var{v} is the OCaml boolean -"false", 1 if \var{v} is "true". -\item "Val_true", "Val_false" represent the OCaml booleans "true" and "false". -\item "Val_none" represents the OCaml value "None". -\end{itemize} - -\subsection{ss:c-block-access}{Accessing blocks} - -\begin{itemize} -\item "Wosize_val("\var{v}")" returns the size of the block \var{v}, in words, -excluding the header. -\item "Tag_val("\var{v}")" returns the tag of the block \var{v}. -\item "Field("\var{v}", "\var{n}")" returns the value contained in the -$n\th$ field of the structured block \var{v}. Fields are numbered from 0 to -$\hbox{"Wosize_val"}(v)-1$. -\item "Store_field("\var{b}", "\var{n}", "\var{v}")" stores the value -\var{v} in the field number \var{n} of value \var{b}, which must be a -structured block. -\item "Code_val("\var{v}")" returns the code part of the closure \var{v}. -\item "caml_string_length("\var{v}")" returns the length (number of bytes) -of the string or byte sequence \var{v}. -\item "Byte("\var{v}", "\var{n}")" returns the $n\th$ byte of the string -or byte sequence \var{v}, with type "char". Bytes are numbered from 0 to -$\hbox{"string_length"}(v)-1$. -\item "Byte_u("\var{v}", "\var{n}")" returns the $n\th$ byte of the string -or byte sequence \var{v}, with type "unsigned char". Bytes are -numbered from 0 to $\hbox{"string_length"}(v)-1$. -\item "String_val("\var{v}")" returns a pointer to the first byte of the string -\var{v}, with type "char *" or, when OCaml is configured with -"-force-safe-string", with type "const char *". -This pointer is a valid C string: there is a null byte after the last -byte in the string. However, OCaml strings can contain embedded null bytes, -which will confuse the usual C functions over strings. -\item "Bytes_val("\var{v}")" returns a pointer to the first byte of the -byte sequence \var{v}, with type "unsigned char *". -\item "Double_val("\var{v}")" returns the floating-point number contained in -value \var{v}, with type "double". -\item "Double_field("\var{v}", "\var{n}")" returns -the $n\th$ element of the array of floating-point numbers \var{v} (a -block tagged "Double_array_tag"). -\item "Store_double_field("\var{v}", "\var{n}", -"\var{d}")" stores the double precision floating-point number \var{d} -in the $n\th$ element of the array of floating-point numbers \var{v}. -\item "Data_custom_val("\var{v}")" returns a pointer to the data part -of the custom block \var{v}. This pointer has type "void *" and must -be cast to the type of the data contained in the custom block. -\item "Int32_val("\var{v}")" returns the 32-bit integer contained -in the "int32" \var{v}. -\item "Int64_val("\var{v}")" returns the 64-bit integer contained -in the "int64" \var{v}. -\item "Nativeint_val("\var{v}")" returns the long integer contained -in the "nativeint" \var{v}. -\item "caml_field_unboxed("\var{v}")" returns the value of the field -of a value \var{v} of any unboxed type (record or concrete data type). -\item "caml_field_boxed("\var{v}")" returns the value of the field -of a value \var{v} of any boxed type (record or concrete data type). -\item "caml_field_unboxable("\var{v}")" calls either -"caml_field_unboxed" or "caml_field_boxed" according to the default -representation of unboxable types in the current version of OCaml. -\item "Some_val("\var{v}")" returns the argument "\var{x}" of a value \var{v} of -the form "Some("\var{x}")". -\end{itemize} -The expressions "Field("\var{v}", "\var{n}")", -"Byte("\var{v}", "\var{n}")" and -"Byte_u("\var{v}", "\var{n}")" -are valid l-values. Hence, they can be assigned to, resulting in an -in-place modification of value \var{v}. -Assigning directly to "Field("\var{v}", "\var{n}")" must -be done with care to avoid confusing the garbage collector (see -below). - -\subsection{ss:c-block-allocation}{Allocating blocks} - -\subsubsection{sss:c-simple-allocation}{Simple interface} - -\begin{itemize} -\item -"Atom("\var{t}")" returns an ``atom'' (zero-sized block) with tag \var{t}. -Zero-sized blocks are preallocated outside of the heap. It is -incorrect to try and allocate a zero-sized block using the functions below. -For instance, "Atom(0)" represents the empty array. -\item -"caml_alloc("\var{n}", "\var{t}")" returns a fresh block of size \var{n} -with tag \var{t}. If \var{t} is less than "No_scan_tag", then the -fields of the block are initialized with a valid value in order to -satisfy the GC constraints. -\item -"caml_alloc_tuple("\var{n}")" returns a fresh block of size -\var{n} words, with tag 0. -\item -"caml_alloc_string("\var{n}")" returns a byte sequence (or string) value of -length \var{n} bytes. The sequence initially contains uninitialized bytes. -\item -"caml_alloc_initialized_string("\var{n}", "\var{p}")" returns a byte sequence -(or string) value of length \var{n} bytes. The value is initialized from the -\var{n} bytes starting at address \var{p}. -\item -"caml_copy_string("\var{s}")" returns a string or byte sequence value -containing a copy of the null-terminated C string \var{s} (a "char *"). -\item -"caml_copy_double("\var{d}")" returns a floating-point value initialized -with the "double" \var{d}. -\item -"caml_copy_int32("\var{i}")", "caml_copy_int64("\var{i}")" and -"caml_copy_nativeint("\var{i}")" return a value of OCaml type "int32", -"int64" and "nativeint", respectively, initialized with the integer -\var{i}. -\item -"caml_alloc_array("\var{f}", "\var{a}")" allocates an array of values, calling -function \var{f} over each element of the input array \var{a} to transform it -into a value. The array \var{a} is an array of pointers terminated by the -null pointer. The function \var{f} receives each pointer as argument, and -returns a value. The zero-tagged block returned by -"alloc_array("\var{f}", "\var{a}")" is filled with the values returned by the -successive calls to \var{f}. (This function must not be used to build -an array of floating-point numbers.) -\item -"caml_copy_string_array("\var{p}")" allocates an array of strings or byte -sequences, copied from the pointer to a string array \var{p} -(a "char **"). \var{p} must be NULL-terminated. -\item "caml_alloc_float_array("\var{n}")" allocates an array of floating point - numbers of size \var{n}. The array initially contains uninitialized values. -\item "caml_alloc_unboxed("\var{v}")" returns the value (of any unboxed -type) whose field is the value \var{v}. -\item "caml_alloc_boxed("\var{v}")" allocates and returns a value (of -any boxed type) whose field is the value \var{v}. -\item "caml_alloc_unboxable("\var{v}")" calls either -"caml_alloc_unboxed" or "caml_alloc_boxed" according to the default -representation of unboxable types in the current version of OCaml. -\item "caml_alloc_some("\var{v}")" allocates a block representing -"Some("\var{v}")". -\end{itemize} - -\subsubsection{sss:c-low-level-alloc}{Low-level interface} - -The following functions are slightly more efficient than "caml_alloc", but -also much more difficult to use. - -From the standpoint of the allocation functions, blocks are divided -according to their size as zero-sized blocks, small blocks (with size -less than or equal to \verb"Max_young_wosize"), and large blocks (with -size greater than \verb"Max_young_wosize"). The constant -\verb"Max_young_wosize" is declared in the include file "mlvalues.h". It -is guaranteed to be at least 64 (words), so that any block with -constant size less than or equal to 64 can be assumed to be small. For -blocks whose size is computed at run-time, the size must be compared -against \verb"Max_young_wosize" to determine the correct allocation procedure. - -\begin{itemize} -\item -"caml_alloc_small("\var{n}", "\var{t}")" returns a fresh small block of size -$n \leq \hbox{"Max_young_wosize"}$ words, with tag \var{t}. -If this block is a structured block (i.e. if $t < \hbox{"No_scan_tag"}$), then -the fields of the block (initially containing garbage) must be initialized -with legal values (using direct assignment to the fields of the block) -before the next allocation. -\item -"caml_alloc_shr("\var{n}", "\var{t}")" returns a fresh block of size -\var{n}, with tag \var{t}. -The size of the block can be greater than \verb"Max_young_wosize". (It -can also be smaller, but in this case it is more efficient to call -"caml_alloc_small" instead of "caml_alloc_shr".) -If this block is a structured block (i.e. if $t < \hbox{"No_scan_tag"}$), then -the fields of the block (initially containing garbage) must be initialized -with legal values (using the "caml_initialize" function described below) -before the next allocation. -\end{itemize} - -\subsection{ss:c-exceptions}{Raising exceptions} - -Two functions are provided to raise two standard exceptions: -\begin{itemize} -\item "caml_failwith("\var{s}")", where \var{s} is a null-terminated C string (with -type \verb"char *"), raises exception "Failure" with argument \var{s}. -\item "caml_invalid_argument("\var{s}")", where \var{s} is a null-terminated C -string (with type \verb"char *"), raises exception "Invalid_argument" -with argument \var{s}. -\end{itemize} - -Raising arbitrary exceptions from C is more delicate: the -exception identifier is dynamically allocated by the OCaml program, and -therefore must be communicated to the C function using the -registration facility described below in section~\ref{ss:c-register-exn}. -Once the exception identifier is recovered in C, the following -functions actually raise the exception: -\begin{itemize} -\item "caml_raise_constant("\var{id}")" raises the exception \var{id} with -no argument; -\item "caml_raise_with_arg("\var{id}", "\var{v}")" raises the exception -\var{id} with the OCaml value \var{v} as argument; -\item "caml_raise_with_args("\var{id}", "\var{n}", "\var{v}")" -raises the exception \var{id} with the OCaml values -\var{v}"[0]", \ldots, \var{v}"["\var{n}"-1]" as arguments; -\item "caml_raise_with_string("\var{id}", "\var{s}")", where \var{s} is a -null-terminated C string, raises the exception \var{id} with a copy of -the C string \var{s} as argument. -\end{itemize} - -\section{s:c-gc-harmony}{Living in harmony with the garbage collector} - -Unused blocks in the heap are automatically reclaimed by the garbage -collector. This requires some cooperation from C code that -manipulates heap-allocated blocks. - -\subsection{ss:c-simple-gc-harmony}{Simple interface} - -All the macros described in this section are declared in the -"memory.h" header file. - -\begin{gcrule} -A function that has parameters or local variables of type "value" must -begin with a call to one of the "CAMLparam" macros and return with -"CAMLreturn", "CAMLreturn0", or "CAMLreturnT". In particular, "CAMLlocal" -and "CAMLxparam" can only be called \emph{after} "CAMLparam". -\end{gcrule} - -There are six "CAMLparam" macros: "CAMLparam0" to "CAMLparam5", which -take zero to five arguments respectively. If your function has no more -than 5 parameters of type "value", use the corresponding macros -with these parameters as arguments. If your function has more than 5 -parameters of type "value", use "CAMLparam5" with five of these -parameters, and use one or more calls to the "CAMLxparam" macros for -the remaining parameters ("CAMLxparam1" to "CAMLxparam5"). - -The macros "CAMLreturn", "CAMLreturn0", and "CAMLreturnT" are used to -replace the C -keyword "return". Every occurrence of "return x" must be replaced by -"CAMLreturn (x)" if "x" has type "value", or "CAMLreturnT (t, x)" -(where "t" is the type of "x"); every occurrence of "return" without -argument must be -replaced by "CAMLreturn0". If your C function is a procedure (i.e. if -it returns void), you must insert "CAMLreturn0" at the end (to replace -C's implicit "return"). - -\paragraph{Note:} some C compilers give bogus warnings about unused -variables "caml__dummy_xxx" at each use of "CAMLparam" and -"CAMLlocal". You should ignore them. - -\goodbreak - -Example: -\begin{verbatim} -void foo (value v1, value v2, value v3) -{ - CAMLparam3 (v1, v2, v3); - ... - CAMLreturn0; -} -\end{verbatim} - -\paragraph{Note:} if your function is a primitive with more than 5 arguments -for use with the byte-code runtime, its arguments are not "value"s and -must not be declared (they have types "value *" and "int"). - -\begin{gcrule} -Local variables of type "value" must be declared with one of the -"CAMLlocal" macros. Arrays of "value"s are declared with -"CAMLlocalN". These macros must be used at the beginning of the -function, not in a nested block. -\end{gcrule} - -The macros "CAMLlocal1" to "CAMLlocal5" declare and initialize one to -five local variables of type "value". The variable names are given as -arguments to the macros. "CAMLlocalN("\var{x}", "\var{n}")" declares -and initializes a local variable of type "value ["\var{n}"]". You can -use several calls to these macros if you have more than 5 local -variables. - -Example: -\begin{verbatim} -CAMLprim value bar (value v1, value v2, value v3) -{ - CAMLparam3 (v1, v2, v3); - CAMLlocal1 (result); - result = caml_alloc (3, 0); - ... - CAMLreturn (result); -} -\end{verbatim} - -\begin{gcrule} -Assignments to the fields of structured blocks must be done with the -"Store_field" macro (for normal blocks) or "Store_double_field" macro -(for arrays and records of floating-point numbers). Other assignments -must not use "Store_field" nor "Store_double_field". -\end{gcrule} - -"Store_field ("\var{b}", "\var{n}", "\var{v}")" stores the value -\var{v} in the field number \var{n} of value \var{b}, which must be a -block (i.e. "Is_block("\var{b}")" must be true). - -Example: -\begin{verbatim} -CAMLprim value bar (value v1, value v2, value v3) -{ - CAMLparam3 (v1, v2, v3); - CAMLlocal1 (result); - result = caml_alloc (3, 0); - Store_field (result, 0, v1); - Store_field (result, 1, v2); - Store_field (result, 2, v3); - CAMLreturn (result); -} -\end{verbatim} - -\paragraph{Warning:} The first argument of "Store_field" and -"Store_double_field" must be a variable declared by "CAMLparam*" or -a parameter declared by "CAMLlocal*" to ensure that a garbage -collection triggered by the evaluation of the other arguments will not -invalidate the first argument after it is computed. - -\paragraph{Use with CAMLlocalN:} Arrays of values declared using -"CAMLlocalN" must not be written to using "Store_field". -Use the normal C array syntax instead. - -\begin{gcrule} Global variables containing values must be registered -with the garbage collector using the "caml_register_global_root" function, -save that global variables and locations that will only ever contain OCaml -integers (and never pointers) do not have to be registered. - -The same is true for any memory location outside the OCaml heap that contains a -value and is not guaranteed to be reachable---for as long as it contains such -value---from either another registered global variable or location, local -variable declared with "CAMLlocal" or function parameter declared with -"CAMLparam". -\end{gcrule} - -Registration of a global variable "v" is achieved by calling -"caml_register_global_root(&v)" just before or just after a valid value is -stored in "v" for the first time; likewise, registration of an arbitrary -location "p" is achieved by calling "caml_register_global_root(p)". - -You must not call any of the OCaml runtime functions or macros between -registering and storing the value. Neither must you store anything in the -variable "v" (likewise, the location "p") that is not a valid value. - -The registration causes the contents of the variable or memory location to be -updated by the garbage collector whenever the value in such variable or location -is moved within the OCaml heap. In the presence of threads care must be taken to -ensure appropriate synchronisation with the OCaml runtime to avoid a race -condition against the garbage collector when reading or writing the value. (See -section -\ref{ss:parallel-execution-long-running-c-code}.) - -A registered global variable "v" can be un-registered by calling -"caml_remove_global_root(&v)". - -If the contents of the global variable "v" are seldom modified after -registration, better performance can be achieved by calling -"caml_register_generational_global_root(&v)" to register "v" (after -its initialization with a valid "value", but before any allocation or -call to the GC functions), -and "caml_remove_generational_global_root(&v)" to un-register it. In -this case, you must not modify the value of "v" directly, but you must -use "caml_modify_generational_global_root(&v,x)" to set it to "x". -The garbage collector takes advantage of the guarantee that "v" is not -modified between calls to "caml_modify_generational_global_root" to scan it -less often. This improves performance if the -modifications of "v" happen less often than minor collections. - -\paragraph{Note:} The "CAML" macros use identifiers (local variables, type -identifiers, structure tags) that start with "caml__". Do not use any -identifier starting with "caml__" in your programs. - -\subsection{ss:c-low-level-gc-harmony}{Low-level interface} - -% Il faudrait simplifier violemment ce qui suit. -% En gros, dire quand on n'a pas besoin de declarer les variables -% et dans quels cas on peut se passer de "Store_field". - -We now give the GC rules corresponding to the low-level allocation -functions "caml_alloc_small" and "caml_alloc_shr". You can ignore those rules -if you stick to the simplified allocation function "caml_alloc". - -\begin{gcrule} After a structured block (a block with tag less than -"No_scan_tag") is allocated with the low-level functions, all fields -of this block must be filled with well-formed values before the next -allocation operation. If the block has been allocated with -"caml_alloc_small", filling is performed by direct assignment to the fields -of the block: -\begin{alltt} - Field(\var{v}, \var{n}) = \nth{v}{n}; -\end{alltt} -If the block has been allocated with "caml_alloc_shr", filling is performed -through the "caml_initialize" function: -\begin{alltt} - caml_initialize(&Field(\var{v}, \var{n}), \nth{v}{n}); -\end{alltt} -\end{gcrule} - -The next allocation can trigger a garbage collection. The garbage -collector assumes that all structured blocks contain well-formed -values. Newly created blocks contain random data, which generally do -not represent well-formed values. - -If you really need to allocate before the fields can receive their -final value, first initialize with a constant value (e.g. -"Val_unit"), then allocate, then modify the fields with the correct -value (see rule~6). - -%% \begin{gcrule} Local variables and function parameters containing -%% values must be registered with the garbage collector (using the -%% "Begin_roots" and "End_roots" macros), if they are to survive a call -%% to an allocation function. -%% \end{gcrule} -%% -%% Registration is performed with the "Begin_roots" set of macros. -%% "Begin_roots1("\var{v}")" registers variable \var{v} with the garbage -%% collector. Generally, \var{v} will be a local variable or a -%% parameter of your function. It must be initialized to a valid value -%% (e.g. "Val_unit") before the first allocation. Likewise, -%% "Begin_roots2", \ldots, "Begin_roots5" -%% let you register up to 5 variables at the same time. "Begin_root" is -%% the same as "Begin_roots1". "Begin_roots_block("\var{ptr}","\var{size}")" -%% allows you to register an array of roots. \var{ptr} is a pointer to -%% the first element, and \var{size} is the number of elements in the -%% array. -%% -%% Once registered, each of your variables (or array element) has the -%% following properties: if it points to a heap-allocated block, this -%% block (and its contents) will not be reclaimed; moreover, if this -%% block is relocated by the garbage collector, the variable is updated -%% to point to the new location for the block. -%% -%% Each of the "Begin_roots" macros open a C block that must be closed -%% with a matching "End_roots" at the same nesting level. The block must -%% be exited normally (i.e. not with "return" or "goto"). However, the -%% roots are automatically un-registered if an OCaml exception is raised, -%% so you can exit the block with "failwith", "invalid_argument", or one -%% of the "raise" functions. -%% -%% {\bf Note:} The "Begin_roots" macros use a local variable and a -%% structure tag named "caml__roots_block". Do not use this identifier -%% in your programs. - -\begin{gcrule} Direct assignment to a field of a block, as in -\begin{alltt} - Field(\var{v}, \var{n}) = \var{w}; -\end{alltt} -is safe only if \var{v} is a block newly allocated by "caml_alloc_small"; -that is, if no allocation took place between the -allocation of \var{v} and the assignment to the field. In all other cases, -never assign directly. If the block has just been allocated by "caml_alloc_shr", -use "caml_initialize" to assign a value to a field for the first time: -\begin{alltt} - caml_initialize(&Field(\var{v}, \var{n}), \var{w}); -\end{alltt} -Otherwise, you are updating a field that previously contained a -well-formed value; then, call the "caml_modify" function: -\begin{alltt} - caml_modify(&Field(\var{v}, \var{n}), \var{w}); -\end{alltt} -\end{gcrule} - -To illustrate the rules above, here is a C function that builds and -returns a list containing the two integers given as parameters. -First, we write it using the simplified allocation functions: -\begin{verbatim} -value alloc_list_int(int i1, int i2) -{ - CAMLparam0 (); - CAMLlocal2 (result, r); - - r = caml_alloc(2, 0); /* Allocate a cons cell */ - Store_field(r, 0, Val_int(i2)); /* car = the integer i2 */ - Store_field(r, 1, Val_int(0)); /* cdr = the empty list [] */ - result = caml_alloc(2, 0); /* Allocate the other cons cell */ - Store_field(result, 0, Val_int(i1)); /* car = the integer i1 */ - Store_field(result, 1, r); /* cdr = the first cons cell */ - CAMLreturn (result); -} -\end{verbatim} -Here, the registering of "result" is not strictly needed, because no -allocation takes place after it gets its value, but it's easier and -safer to simply register all the local variables that have type "value". - -Here is the same function written using the low-level allocation -functions. We notice that the cons cells are small blocks and can be -allocated with "caml_alloc_small", and filled by direct assignments on -their fields. -\begin{verbatim} -value alloc_list_int(int i1, int i2) -{ - CAMLparam0 (); - CAMLlocal2 (result, r); - - r = caml_alloc_small(2, 0); /* Allocate a cons cell */ - Field(r, 0) = Val_int(i2); /* car = the integer i2 */ - Field(r, 1) = Val_int(0); /* cdr = the empty list [] */ - result = caml_alloc_small(2, 0); /* Allocate the other cons cell */ - Field(result, 0) = Val_int(i1); /* car = the integer i1 */ - Field(result, 1) = r; /* cdr = the first cons cell */ - CAMLreturn (result); -} -\end{verbatim} -In the two examples above, the list is built bottom-up. Here is an -alternate way, that proceeds top-down. It is less efficient, but -illustrates the use of "caml_modify". -\begin{verbatim} -value alloc_list_int(int i1, int i2) -{ - CAMLparam0 (); - CAMLlocal2 (tail, r); - - r = caml_alloc_small(2, 0); /* Allocate a cons cell */ - Field(r, 0) = Val_int(i1); /* car = the integer i1 */ - Field(r, 1) = Val_int(0); /* A dummy value - tail = caml_alloc_small(2, 0); /* Allocate the other cons cell */ - Field(tail, 0) = Val_int(i2); /* car = the integer i2 */ - Field(tail, 1) = Val_int(0); /* cdr = the empty list [] */ - caml_modify(&Field(r, 1), tail); /* cdr of the result = tail */ - CAMLreturn (r); -} -\end{verbatim} -It would be incorrect to perform -"Field(r, 1) = tail" directly, because the allocation of "tail" -has taken place since "r" was allocated. - - -\subsection{ss:c-process-pending-actions}{Pending actions and asynchronous exceptions} - -Since 4.10, allocation functions are guaranteed not to call any OCaml -callbacks from C, including finalisers and signal handlers, and delay -their execution instead. - -The function \verb"caml_process_pending_actions" from -"" executes any pending signal handlers and -finalisers, Memprof callbacks, and requested minor and major garbage -collections. In particular, it can raise asynchronous exceptions. It -is recommended to call it regularly at safe points inside long-running -non-blocking C code. - -The variant \verb"caml_process_pending_actions_exn" is provided, that -returns the exception instead of raising it directly into OCaml code. -Its result must be tested using {\tt Is_exception_result}, and -followed by {\tt Extract_exception} if appropriate. It is typically -used for clean up before re-raising: - -\begin{verbatim} - CAMLlocal1(exn); - ... - exn = caml_process_pending_actions_exn(); - if(Is_exception_result(exn)) { - exn = Extract_exception(exn); - ...cleanup... - caml_raise(exn); - } -\end{verbatim} - -Correct use of exceptional return, in particular in the presence of -garbage collection, is further detailed in Section~\ref{ss:c-callbacks}. - -\section{s:c-intf-example}{A complete example} - -This section outlines how the functions from the Unix "curses" library -can be made available to OCaml programs. First of all, here is -the interface "curses.ml" that declares the "curses" primitives and -data types: -\begin{verbatim} -(* File curses.ml -- declaration of primitives and data types *) -type window (* The type "window" remains abstract *) -external initscr: unit -> window = "caml_curses_initscr" -external endwin: unit -> unit = "caml_curses_endwin" -external refresh: unit -> unit = "caml_curses_refresh" -external wrefresh : window -> unit = "caml_curses_wrefresh" -external newwin: int -> int -> int -> int -> window = "caml_curses_newwin" -external addch: char -> unit = "caml_curses_addch" -external mvwaddch: window -> int -> int -> char -> unit = "caml_curses_mvwaddch" -external addstr: string -> unit = "caml_curses_addstr" -external mvwaddstr: window -> int -> int -> string -> unit - = "caml_curses_mvwaddstr" -(* lots more omitted *) -\end{verbatim} -To compile this interface: -\begin{verbatim} - ocamlc -c curses.ml -\end{verbatim} - -To implement these functions, we just have to provide the stub code; -the core functions are already implemented in the "curses" library. -The stub code file, "curses_stubs.c", looks like this: -\begin{verbatim} -/* File curses_stubs.c -- stub code for curses */ -#include -#define CAML_NAME_SPACE -#include -#include -#include -#include - -/* Encapsulation of opaque window handles (of type WINDOW *) - as OCaml custom blocks. */ - -static struct custom_operations curses_window_ops = { - "fr.inria.caml.curses_windows", - custom_finalize_default, - custom_compare_default, - custom_hash_default, - custom_serialize_default, - custom_deserialize_default, - custom_compare_ext_default, - custom_fixed_length_default -}; - -/* Accessing the WINDOW * part of an OCaml custom block */ -#define Window_val(v) (*((WINDOW **) Data_custom_val(v))) - -/* Allocating an OCaml custom block to hold the given WINDOW * */ -static value alloc_window(WINDOW * w) -{ - value v = caml_alloc_custom(&curses_window_ops, sizeof(WINDOW *), 0, 1); - Window_val(v) = w; - return v; -} - -CAMLprim value caml_curses_initscr(value unit) -{ - CAMLparam1 (unit); - CAMLreturn (alloc_window(initscr())); -} - -CAMLprim value caml_curses_endwin(value unit) -{ - CAMLparam1 (unit); - endwin(); - CAMLreturn (Val_unit); -} - -CAMLprim value caml_curses_refresh(value unit) -{ - CAMLparam1 (unit); - refresh(); - CAMLreturn (Val_unit); -} - -CAMLprim value caml_curses_wrefresh(value win) -{ - CAMLparam1 (win); - wrefresh(Window_val(win)); - CAMLreturn (Val_unit); -} - -CAMLprim value caml_curses_newwin(value nlines, value ncols, value x0, value y0) -{ - CAMLparam4 (nlines, ncols, x0, y0); - CAMLreturn (alloc_window(newwin(Int_val(nlines), Int_val(ncols), - Int_val(x0), Int_val(y0)))); -} - -CAMLprim value caml_curses_addch(value c) -{ - CAMLparam1 (c); - addch(Int_val(c)); /* Characters are encoded like integers */ - CAMLreturn (Val_unit); -} - -CAMLprim value caml_curses_mvwaddch(value win, value x, value y, value c) -{ - CAMLparam4 (win, x, y, c); - mvwaddch(Window_val(win), Int_val(x), Int_val(y), Int_val(c)); - CAMLreturn (Val_unit); -} - -CAMLprim value caml_curses_addstr(value s) -{ - CAMLparam1 (s); - addstr(String_val(s)); - CAMLreturn (Val_unit); -} - -CAMLprim value caml_curses_mvwaddstr(value win, value x, value y, value s) -{ - CAMLparam4 (win, x, y, s); - mvwaddstr(Window_val(win), Int_val(x), Int_val(y), String_val(s)); - CAMLreturn (Val_unit); -} - -/* This goes on for pages. */ -\end{verbatim} - -The file "curses_stubs.c" can be compiled with: -\begin{verbatim} - cc -c -I`ocamlc -where` curses_stubs.c -\end{verbatim} -or, even simpler, -\begin{verbatim} - ocamlc -c curses_stubs.c -\end{verbatim} -(When passed a ".c" file, the "ocamlc" command simply calls the C -compiler on that file, with the right "-I" option.) - -Now, here is a sample OCaml program "prog.ml" that uses the "curses" -module: -\begin{verbatim} -(* File prog.ml -- main program using curses *) -open Curses;; -let main_window = initscr () in -let small_window = newwin 10 5 20 10 in - mvwaddstr main_window 10 2 "Hello"; - mvwaddstr small_window 4 3 "world"; - refresh(); - Unix.sleep 5; - endwin() -\end{verbatim} -To compile and link this program, run: -\begin{verbatim} - ocamlc -custom -o prog unix.cma curses.cmo prog.ml curses_stubs.o -cclib -lcurses -\end{verbatim} -(On some machines, you may need to put -"-cclib -lcurses -cclib -ltermcap" or "-cclib -ltermcap" -instead of "-cclib -lcurses".) - -%% Note by Damien: when I launch the program, it only displays "Hello" -%% and not "world". Why? - -\section{s:c-callback}{Advanced topic: callbacks from C to OCaml} - -So far, we have described how to call C functions from OCaml. In this -section, we show how C functions can call OCaml functions, either as -callbacks (OCaml calls C which calls OCaml), or with the main program -written in C. - -\subsection{ss:c-callbacks}{Applying OCaml closures from C} - -C functions can apply OCaml function values (closures) to OCaml values. -The following functions are provided to perform the applications: -\begin{itemize} -\item "caml_callback("\var{f, a}")" applies the functional value \var{f} to -the value \var{a} and returns the value returned by~\var{f}. -\item "caml_callback2("\var{f, a, b}")" applies the functional value \var{f} -(which is assumed to be a curried OCaml function with two arguments) to -\var{a} and \var{b}. -\item "caml_callback3("\var{f, a, b, c}")" applies the functional value \var{f} -(a curried OCaml function with three arguments) to \var{a}, \var{b} and \var{c}. -\item "caml_callbackN("\var{f, n, args}")" applies the functional value \var{f} -to the \var{n} arguments contained in the array of values \var{args}. -\end{itemize} -If the function \var{f} does not return, but raises an exception that -escapes the scope of the application, then this exception is -propagated to the next enclosing OCaml code, skipping over the C -code. That is, if an OCaml function \var{f} calls a C function \var{g} that -calls back an OCaml function \var{h} that raises a stray exception, then the -execution of \var{g} is interrupted and the exception is propagated back -into \var{f}. - -If the C code wishes to catch exceptions escaping the OCaml function, -it can use the functions "caml_callback_exn", "caml_callback2_exn", -"caml_callback3_exn", "caml_callbackN_exn". These functions take the same -arguments as their non-"_exn" counterparts, but catch escaping -exceptions and return them to the C code. The return value \var{v} of the -"caml_callback*_exn" functions must be tested with the macro -"Is_exception_result("\var{v}")". If the macro returns ``false'', no -exception occurred, and \var{v} is the value returned by the OCaml -function. If "Is_exception_result("\var{v}")" returns ``true'', -an exception escaped, and its value (the exception descriptor) can be -recovered using "Extract_exception("\var{v}")". - -\paragraph{Warning:} If the OCaml function returned with an exception, -"Extract_exception" should be applied to the exception result prior -to calling a function that may trigger garbage collection. -Otherwise, if \var{v} is reachable during garbage collection, the runtime -can crash since \var{v} does not contain a valid value. - -Example: -\begin{verbatim} - CAMLprim value call_caml_f_ex(value closure, value arg) - { - CAMLparam2(closure, arg); - CAMLlocal2(res, tmp); - res = caml_callback_exn(closure, arg); - if(Is_exception_result(res)) { - res = Extract_exception(res); - tmp = caml_alloc(3, 0); /* Safe to allocate: res contains valid value. */ - ... - } - CAMLreturn (res); - } -\end{verbatim} - -\subsection{ss:c-closures}{Obtaining or registering OCaml closures for use in C functions} - -There are two ways to obtain OCaml function values (closures) to -be passed to the "callback" functions described above. One way is to -pass the OCaml function as an argument to a primitive function. For -example, if the OCaml code contains the declaration -\begin{verbatim} - external apply : ('a -> 'b) -> 'a -> 'b = "caml_apply" -\end{verbatim} -the corresponding C stub can be written as follows: -\begin{verbatim} - CAMLprim value caml_apply(value vf, value vx) - { - CAMLparam2(vf, vx); - CAMLlocal1(vy); - vy = caml_callback(vf, vx); - CAMLreturn(vy); - } -\end{verbatim} - -Another possibility is to use the registration mechanism provided by -OCaml. This registration mechanism enables OCaml code to register -OCaml functions under some global name, and C code to retrieve the -corresponding closure by this global name. - -On the OCaml side, registration is performed by evaluating -"Callback.register" \var{n} \var{v}. Here, \var{n} is the global name -(an arbitrary string) and \var{v} the OCaml value. For instance: -\begin{verbatim} - let f x = print_string "f is applied to "; print_int x; print_newline() - let _ = Callback.register "test function" f -\end{verbatim} - -On the C side, a pointer to the value registered under name \var{n} is -obtained by calling "caml_named_value("\var{n}")". The returned -pointer must then be dereferenced to recover the actual OCaml value. -If no value is registered under the name \var{n}, the null pointer is -returned. For example, here is a C wrapper that calls the OCaml function "f" -above: -\begin{verbatim} - void call_caml_f(int arg) - { - caml_callback(*caml_named_value("test function"), Val_int(arg)); - } -\end{verbatim} - -The pointer returned by "caml_named_value" is constant and can safely -be cached in a C variable to avoid repeated name lookups. The value -pointed to cannot be changed from C. However, it might change during -garbage collection, so must always be recomputed at the point of -use. Here is a more efficient variant of "call_caml_f" above that -calls "caml_named_value" only once: -\begin{verbatim} - void call_caml_f(int arg) - { - static const value * closure_f = NULL; - if (closure_f == NULL) { - /* First time around, look up by name */ - closure_f = caml_named_value("test function"); - } - caml_callback(*closure_f, Val_int(arg)); - } -\end{verbatim} - -\subsection{ss:c-register-exn}{Registering OCaml exceptions for use in C functions} - -The registration mechanism described above can also be used to -communicate exception identifiers from OCaml to C. The OCaml code -registers the exception by evaluating -"Callback.register_exception" \var{n} \var{exn}, where \var{n} is an -arbitrary name and \var{exn} is an exception value of the -exception to register. For example: -\begin{verbatim} - exception Error of string - let _ = Callback.register_exception "test exception" (Error "any string") -\end{verbatim} -The C code can then recover the exception identifier using -"caml_named_value" and pass it as first argument to the functions -"raise_constant", "raise_with_arg", and "raise_with_string" (described -in section~\ref{ss:c-exceptions}) to actually raise the exception. For -example, here is a C function that raises the "Error" exception with -the given argument: -\begin{verbatim} - void raise_error(char * msg) - { - caml_raise_with_string(*caml_named_value("test exception"), msg); - } -\end{verbatim} - -\subsection{ss:main-c}{Main program in C} - -In normal operation, a mixed OCaml/C program starts by executing the -OCaml initialization code, which then may proceed to call C -functions. We say that the main program is the OCaml code. In some -applications, it is desirable that the C code plays the role of the -main program, calling OCaml functions when needed. This can be achieved as -follows: -\begin{itemize} -\item The C part of the program must provide a "main" function, -which will override the default "main" function provided by the OCaml -runtime system. Execution will start in the user-defined "main" function -just like for a regular C program. - -\item At some point, the C code must call "caml_main(argv)" to -initialize the OCaml code. The "argv" argument is a C array of strings -(type "char **"), terminated with a "NULL" pointer, -which represents the command-line arguments, as -passed as second argument to "main". The OCaml array "Sys.argv" will -be initialized from this parameter. For the bytecode compiler, -"argv[0]" and "argv[1]" are also consulted to find the file containing -the bytecode. - -\item The call to "caml_main" initializes the OCaml runtime system, -loads the bytecode (in the case of the bytecode compiler), and -executes the initialization code of the OCaml program. Typically, this -initialization code registers callback functions using "Callback.register". -Once the OCaml initialization code is complete, control returns to the -C code that called "caml_main". - -\item The C code can then invoke OCaml functions using the callback -mechanism (see section~\ref{ss:c-callbacks}). -\end{itemize} - -\subsection{ss:c-embedded-code}{Embedding the OCaml code in the C code} - -The bytecode compiler in custom runtime mode ("ocamlc -custom") -normally appends the bytecode to the executable file containing the -custom runtime. This has two consequences. First, the final linking -step must be performed by "ocamlc". Second, the OCaml runtime library -must be able to find the name of the executable file from the -command-line arguments. When using "caml_main(argv)" as in -section~\ref{ss:main-c}, this means that "argv[0]" or "argv[1]" must -contain the executable file name. - -An alternative is to embed the bytecode in the C code. The -"-output-obj" option to "ocamlc" is provided for this purpose. It -causes the "ocamlc" compiler to output a C object file (".o" file, -".obj" under Windows) containing the bytecode for the OCaml part of the -program, as well as a "caml_startup" function. The C object file -produced by "ocamlc -output-obj" can then be linked with C code using -the standard C compiler, or stored in a C library. - -The "caml_startup" function must be called from the main C program in -order to initialize the OCaml runtime and execute the OCaml -initialization code. Just like "caml_main", it takes one "argv" -parameter containing the command-line parameters. Unlike "caml_main", -this "argv" parameter is used only to initialize "Sys.argv", but not -for finding the name of the executable file. - -The "caml_startup" function calls the uncaught exception handler (or -enters the debugger, if running under ocamldebug) if an exception escapes -from a top-level module initialiser. Such exceptions may be caught in the -C code by instead using the "caml_startup_exn" function and testing the result -using {\tt Is_exception_result} (followed by {\tt Extract_exception} if -appropriate). - -The "-output-obj" option can also be used to obtain the C source file. -More interestingly, the same option can also produce directly a shared -library (".so" file, ".dll" under Windows) that contains the OCaml -code, the OCaml runtime system and any other static C code given to -"ocamlc" (".o", ".a", respectively, ".obj", ".lib"). This use of -"-output-obj" is very similar to a normal linking step, but instead of -producing a main program that automatically runs the OCaml code, it -produces a shared library that can run the OCaml code on demand. The -three possible behaviors of "-output-obj" are selected according -to the extension of the resulting file (given with "-o"). - -The native-code compiler "ocamlopt" also supports the "-output-obj" -option, causing it to output a C object file or a shared library -containing the native code for all OCaml modules on the command-line, -as well as the OCaml startup code. Initialization is performed by -calling "caml_startup" (or "caml_startup_exn") as in the case of the -bytecode compiler. - -For the final linking phase, in addition to the object file produced -by "-output-obj", you will have to provide the OCaml runtime -library ("libcamlrun.a" for bytecode, "libasmrun.a" for native-code), -as well as all C libraries that are required by the OCaml libraries -used. For instance, assume the OCaml part of your program uses the -Unix library. With "ocamlc", you should do: -\begin{alltt} - ocamlc -output-obj -o camlcode.o unix.cma {\it{other}} .cmo {\it{and}} .cma {\it{files}} - cc -o myprog {\it{C objects and libraries}} \char92 - camlcode.o -L`ocamlc -where` -lunix -lcamlrun -\end{alltt} -With "ocamlopt", you should do: -\begin{alltt} - ocamlopt -output-obj -o camlcode.o unix.cmxa {\it{other}} .cmx {\it{and}} .cmxa {\it{files}} - cc -o myprog {\it{C objects and libraries}} \char92 - camlcode.o -L`ocamlc -where` -lunix -lasmrun -\end{alltt} - -% -- This seems completely wrong -- Damien -% The shared libraries produced by "ocamlc -output-obj" or by "ocamlopt -% -output-obj" already contains the OCaml runtime library as -% well as all the needed C libraries. - -\paragraph{Warning:} On some ports, special options are required on the final -linking phase that links together the object file produced by the -"-output-obj" option and the remainder of the program. Those options -are shown in the configuration file "Makefile.config" generated during -compilation of OCaml, as the variable "OC_LDFLAGS". -\begin{itemize} -\item Windows with the MSVC compiler: the object file produced by -OCaml have been compiled with the "/MD" flag, and therefore -all other object files linked with it should also be compiled with -"/MD". -\item other systems: you may have to add one or more of "-lcurses", -"-lm", "-ldl", depending on your OS and C compiler. -\end{itemize} - -\paragraph{Stack backtraces.} When OCaml bytecode produced by -"ocamlc -g" is embedded in a C program, no debugging information is -included, and therefore it is impossible to print stack backtraces on -uncaught exceptions. This is not the case when native code produced -by "ocamlopt -g" is embedded in a C program: stack backtrace -information is available, but the backtrace mechanism needs to be -turned on programmatically. This can be achieved from the OCaml side -by calling "Printexc.record_backtrace true" in the initialization of -one of the OCaml modules. This can also be achieved from the C side -by calling "caml_record_backtrace(Val_int(1));" in the OCaml-C glue code. - -\paragraph{Unloading the runtime.} - -In case the shared library produced with "-output-obj" is to be loaded and -unloaded repeatedly by a single process, care must be taken to unload the -OCaml runtime explicitly, in order to avoid various system resource leaks. - -Since 4.05, "caml_shutdown" function can be used to shut the runtime down -gracefully, which equals the following: -\begin{itemize} -\item Running the functions that were registered with "Stdlib.at_exit". -\item Triggering finalization of allocated custom blocks (see -section~\ref{s:c-custom}). For example, "Stdlib.in_channel" and -"Stdlib.out_channel" are represented by custom blocks that enclose file -descriptors, which are to be released. -\item Unloading the dependent shared libraries that were loaded by the runtime, -including "dynlink" plugins. -\item Freeing the memory blocks that were allocated by the runtime with -"malloc". Inside C primitives, it is advised to use "caml_stat_*" functions -from "memory.h" for managing static (that is, non-moving) blocks of heap -memory, as all the blocks allocated with these functions are automatically -freed by "caml_shutdown". For ensuring compatibility with legacy C stubs that -have used "caml_stat_*" incorrectly, this behaviour is only enabled if the -runtime is started with a specialized "caml_startup_pooled" function. -\end{itemize} - -As a shared library may have several clients simultaneously, it is made for -convenience that "caml_startup" (and "caml_startup_pooled") may be called -multiple times, given that each such call is paired with a corresponding call -to "caml_shutdown" (in a nested fashion). The runtime will be unloaded once -there are no outstanding calls to "caml_startup". - -Once a runtime is unloaded, it cannot be started up again without reloading the -shared library and reinitializing its static data. Therefore, at the moment, the -facility is only useful for building reloadable shared libraries. - - -\section{s:c-advexample}{Advanced example with callbacks} - -This section illustrates the callback facilities described in -section~\ref{s:c-callback}. We are going to package some OCaml functions -in such a way that they can be linked with C code and called from C -just like any C functions. The OCaml functions are defined in the -following "mod.ml" OCaml source: - -\begin{verbatim} -(* File mod.ml -- some "useful" OCaml functions *) - -let rec fib n = if n < 2 then 1 else fib(n-1) + fib(n-2) - -let format_result n = Printf.sprintf "Result is: %d\n" n - -(* Export those two functions to C *) - -let _ = Callback.register "fib" fib -let _ = Callback.register "format_result" format_result -\end{verbatim} - -Here is the C stub code for calling these functions from C: - -\begin{verbatim} -/* File modwrap.c -- wrappers around the OCaml functions */ - -#include -#include -#include -#include - -int fib(int n) -{ - static const value * fib_closure = NULL; - if (fib_closure == NULL) fib_closure = caml_named_value("fib"); - return Int_val(caml_callback(*fib_closure, Val_int(n))); -} - -char * format_result(int n) -{ - static const value * format_result_closure = NULL; - if (format_result_closure == NULL) - format_result_closure = caml_named_value("format_result"); - return strdup(String_val(caml_callback(*format_result_closure, Val_int(n)))); - /* We copy the C string returned by String_val to the C heap - so that it remains valid after garbage collection. */ -} -\end{verbatim} - -We now compile the OCaml code to a C object file and put it in a C -library along with the stub code in "modwrap.c" and the OCaml runtime system: -\begin{verbatim} - ocamlc -custom -output-obj -o modcaml.o mod.ml - ocamlc -c modwrap.c - cp `ocamlc -where`/libcamlrun.a mod.a && chmod +w mod.a - ar r mod.a modcaml.o modwrap.o -\end{verbatim} -(One can also use "ocamlopt -output-obj" instead of "ocamlc -custom --output-obj". In this case, replace "libcamlrun.a" (the bytecode -runtime library) by "libasmrun.a" (the native-code runtime library).) - -Now, we can use the two functions "fib" and "format_result" in any C -program, just like regular C functions. Just remember to call -"caml_startup" (or "caml_startup_exn") once before. - -\begin{verbatim} -/* File main.c -- a sample client for the OCaml functions */ - -#include -#include - -extern int fib(int n); -extern char * format_result(int n); - -int main(int argc, char ** argv) -{ - int result; - - /* Initialize OCaml code */ - caml_startup(argv); - /* Do some computation */ - result = fib(10); - printf("fib(10) = %s\n", format_result(result)); - return 0; -} -\end{verbatim} - -To build the whole program, just invoke the C compiler as follows: -\begin{verbatim} - cc -o prog -I `ocamlc -where` main.c mod.a -lcurses -\end{verbatim} -(On some machines, you may need to put "-ltermcap" or -"-lcurses -ltermcap" instead of "-lcurses".) - -\section{s:c-custom}{Advanced topic: custom blocks} - -Blocks with tag "Custom_tag" contain both arbitrary user data and a -pointer to a C struct, with type "struct custom_operations", that -associates user-provided finalization, comparison, hashing, -serialization and deserialization functions to this block. - -\subsection{ss:c-custom-ops}{The "struct custom_operations"} - -The "struct custom_operations" is defined in "" and -contains the following fields: -\begin{itemize} -\item "char *identifier" \\ -A zero-terminated character string serving as an identifier for -serialization and deserialization operations. - -\item "void (*finalize)(value v)" \\ -The "finalize" field contains a pointer to a C function that is called -when the block becomes unreachable and is about to be reclaimed. -The block is passed as first argument to the function. -The "finalize" field can also be "custom_finalize_default" to indicate that no -finalization function is associated with the block. - -\item "int (*compare)(value v1, value v2)" \\ -The "compare" field contains a pointer to a C function that is -called whenever two custom blocks are compared using OCaml's generic -comparison operators ("=", "<>", "<=", ">=", "<", ">" and -"compare"). The C function should return 0 if the data contained in -the two blocks are structurally equal, a negative integer if the data -from the first block is less than the data from the second block, and -a positive integer if the data from the first block is greater than -the data from the second block. - -The "compare" field can be set to "custom_compare_default"; this -default comparison function simply raises "Failure". - -\item "int (*compare_ext)(value v1, value v2)" \\ -(Since 3.12.1) -The "compare_ext" field contains a pointer to a C function that is -called whenever one custom block and one unboxed integer are compared using OCaml's generic -comparison operators ("=", "<>", "<=", ">=", "<", ">" and -"compare"). As in the case of the "compare" field, the C function -should return 0 if the two arguments are structurally equal, a -negative integer if the first argument compares less than the second -argument, and a positive integer if the first argument compares -greater than the second argument. - -The "compare_ext" field can be set to "custom_compare_ext_default"; this -default comparison function simply raises "Failure". - -\item "intnat (*hash)(value v)" \\ -The "hash" field contains a pointer to a C function that is called -whenever OCaml's generic hash operator (see module \stdmoduleref{Hashtbl}) is -applied to a custom block. The C function can return an arbitrary -integer representing the hash value of the data contained in the -given custom block. The hash value must be compatible with the -"compare" function, in the sense that two structurally equal data -(that is, two custom blocks for which "compare" returns 0) must have -the same hash value. - -The "hash" field can be set to "custom_hash_default", in which case -the custom block is ignored during hash computation. - -\item "void (*serialize)(value v, uintnat * bsize_32, uintnat * bsize_64)" \\ -The "serialize" field contains a pointer to a C function that is -called whenever the custom block needs to be serialized (marshaled) -using the OCaml functions "output_value" or "Marshal.to_...". -For a custom block, those functions first write the identifier of the -block (as given by the "identifier" field) to the output stream, -then call the user-provided "serialize" function. That function is -responsible for writing the data contained in the custom block, using -the "serialize_..." functions defined in "" and listed -below. The user-provided "serialize" function must then store in its -"bsize_32" and "bsize_64" parameters the sizes in bytes of the data -part of the custom block on a 32-bit architecture and on a 64-bit -architecture, respectively. - -The "serialize" field can be set to "custom_serialize_default", -in which case the "Failure" exception is raised when attempting to -serialize the custom block. - -\item "uintnat (*deserialize)(void * dst)" \\ -The "deserialize" field contains a pointer to a C function that is -called whenever a custom block with identifier "identifier" needs to -be deserialized (un-marshaled) using the OCaml functions "input_value" -or "Marshal.from_...". This user-provided function is responsible for -reading back the data written by the "serialize" operation, using the -"deserialize_..." functions defined in "" and listed -below. It must then rebuild the data part of the custom block -and store it at the pointer given as the "dst" argument. Finally, it -returns the size in bytes of the data part of the custom block. -This size must be identical to the "wsize_32" result of -the "serialize" operation if the architecture is 32 bits, or -"wsize_64" if the architecture is 64 bits. - -The "deserialize" field can be set to "custom_deserialize_default" -to indicate that deserialization is not supported. In this case, -do not register the "struct custom_operations" with the deserializer -using "register_custom_operations" (see below). - -\item "const struct custom_fixed_length* fixed_length" \\ -(Since 4.08.0) -Normally, space in the serialized output is reserved to write the -"bsize_32" and "bsize_64" fields returned by "serialize". However, for -very short custom blocks, this space can be larger than the data -itself! As a space optimisation, if "serialize" always returns the -same values for "bsize_32" and "bsize_64", then these values may be -specified in the "fixed_length" structure, and do not consume space in -the serialized output. -\end{itemize} - -Note: the "finalize", "compare", "hash", "serialize" and "deserialize" -functions attached to custom block descriptors must never trigger a -garbage collection. Within these functions, do not call any of the -OCaml allocation functions, and do not perform a callback into OCaml -code. Do not use "CAMLparam" to register the parameters to these -functions, and do not use "CAMLreturn" to return the result. - -\subsection{ss:c-custom-alloc}{Allocating custom blocks} - -Custom blocks must be allocated via "caml_alloc_custom" or -"caml_alloc_custom_mem": -\begin{center} -"caml_alloc_custom("\var{ops}", "\var{size}", "\var{used}", "\var{max}")" -\end{center} -returns a fresh custom block, with room for \var{size} bytes of user -data, and whose associated operations are given by \var{ops} (a -pointer to a "struct custom_operations", usually statically allocated -as a C global variable). - -The two parameters \var{used} and \var{max} are used to control the -speed of garbage collection when the finalized object contains -pointers to out-of-heap resources. Generally speaking, the -OCaml incremental major collector adjusts its speed relative to the -allocation rate of the program. The faster the program allocates, the -harder the GC works in order to reclaim quickly unreachable blocks -and avoid having large amount of ``floating garbage'' (unreferenced -objects that the GC has not yet collected). - -Normally, the allocation rate is measured by counting the in-heap size -of allocated blocks. However, it often happens that finalized -objects contain pointers to out-of-heap memory blocks and other resources -(such as file descriptors, X Windows bitmaps, etc.). For those -blocks, the in-heap size of blocks is not a good measure of the -quantity of resources allocated by the program. - -The two arguments \var{used} and \var{max} give the GC an idea of how -much out-of-heap resources are consumed by the finalized block -being allocated: you give the amount of resources allocated to this -object as parameter \var{used}, and the maximum amount that you want -to see in floating garbage as parameter \var{max}. The units are -arbitrary: the GC cares only about the ratio $\var{used} / \var{max}$. - -For instance, if you are allocating a finalized block holding an X -Windows bitmap of \var{w} by \var{h} pixels, and you'd rather not -have more than 1 mega-pixels of unreclaimed bitmaps, specify -$\var{used} = \var{w} * \var{h}$ and $\var{max} = 1000000$. - -Another way to describe the effect of the \var{used} and \var{max} -parameters is in terms of full GC cycles. If you allocate many custom -blocks with $\var{used} / \var{max} = 1 / \var{N}$, the GC will then do one -full cycle (examining every object in the heap and calling -finalization functions on those that are unreachable) every \var{N} -allocations. For instance, if $\var{used} = 1$ and $\var{max} = 1000$, -the GC will do one full cycle at least every 1000 allocations of -custom blocks. - -If your finalized blocks contain no pointers to out-of-heap resources, -or if the previous discussion made little sense to you, just take -$\var{used} = 0$ and $\var{max} = 1$. But if you later find that the -finalization functions are not called ``often enough'', consider -increasing the $\var{used} / \var{max}$ ratio. - -\begin{center} -"caml_alloc_custom_mem("\var{ops}", "\var{size}", "\var{used}")" -\end{center} -Use this function when your custom block holds only out-of-heap memory -(memory allocated with "malloc" or "caml_stat_alloc") and no other -resources. "used" should be the number of bytes of out-of-heap -memory that are held by your custom block. This function works like -"caml_alloc_custom" except that the "max" parameter is under the -control of the user (via the "custom_major_ratio", -"custom_minor_ratio", and "custom_minor_max_size" parameters) and -proportional to the heap sizes. - -\subsection{ss:c-custom-access}{Accessing custom blocks} - -The data part of a custom block \var{v} can be -accessed via the pointer "Data_custom_val("\var{v}")". This pointer -has type "void *" and should be cast to the actual type of the data -stored in the custom block. - -The contents of custom blocks are not scanned by the garbage -collector, and must therefore not contain any pointer inside the OCaml -heap. In other terms, never store an OCaml "value" in a custom block, -and do not use "Field", "Store_field" nor "caml_modify" to access the data -part of a custom block. Conversely, any C data structure (not -containing heap pointers) can be stored in a custom block. - -\subsection{ss:c-custom-serialization}{Writing custom serialization and deserialization functions} - -The following functions, defined in "", are provided to -write and read back the contents of custom blocks in a portable way. -Those functions handle endianness conversions when e.g. data is -written on a little-endian machine and read back on a big-endian machine. - -\begin{tableau}{|l|p{10cm}|}{Function}{Action} -\entree{"caml_serialize_int_1"}{Write a 1-byte integer} -\entree{"caml_serialize_int_2"}{Write a 2-byte integer} -\entree{"caml_serialize_int_4"}{Write a 4-byte integer} -\entree{"caml_serialize_int_8"}{Write a 8-byte integer} -\entree{"caml_serialize_float_4"}{Write a 4-byte float} -\entree{"caml_serialize_float_8"}{Write a 8-byte float} -\entree{"caml_serialize_block_1"}{Write an array of 1-byte quantities} -\entree{"caml_serialize_block_2"}{Write an array of 2-byte quantities} -\entree{"caml_serialize_block_4"}{Write an array of 4-byte quantities} -\entree{"caml_serialize_block_8"}{Write an array of 8-byte quantities} -\entree{"caml_deserialize_uint_1"}{Read an unsigned 1-byte integer} -\entree{"caml_deserialize_sint_1"}{Read a signed 1-byte integer} -\entree{"caml_deserialize_uint_2"}{Read an unsigned 2-byte integer} -\entree{"caml_deserialize_sint_2"}{Read a signed 2-byte integer} -\entree{"caml_deserialize_uint_4"}{Read an unsigned 4-byte integer} -\entree{"caml_deserialize_sint_4"}{Read a signed 4-byte integer} -\entree{"caml_deserialize_uint_8"}{Read an unsigned 8-byte integer} -\entree{"caml_deserialize_sint_8"}{Read a signed 8-byte integer} -\entree{"caml_deserialize_float_4"}{Read a 4-byte float} -\entree{"caml_deserialize_float_8"}{Read an 8-byte float} -\entree{"caml_deserialize_block_1"}{Read an array of 1-byte quantities} -\entree{"caml_deserialize_block_2"}{Read an array of 2-byte quantities} -\entree{"caml_deserialize_block_4"}{Read an array of 4-byte quantities} -\entree{"caml_deserialize_block_8"}{Read an array of 8-byte quantities} -\entree{"caml_deserialize_error"}{Signal an error during deserialization; -"input_value" or "Marshal.from_..." raise a "Failure" exception after -cleaning up their internal data structures} -\end{tableau} - -Serialization functions are attached to the custom blocks to which -they apply. Obviously, deserialization functions cannot be attached -this way, since the custom block does not exist yet when -deserialization begins! Thus, the "struct custom_operations" that -contain deserialization functions must be registered with the -deserializer in advance, using the "register_custom_operations" -function declared in "". Deserialization proceeds by -reading the identifier off the input stream, allocating a custom block -of the size specified in the input stream, searching the registered -"struct custom_operation" blocks for one with the same identifier, and -calling its "deserialize" function to fill the data part of the custom block. - -\subsection{ss:c-custom-idents}{Choosing identifiers} - -Identifiers in "struct custom_operations" must be chosen carefully, -since they must identify uniquely the data structure for serialization -and deserialization operations. In particular, consider including a -version number in the identifier; this way, the format of the data can -be changed later, yet backward-compatible deserialisation functions -can be provided. - -Identifiers starting with "_" (an underscore character) are reserved -for the OCaml runtime system; do not use them for your custom -data. We recommend to use a URL -("http://mymachine.mydomain.com/mylibrary/version-number") -or a Java-style package name -("com.mydomain.mymachine.mylibrary.version-number") -as identifiers, to minimize the risk of identifier collision. - -\subsection{ss:c-finalized}{Finalized blocks} - -Custom blocks generalize the finalized blocks that were present in -OCaml prior to version 3.00. For backward compatibility, the -format of custom blocks is compatible with that of finalized blocks, -and the "alloc_final" function is still available to allocate a custom -block with a given finalization function, but default comparison, -hashing and serialization functions. "caml_alloc_final("\var{n}", -"\var{f}", "\var{used}", "\var{max}")" returns a fresh custom block of -size \var{n}+1 words, with finalization function \var{f}. The first -word is reserved for storing the custom operations; the other -\var{n} words are available for your data. The two parameters -\var{used} and \var{max} are used to control the speed of garbage -collection, as described for "caml_alloc_custom". - -\section{s:C-Bigarrays}{Advanced topic: Bigarrays and the OCaml-C interface} - -This section explains how C stub code that interfaces C or Fortran -code with OCaml code can use Bigarrays. - -\subsection{ss:C-Bigarrays-include}{Include file} - -The include file "" must be included in the C stub -file. It declares the functions, constants and macros discussed -below. - -\subsection{ss:C-Bigarrays-access}{Accessing an OCaml bigarray from C or Fortran} - -If \var{v} is a OCaml "value" representing a Bigarray, the expression -"Caml_ba_data_val("\var{v}")" returns a pointer to the data part of the array. -This pointer is of type "void *" and can be cast to the appropriate C -type for the array (e.g. "double []", "char [][10]", etc). - -Various characteristics of the OCaml Bigarray can be consulted from C -as follows: -\begin{tableau}{|l|l|}{C expression}{Returns} -\entree{"Caml_ba_array_val("\var{v}")->num_dims"}{number of dimensions} -\entree{"Caml_ba_array_val("\var{v}")->dim["\var{i}"]"}{\var{i}-th dimension} -\entree{"Caml_ba_array_val("\var{v}")->flags & BIGARRAY_KIND_MASK"}{kind of array elements} -\end{tableau} -The kind of array elements is one of the following constants: -\begin{tableau}{|l|l|}{Constant}{Element kind} -\entree{"CAML_BA_FLOAT32"}{32-bit single-precision floats} -\entree{"CAML_BA_FLOAT64"}{64-bit double-precision floats} -\entree{"CAML_BA_SINT8"}{8-bit signed integers} -\entree{"CAML_BA_UINT8"}{8-bit unsigned integers} -\entree{"CAML_BA_SINT16"}{16-bit signed integers} -\entree{"CAML_BA_UINT16"}{16-bit unsigned integers} -\entree{"CAML_BA_INT32"}{32-bit signed integers} -\entree{"CAML_BA_INT64"}{64-bit signed integers} -\entree{"CAML_BA_CAML_INT"}{31- or 63-bit signed integers} -\entree{"CAML_BA_NATIVE_INT"}{32- or 64-bit (platform-native) integers} -\end{tableau} -% -\paragraph{Warning:} -"Caml_ba_array_val("\var{v}")" must always be dereferenced immediately and not stored -anywhere, including local variables. -It resolves to a derived pointer: it is not a valid OCaml value but points to -a memory region managed by the GC. For this reason this value must not be -stored in any memory location that could be live cross a GC. - -The following example shows the passing of a two-dimensional Bigarray -to a C function and a Fortran function. -\begin{verbatim} - extern void my_c_function(double * data, int dimx, int dimy); - extern void my_fortran_function_(double * data, int * dimx, int * dimy); - - CAMLprim value caml_stub(value bigarray) - { - int dimx = Caml_ba_array_val(bigarray)->dim[0]; - int dimy = Caml_ba_array_val(bigarray)->dim[1]; - /* C passes scalar parameters by value */ - my_c_function(Caml_ba_data_val(bigarray), dimx, dimy); - /* Fortran passes all parameters by reference */ - my_fortran_function_(Caml_ba_data_val(bigarray), &dimx, &dimy); - return Val_unit; - } -\end{verbatim} - -\subsection{ss:C-Bigarrays-wrap}{Wrapping a C or Fortran array as an OCaml Bigarray} - -A pointer \var{p} to an already-allocated C or Fortran array can be -wrapped and returned to OCaml as a Bigarray using the "caml_ba_alloc" -or "caml_ba_alloc_dims" functions. -\begin{itemize} -\item -"caml_ba_alloc("\var{kind} "|" \var{layout}, \var{numdims}, \var{p}, \var{dims}")" - -Return an OCaml Bigarray wrapping the data pointed to by \var{p}. -\var{kind} is the kind of array elements (one of the "CAML_BA_" -kind constants above). \var{layout} is "CAML_BA_C_LAYOUT" for an -array with C layout and "CAML_BA_FORTRAN_LAYOUT" for an array with -Fortran layout. \var{numdims} is the number of dimensions in the -array. \var{dims} is an array of \var{numdims} long integers, giving -the sizes of the array in each dimension. - -\item -"caml_ba_alloc_dims("\var{kind} "|" \var{layout}, \var{numdims}, -\var{p}, "(long) "\nth{dim}{1}, "(long) "\nth{dim}{2}, \ldots, "(long) "\nth{dim}{numdims}")" - -Same as "caml_ba_alloc", but the sizes of the array in each dimension -are listed as extra arguments in the function call, rather than being -passed as an array. -\end{itemize} -% -The following example illustrates how statically-allocated C and -Fortran arrays can be made available to OCaml. -\begin{verbatim} - extern long my_c_array[100][200]; - extern float my_fortran_array_[300][400]; - - CAMLprim value caml_get_c_array(value unit) - { - long dims[2]; - dims[0] = 100; dims[1] = 200; - return caml_ba_alloc(CAML_BA_NATIVE_INT | CAML_BA_C_LAYOUT, - 2, my_c_array, dims); - } - - CAMLprim value caml_get_fortran_array(value unit) - { - return caml_ba_alloc_dims(CAML_BA_FLOAT32 | CAML_BA_FORTRAN_LAYOUT, - 2, my_fortran_array_, 300L, 400L); - } -\end{verbatim} - -\section{s:C-cheaper-call}{Advanced topic: cheaper C call} - -This section describe how to make calling C functions cheaper. - -{\bf Note:} this only applies to the native compiler. So whenever you -use any of these methods, you have to provide an alternative byte-code -stub that ignores all the special annotations. - -\subsection{ss:c-unboxed}{Passing unboxed values} - -We said earlier that all OCaml objects are represented by the C type -"value", and one has to use macros such as "Int_val" to decode data from -the "value" type. It is however possible to tell the OCaml native-code -compiler to do this for us and pass arguments unboxed to the C function. -Similarly it is possible to tell OCaml to expect the result unboxed and box -it for us. - -The motivation is that, by letting `ocamlopt` deal with boxing, it can -often decide to suppress it entirely. - -For instance let's consider this example: - -\begin{verbatim} -external foo : float -> float -> float = "foo" - -let f a b = - let len = Array.length a in - assert (Array.length b = len); - let res = Array.make len 0. in - for i = 0 to len - 1 do - res.(i) <- foo a.(i) b.(i) - done -\end{verbatim} - -Float arrays are unboxed in OCaml, however the C function "foo" expect -its arguments as boxed floats and returns a boxed float. Hence the -OCaml compiler has no choice but to box "a.(i)" and "b.(i)" and unbox -the result of "foo". This results in the allocation of "3 * len" -temporary float values. - -Now if we annotate the arguments and result with "[\@unboxed]", the -native-code compiler will be able to avoid all these allocations: - -\begin{verbatim} -external foo - : (float [@unboxed]) - -> (float [@unboxed]) - -> (float [@unboxed]) - = "foo_byte" "foo" -\end{verbatim} - -In this case the C functions must look like: - -\begin{verbatim} -CAMLprim double foo(double a, double b) -{ - ... -} - -CAMLprim value foo_byte(value a, value b) -{ - return caml_copy_double(foo(Double_val(a), Double_val(b))) -} -\end{verbatim} - -For convenience, when all arguments and the result are annotated with -"[\@unboxed]", it is possible to put the attribute only once on the -declaration itself. So we can also write instead: - -\begin{verbatim} -external foo : float -> float -> float = "foo_byte" "foo" [@@unboxed] -\end{verbatim} - -The following table summarize what OCaml types can be unboxed, and -what C types should be used in correspondence: - -\begin{tableau}{|l|l|}{OCaml type}{C type} -\entree{"float"}{"double"} -\entree{"int32"}{"int32_t"} -\entree{"int64"}{"int64_t"} -\entree{"nativeint"}{"intnat"} -\end{tableau} - -Similarly, it is possible to pass untagged OCaml integers between -OCaml and C. This is done by annotating the arguments and/or result -with "[\@untagged]": - -\begin{verbatim} -external f : string -> (int [@untagged]) = "f_byte" "f" -\end{verbatim} - -The corresponding C type must be "intnat". - -{\bf Note:} do not use the C "int" type in correspondence with "(int -[\@untagged])". This is because they often differ in size. - -\subsection{ss:c-direct-call}{Direct C call} - -In order to be able to run the garbage collector in the middle of -a C function, the OCaml native-code compiler generates some bookkeeping -code around C calls. Technically it wraps every C call with the C function -"caml_c_call" which is part of the OCaml runtime. - -For small functions that are called repeatedly, this indirection can have -a big impact on performances. However this is not needed if we know that -the C function doesn't allocate, doesn't raise exceptions, and doesn't release -the master lock (see section~\ref{ss:parallel-execution-long-running-c-code}). -We can instruct the OCaml native-code compiler of this fact by annotating the -external declaration with the attribute "[\@\@noalloc]": - -\begin{verbatim} -external bar : int -> int -> int = "foo" [@@noalloc] -\end{verbatim} - -In this case calling "bar" from OCaml is as cheap as calling any other -OCaml function, except for the fact that the OCaml compiler can't -inline C functions... - -\subsection{ss:c-direct-call-example}{Example: calling C library functions without indirection} - -Using these attributes, it is possible to call C library functions -with no indirection. For instance many math functions are defined this -way in the OCaml standard library: - -\begin{verbatim} -external sqrt : float -> float = "caml_sqrt_float" "sqrt" - [@@unboxed] [@@noalloc] -(** Square root. *) - -external exp : float -> float = "caml_exp_float" "exp" [@@unboxed] [@@noalloc] -(** Exponential. *) - -external log : float -> float = "caml_log_float" "log" [@@unboxed] [@@noalloc] -(** Natural logarithm. *) -\end{verbatim} - -\section{s:C-multithreading}{Advanced topic: multithreading} - -Using multiple threads (shared-memory concurrency) in a mixed OCaml/C -application requires special precautions, which are described in this -section. - -\subsection{ss:c-thread-register}{Registering threads created from C} - -Callbacks from C to OCaml are possible only if the calling thread is -known to the OCaml run-time system. Threads created from OCaml (through -the "Thread.create" function of the system threads library) are -automatically known to the run-time system. If the application -creates additional threads from C and wishes to callback into OCaml -code from these threads, it must first register them with the run-time -system. The following functions are declared in the include file -"". - -\begin{itemize} -\item -"caml_c_thread_register()" registers the calling thread with the OCaml -run-time system. Returns 1 on success, 0 on error. Registering an -already-registered thread does nothing and returns 0. -\item -"caml_c_thread_unregister()" must be called before the thread - terminates, to unregister it from the OCaml run-time system. -Returns 1 on success, 0 on error. If the calling thread was not -previously registered, does nothing and returns 0. -\end{itemize} - -\subsection{ss:parallel-execution-long-running-c-code}{Parallel execution of long-running C code} - -The OCaml run-time system is not reentrant: at any time, at most one -thread can be executing OCaml code or C code that uses the OCaml -run-time system. Technically, this is enforced by a ``master lock'' -that any thread must hold while executing such code. - -When OCaml calls the C code implementing a primitive, the master lock -is held, therefore the C code has full access to the facilities of the -run-time system. However, no other thread can execute OCaml code -concurrently with the C code of the primitive. - -If a C primitive runs for a long time or performs potentially blocking -input-output operations, it can explicitly release the master lock, -enabling other OCaml threads to run concurrently with its operations. -The C code must re-acquire the master lock before returning to OCaml. -This is achieved with the following functions, declared in -the include file "". - -\begin{itemize} -\item -"caml_release_runtime_system()" -The calling thread releases the master lock and other OCaml resources, -enabling other threads to run OCaml code in parallel with the execution -of the calling thread. -\item -"caml_acquire_runtime_system()" -The calling thread re-acquires the master lock and other OCaml -resources. It may block until no other thread uses the OCaml run-time -system. -\end{itemize} - -These functions poll for pending signals by calling asynchronous -callbacks (section~\ref{ss:c-process-pending-actions}) before releasing and -after acquiring the lock. They can therefore execute arbitrary OCaml -code including raising an asynchronous exception. - -After "caml_release_runtime_system()" was called and until -"caml_acquire_runtime_system()" is called, the C code must not access -any OCaml data, nor call any function of the run-time system, nor call -back into OCaml code. Consequently, arguments provided by OCaml to the -C primitive must be copied into C data structures before calling -"caml_release_runtime_system()", and results to be returned to OCaml -must be encoded as OCaml values after "caml_acquire_runtime_system()" -returns. - -Example: the following C primitive invokes "gethostbyname" to find the -IP address of a host name. The "gethostbyname" function can block for -a long time, so we choose to release the OCaml run-time system while it -is running. -\begin{verbatim} -CAMLprim stub_gethostbyname(value vname) -{ - CAMLparam1 (vname); - CAMLlocal1 (vres); - struct hostent * h; - char * name; - - /* Copy the string argument to a C string, allocated outside the - OCaml heap. */ - name = caml_stat_strdup(String_val(vname)); - /* Release the OCaml run-time system */ - caml_release_runtime_system(); - /* Resolve the name */ - h = gethostbyname(name); - /* Free the copy of the string, which we might as well do before - acquiring the runtime system to benefit from parallelism. */ - caml_stat_free(name); - /* Re-acquire the OCaml run-time system */ - caml_acquire_runtime_system(); - /* Encode the relevant fields of h as the OCaml value vres */ - ... /* Omitted */ - /* Return to OCaml */ - CAMLreturn (vres); -} -\end{verbatim} - -Callbacks from C to OCaml must be performed while holding the master -lock to the OCaml run-time system. This is naturally the case if the -callback is performed by a C primitive that did not release the -run-time system. If the C primitive released the run-time system -previously, or the callback is performed from other C code that was -not invoked from OCaml (e.g. an event loop in a GUI application), the -run-time system must be acquired before the callback and released -after: -\begin{verbatim} - caml_acquire_runtime_system(); - /* Resolve OCaml function vfun to be invoked */ - /* Build OCaml argument varg to the callback */ - vres = callback(vfun, varg); - /* Copy relevant parts of result vres to C data structures */ - caml_release_runtime_system(); -\end{verbatim} - -Note: the "acquire" and "release" functions described above were -introduced in OCaml 3.12. Older code uses the following historical -names, declared in "": -\begin{itemize} -\item "caml_enter_blocking_section" as an alias for - "caml_release_runtime_system" -\item "caml_leave_blocking_section" as an alias for - "caml_acquire_runtime_system" -\end{itemize} -Intuition: a ``blocking section'' is a piece of C code that does not -use the OCaml run-time system, typically a blocking input/output operation. - -\section{s:interfacing-windows-unicode-apis}{Advanced topic: interfacing with Windows Unicode APIs} - -This section contains some general guidelines for writing C stubs that use -Windows Unicode APIs. - -{\bf Note:} This is an experimental feature of OCaml: the set of APIs below, as -well as their exact semantics are not final and subject to change in future -releases. - -The OCaml system under Windows can be configured at build time in one of two -modes: - -\begin{itemize} - -\item {\bf legacy mode:} All path names, environment variables, command line -arguments, etc. on the OCaml side are assumed to be encoded using the current -8-bit code page of the system. - -\item {\bf Unicode mode:} All path names, environment variables, command line -arguments, etc. on the OCaml side are assumed to be encoded using UTF-8. - -\end{itemize} - -In what follows, we say that a string has the \emph{OCaml encoding} if it is -encoded in UTF-8 when in Unicode mode, in the current code page in legacy mode, -or is an arbitrary string under Unix. A string has the \emph{platform encoding} -if it is encoded in UTF-16 under Windows or is an arbitrary string under Unix. - -From the point of view of the writer of C stubs, the challenges of interacting -with Windows Unicode APIs are twofold: - -\begin{itemize} - -\item The Windows API uses the UTF-16 encoding to support Unicode. The runtime -system performs the necessary conversions so that the OCaml programmer only -needs to deal with the OCaml encoding. C stubs that call Windows Unicode APIs -need to use specific runtime functions to perform the necessary conversions in a -compatible way. - -\item When writing stubs that need to be compiled under both Windows and Unix, -the stubs need to be written in a way that allow the necessary conversions under -Windows but that also work under Unix, where typically nothing particular needs -to be done to support Unicode. - -\end{itemize} - -The native C character type under Windows is "WCHAR", two bytes wide, while -under Unix it is "char", one byte wide. A type "char_os" is defined in -"" that stands for the concrete C character type of each -platform. Strings in the platform encoding are of type "char_os *". - -The following functions are exposed to help write compatible C stubs. To use -them, you need to include both "" and "". - -\begin{itemize} - -\item "char_os* caml_stat_strdup_to_os(const char *)" copies the argument while -translating from OCaml encoding to the platform encoding. This function is -typically used to convert the "char *" underlying an OCaml string before passing -it to an operating system API that takes a Unicode argument. Under Unix, it is -equivalent to "caml_stat_strdup". - -{\bf Note:} For maximum backwards compatibility in Unicode mode, if the argument -is not a valid UTF-8 string, this function will fall back to assuming that it is -encoded in the current code page. - -\item "char* caml_stat_strdup_of_os(const char_os *)" copies the argument while -translating from the platform encoding to the OCaml encoding. It is the inverse -of "caml_stat_strdup_to_os". This function is typically used to convert a string -obtained from the operating system before passing it on to OCaml code. Under -Unix, it is equivalent to "caml_stat_strdup". - -\item "value caml_copy_string_of_os(char_os *)" allocates an OCaml string with -contents equal to the argument string converted to the OCaml encoding. This -function is essentially equivalent to "caml_stat_strdup_of_os" followed by -"caml_copy_string", except that it avoids the allocation of the intermediate -string returned by "caml_stat_strdup_of_os". Under Unix, it is equivalent to -"caml_copy_string". - -\end{itemize} - -{\bf Note:} The strings returned by "caml_stat_strdup_to_os" and -"caml_stat_strdup_of_os" are allocated using "caml_stat_alloc", so they need to -be deallocated using "caml_stat_free" when they are no longer needed. - -\paragraph{Example} We want to bind the function "getenv" in a way that works -both under Unix and Windows. Under Unix this function has the prototype: - -\begin{verbatim} - char *getenv(const char *); -\end{verbatim} -While the Unicode version under Windows has the prototype: -\begin{verbatim} - WCHAR *_wgetenv(const WCHAR *); -\end{verbatim} - -In terms of "char_os", both functions take an argument of type "char_os *" and -return a result of the same type. We begin by choosing the right implementation -of the function to bind: - -\begin{verbatim} -#ifdef _WIN32 -#define getenv_os _wgetenv -#else -#define getenv_os getenv -#endif -\end{verbatim} - -The rest of the binding is the same for both platforms: - -\begin{verbatim} -/* The following define is necessary because the API is experimental */ -#define CAML_NAME_SPACE -#define CAML_INTERNALS - -#include -#include -#include -#include -#include -#include - -CAMLprim value stub_getenv(value var_name) -{ - CAMLparam1(var_name); - CAMLlocal1(var_value); - char_os *var_name_os, *var_value_os; - - var_name_os = caml_stat_strdup_to_os(String_val(var_name)); - var_value_os = getenv_os(var_name_os); - caml_stat_free(var_name_os); - - if (var_value_os == NULL) - caml_raise_not_found(); - - var_value = caml_copy_string_of_os(var_value_os); - - CAMLreturn(var_value); -} -\end{verbatim} - -\section{s:ocamlmklib}{Building mixed C/OCaml libraries: \texttt{ocamlmklib}} - -The "ocamlmklib" command facilitates the construction of libraries -containing both OCaml code and C code, and usable both in static -linking and dynamic linking modes. This command is available under -Windows since Objective Caml 3.11 and under other operating systems since -Objective Caml 3.03. - -The "ocamlmklib" command takes three kinds of arguments: -\begin{itemize} -\item OCaml source files and object files (".cmo", ".cmx", ".ml") -comprising the OCaml part of the library; -\item C object files (".o", ".a", respectively, ".obj", ".lib") - comprising the C part of the library; -\item Support libraries for the C part ("-l"\var{lib}). -\end{itemize} -It generates the following outputs: -\begin{itemize} -\item An OCaml bytecode library ".cma" incorporating the ".cmo" and -".ml" OCaml files given as arguments, and automatically referencing the -C library generated with the C object files. -\item An OCaml native-code library ".cmxa" incorporating the ".cmx" and -".ml" OCaml files given as arguments, and automatically referencing the -C library generated with the C object files. -\item If dynamic linking is supported on the target platform, a -".so" (respectively, ".dll") shared library built from the C object files given as arguments, -and automatically referencing the support libraries. -\item A C static library ".a"(respectively, ".lib") built from the C object files. -\end{itemize} -In addition, the following options are recognized: -\begin{options} -\item["-cclib", "-ccopt", "-I", "-linkall"] -These options are passed as is to "ocamlc" or "ocamlopt". -See the documentation of these commands. -\item["-rpath", "-R", "-Wl,-rpath", "-Wl,-R"] -These options are passed as is to the C compiler. Refer to the -documentation of the C compiler. -\item["-custom"] Force the construction of a statically linked library -only, even if dynamic linking is supported. -\item["-failsafe"] Fall back to building a statically linked library -if a problem occurs while building the shared library (e.g. some of -the support libraries are not available as shared libraries). -\item["-L"\var{dir}] Add \var{dir} to the search path for support -libraries ("-l"\var{lib}). -\item["-ocamlc" \var{cmd}] Use \var{cmd} instead of "ocamlc" to call -the bytecode compiler. -\item["-ocamlopt" \var{cmd}] Use \var{cmd} instead of "ocamlopt" to call -the native-code compiler. -\item["-o" \var{output}] Set the name of the generated OCaml library. -"ocamlmklib" will generate \var{output}".cma" and/or \var{output}".cmxa". -If not specified, defaults to "a". -\item["-oc" \var{outputc}] Set the name of the generated C library. -"ocamlmklib" will generate "lib"\var{outputc}".so" (if shared -libraries are supported) and "lib"\var{outputc}".a". -If not specified, defaults to the output name given with "-o". -\end{options} - -\noindent -On native Windows, the following environment variable is also consulted: - -\begin{options} -\item["OCAML_FLEXLINK"] Alternative executable to use instead of the -configured value. Primarily used for bootstrapping. -\end{options} - -\paragraph{Example} Consider an OCaml interface to the standard "libz" -C library for reading and writing compressed files. Assume this -library resides in "/usr/local/zlib". This interface is -composed of an OCaml part "zip.cmo"/"zip.cmx" and a C part "zipstubs.o" -containing the stub code around the "libz" entry points. The -following command builds the OCaml libraries "zip.cma" and "zip.cmxa", -as well as the companion C libraries "dllzip.so" and "libzip.a": -\begin{verbatim} -ocamlmklib -o zip zip.cmo zip.cmx zipstubs.o -lz -L/usr/local/zlib -\end{verbatim} -If shared libraries are supported, this performs the following -commands: -\begin{verbatim} -ocamlc -a -o zip.cma zip.cmo -dllib -lzip \ - -cclib -lzip -cclib -lz -ccopt -L/usr/local/zlib -ocamlopt -a -o zip.cmxa zip.cmx -cclib -lzip \ - -cclib -lzip -cclib -lz -ccopt -L/usr/local/zlib -gcc -shared -o dllzip.so zipstubs.o -lz -L/usr/local/zlib -ar rc libzip.a zipstubs.o -\end{verbatim} -Note: This example is on a Unix system. The exact command lines -may be different on other systems. - -If shared libraries are not supported, the following commands are -performed instead: -\begin{verbatim} -ocamlc -a -custom -o zip.cma zip.cmo -cclib -lzip \ - -cclib -lz -ccopt -L/usr/local/zlib -ocamlopt -a -o zip.cmxa zip.cmx -lzip \ - -cclib -lz -ccopt -L/usr/local/zlib -ar rc libzip.a zipstubs.o -\end{verbatim} -Instead of building simultaneously the bytecode library, the -native-code library and the C libraries, "ocamlmklib" can be called -three times to build each separately. Thus, -\begin{verbatim} -ocamlmklib -o zip zip.cmo -lz -L/usr/local/zlib -\end{verbatim} -builds the bytecode library "zip.cma", and -\begin{verbatim} -ocamlmklib -o zip zip.cmx -lz -L/usr/local/zlib -\end{verbatim} -builds the native-code library "zip.cmxa", and -\begin{verbatim} -ocamlmklib -o zip zipstubs.o -lz -L/usr/local/zlib -\end{verbatim} -builds the C libraries "dllzip.so" and "libzip.a". Notice that the -support libraries ("-lz") and the corresponding options -("-L/usr/local/zlib") must be given on all three invocations of "ocamlmklib", -because they are needed at different times depending on whether shared -libraries are supported. - - -\section{s:c-internal-guidelines}{Cautionary words: the internal runtime API} - -Not all header available in the "caml/" directory were described in previous -sections. All those unmentioned headers are part of the internal runtime API, -for which there is \emph{no} stability guarantee. If you really need access -to this internal runtime API, this section provides some guidelines -that may help you to write code that might not break on every new version -of OCaml. -\paragraph{Note} Programmers which come to rely on the internal API -for a use-case which they find realistic and useful are encouraged to open -a request for improvement on the bug tracker. - -\subsection{ss:c-internals}{Internal variables and CAML_INTERNALS} -Since OCaml 4.04, it is possible to get access to every part of the internal -runtime API by defining the "CAML_INTERNALS" macro before loading caml header files. -If this macro is not defined, parts of the internal runtime API are hidden. - -If you are using internal C variables, do not redefine them by hand. You should -import those variables by including the corresponding header files. The -representation of those variables has already changed once in OCaml 4.10, and is -still under evolution. -If your code relies on such internal and brittle properties, it will be broken -at some point in time. - -For instance, rather than redefining "caml_young_limit": -\begin{verbatim} -extern int caml_young_limit; -\end{verbatim} -which breaks in OCaml $\ge$ 4.10, you should include the "minor_gc" header: -\begin{verbatim} -#include -\end{verbatim} - -\subsection{ss:c-internal-macros}{OCaml version macros} -Finally, if including the right headers is not enough, or if you need to support -version older than OCaml 4.04, the header file "caml/version.h" should help -you to define your own compatibility layer. -This file provides few macros defining the current OCaml version. -In particular, the "OCAML_VERSION" macro describes the current version, -its format is "MmmPP". -For example, if you need some specific handling for versions older than 4.10.0, -you could write -\begin{verbatim} -#include -#if OCAML_VERSION >= 41000 -... -#else -... -#endif -\end{verbatim} diff --git a/manual/manual/cmds/lexyacc.etex b/manual/manual/cmds/lexyacc.etex deleted file mode 100644 index ad6d41ba..00000000 --- a/manual/manual/cmds/lexyacc.etex +++ /dev/null @@ -1,727 +0,0 @@ -\chapter{Lexer and parser generators (ocamllex, ocamlyacc)} -\label{c:ocamlyacc} -%HEVEA\cutname{lexyacc.html} - -This chapter describes two program generators: "ocamllex", that -produces a lexical analyzer from a set of regular expressions with -associated semantic actions, and "ocamlyacc", that produces a parser -from a grammar with associated semantic actions. - -These program generators are very close to the well-known "lex" and -"yacc" commands that can be found in most C programming environments. -This chapter assumes a working knowledge of "lex" and "yacc": while -it describes the input syntax for "ocamllex" and "ocamlyacc" and the -main differences with "lex" and "yacc", it does not explain the basics -of writing a lexer or parser description in "lex" and "yacc". Readers -unfamiliar with "lex" and "yacc" are referred to ``Compilers: -principles, techniques, and tools'' by Aho, Sethi and Ullman -(Addison-Wesley, 1986), or ``Lex $\&$ Yacc'', by Levine, Mason and -Brown (O'Reilly, 1992). - -\section{s:ocamllex-overview}{Overview of \texttt{ocamllex}} - -The "ocamllex" command produces a lexical analyzer from a set of regular -expressions with attached semantic actions, in the style of -"lex". Assuming the input file is \var{lexer}".mll", executing -\begin{alltt} - ocamllex \var{lexer}.mll -\end{alltt} -produces OCaml code for a lexical analyzer in file \var{lexer}".ml". -This file defines one lexing function per entry point in the lexer -definition. These functions have the same names as the entry -points. Lexing functions take as argument a lexer buffer, and return -the semantic attribute of the corresponding entry point. - -Lexer buffers are an abstract data type implemented in the standard -library module "Lexing". The functions "Lexing.from_channel", -"Lexing.from_string" and "Lexing.from_function" create -lexer buffers that read from an input channel, a character string, or -any reading function, respectively. (See the description of module -"Lexing" in chapter~\ref{c:stdlib}.) - -When used in conjunction with a parser generated by "ocamlyacc", the -semantic actions compute a value belonging to the type "token" defined -by the generated parsing module. (See the description of "ocamlyacc" -below.) - -\subsection{ss:ocamllex-options}{Options} -The following command-line options are recognized by "ocamllex". - -\begin{options} - -\item["-ml"] -Output code that does not use OCaml's built-in automata -interpreter. Instead, the automaton is encoded by OCaml functions. -This option improves performance when using the native compiler, but -decreases it when using the bytecode compiler. - -\item["-o" \var{output-file}] -Specify the name of the output file produced by "ocamllex". -The default is the input file name with its extension replaced by ".ml". - -\item["-q"] -Quiet mode. "ocamllex" normally outputs informational messages -to standard output. They are suppressed if option "-q" is used. - -\item["-v" or "-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-help" or "--help"] -Display a short usage summary and exit. -% -\end{options} - -\section{s:ocamllex-syntax}{Syntax of lexer definitions} - -The format of lexer definitions is as follows: -\begin{alltt} -\{ \var{header} \} -let \var{ident} = \var{regexp} \ldots -[refill \{ \var{refill-handler} \}] -rule \var{entrypoint} [\nth{arg}{1}\ldots{} \nth{arg}{n}] = - parse \var{regexp} \{ \var{action} \} - | \ldots - | \var{regexp} \{ \var{action} \} -and \var{entrypoint} [\nth{arg}{1}\ldots{} \nth{arg}{n}] = - parse \ldots -and \ldots -\{ \var{trailer} \} -\end{alltt} -Comments are delimited by "(*" and "*)", as in OCaml. -The "parse" keyword, can be replaced by the "shortest" keyword, with -the semantic consequences explained below. - -Refill handlers are a recent (optional) feature introduced in 4.02, -documented below in subsection~\ref{ss:refill-handlers}. - -\subsection{ss:ocamllex-header-trailer}{Header and trailer} -The {\it header} and {\it trailer} sections are arbitrary OCaml -text enclosed in curly braces. Either or both can be omitted. If -present, the header text is copied as is at the beginning of the -output file and the trailer text at the end. Typically, the -header section contains the "open" directives required -by the actions, and possibly some auxiliary functions used in the -actions. - -\subsection{ss:ocamllex-named-regexp}{Naming regular expressions} - -Between the header and the entry points, one can give names to -frequently-occurring regular expressions. This is written -@"let" ident "=" regexp@. -In regular expressions that follow this declaration, the identifier -\var{ident} can be used as shorthand for \var{regexp}. - -\subsection{ss:ocamllex-entry-points}{Entry points} - -The names of the entry points must be valid identifiers for OCaml -values (starting with a lowercase letter). -Similarly, the arguments \texttt{\var{arg$_1$}\ldots{} -\var{arg$_n$}} must be valid identifiers for OCaml. -Each entry point becomes an -OCaml function that takes $n+1$ arguments, -the extra implicit last argument being of type "Lexing.lexbuf". -Characters are read from the "Lexing.lexbuf" argument and matched -against the regular expressions provided in the rule, until a prefix -of the input matches one of the rule. The corresponding action is -then evaluated and returned as the result of the function. - - -If several regular expressions match a prefix of the input, the -``longest match'' rule applies: the regular expression that matches -the longest prefix of the input is selected. In case of tie, the -regular expression that occurs earlier in the rule is selected. - -However, if lexer rules are introduced with the "shortest" keyword in -place of the "parse" keyword, then the ``shortest match'' rule applies: -the shortest prefix of the input is selected. In case of tie, the -regular expression that occurs earlier in the rule is still selected. -This feature is not intended for use in ordinary lexical analyzers, it -may facilitate the use of "ocamllex" as a simple text processing tool. - - - -\subsection{ss:ocamllex-regexp}{Regular expressions} - -The regular expressions are in the style of "lex", with a more -OCaml-like syntax. -\begin{syntax} -regexp: - \ldots -\end{syntax} -\begin{options} - -\item[@"'" regular-char || escape-sequence "'"@] -A character constant, with the same syntax as OCaml character -constants. Match the denoted character. - -\item["_"] -(underscore) Match any character. - -\item[@"eof"@] -Match the end of the lexer input.\\ -{\bf Note:} On some systems, with interactive input, an end-of-file -may be followed by more characters. However, "ocamllex" will not -correctly handle regular expressions that contain "eof" followed by -something else. - -\item[@'"' { string-character } '"'@] -A string constant, with the same syntax as OCaml string -constants. Match the corresponding sequence of characters. - -\item[@'[' character-set ']'@] -Match any single character belonging to the given -character set. Valid character sets are: single -character constants @"'" @c@ "'"@; ranges of characters -@"'" @c@_1 "'" "-" "'" @c@_2 "'"@ (all characters between $c_1$ and $c_2$, -inclusive); and the union of two or more character sets, denoted by -concatenation. - -\item[@'[' '^' character-set ']'@] -Match any single character not belonging to the given character set. - - -\item[@regexp_1 '#' regexp_2@] -(difference of character sets) -Regular expressions @regexp_1@ and @regexp_2@ must be character sets -defined with @'['\ldots ']'@ (or a single character expression or -underscore "_"). -Match the difference of the two specified character sets. - - -\item[@regexp '*'@] -(repetition) Match the concatenation of zero or more -strings that match @regexp@. - -\item[@regexp '+'@] -(strict repetition) Match the concatenation of one or more -strings that match @regexp@. - -\item[@regexp '?'@] -(option) Match the empty string, or a string matching @regexp@. - -\item[@regexp_1 '|' regexp_2@] -(alternative) Match any string that matches @regexp_1@ or @regexp_2@ - -\item[@regexp_1 regexp_2@] -(concatenation) Match the concatenation of two strings, the first -matching @regexp_1@, the second matching @regexp_2@. - -\item[@'(' regexp ')'@] -Match the same strings as @regexp@. - -\item[@ident@] -Reference the regular expression bound to @ident@ by an earlier -@"let" ident "=" regexp@ definition. - -\item[@regexp 'as' ident@] -Bind the substring matched by @regexp@ to identifier @ident@. -\end{options} - -Concerning the precedences of operators, "#" has the highest precedence, -followed by "*", "+" and "?", -then concatenation, then "|" (alternation), then "as". - -\subsection{ss:ocamllex-actions}{Actions} - -The actions are arbitrary OCaml expressions. They are evaluated in -a context where the identifiers defined by using the "as" construct -are bound to subparts of the matched string. -Additionally, "lexbuf" is bound to the current lexer -buffer. Some typical uses for "lexbuf", in conjunction with the -operations on lexer buffers provided by the "Lexing" standard library -module, are listed below. - -\begin{options} -\item["Lexing.lexeme lexbuf"] -Return the matched string. - -\item["Lexing.lexeme_char lexbuf "$n$] -Return the $n\th$ -character in the matched string. The first character corresponds to $n = 0$. - -\item["Lexing.lexeme_start lexbuf"] -Return the absolute position in the input text of the beginning of the -matched string (i.e. the offset of the first character of the matched -string). The first character read from the input text has offset 0. - -\item["Lexing.lexeme_end lexbuf"] -Return the absolute position in the input text of the end of the -matched string (i.e. the offset of the first character after the -matched string). The first character read from the input text has -offset 0. - -\newcommand{\sub}[1]{$_{#1}$}% -\item[\var{entrypoint} {[\var{exp\sub{1}}\ldots{} \var{exp\sub{n}}]} "lexbuf"] -(Where \var{entrypoint} is the name of another entry point in the same -lexer definition.) Recursively call the lexer on the given entry point. -Notice that "lexbuf" is the last argument. -Useful for lexing nested comments, for example. - -\end{options} - -\subsection{ss:ocamllex-variables}{Variables in regular expressions} -The "as" construct is similar to ``\emph{groups}'' as provided by -numerous regular expression packages. -The type of these variables can be "string", "char", "string option" -or "char option". - -We first consider the case of linear patterns, that is the case when -all "as" bound variables are distinct. -In @regexp 'as' ident@, the type of @ident@ normally is "string" (or -"string option") except -when @regexp@ is a character constant, an underscore, a string -constant of length one, a character set specification, or an -alternation of those. Then, the type of @ident@ is "char" (or "char -option"). -Option types are introduced when overall rule matching does not -imply matching of the bound sub-pattern. This is in particular the -case of @'(' regexp 'as' ident ')' '?'@ and of -@regexp_1 '|' '(' regexp_2 'as' ident ')'@. - -There is no linearity restriction over "as" bound variables. -When a variable is bound more than once, the previous rules are to be -extended as follows: -\begin{itemize} -\item A variable is a "char" variable when all its occurrences bind -"char" occurrences in the previous sense. -\item A variable is an "option" variable when the overall expression -can be matched without binding this variable. -\end{itemize} -For instance, in -"('a' as x) | ( 'a' (_ as x) )" the variable "x" is of type -"char", whereas in -"(\"ab\" as x) | ( 'a' (_ as x) ? )" the variable "x" is of type -"string option". - - -In some cases, a successful match may not yield a unique set of bindings. -For instance the matching of \verb+aba+ by the regular expression -"(('a'|\"ab\") as x) ((\"ba\"|'a') as y)" may result in binding -either -\verb+x+ to \verb+"ab"+ and \verb+y+ to \verb+"a"+, or -\verb+x+ to \verb+"a"+ and \verb+y+ to \verb+"ba"+. -The automata produced "ocamllex" on such ambiguous regular -expressions will select one of the possible resulting sets of -bindings. -The selected set of bindings is purposely left unspecified. - -\subsection{ss:refill-handlers}{Refill handlers} - -By default, when ocamllex reaches the end of its lexing buffer, it -will silently call the "refill_buff" function of "lexbuf" structure -and continue lexing. It is sometimes useful to be able to take control -of refilling action; typically, if you use a library for asynchronous -computation, you may want to wrap the refilling action in a delaying -function to avoid blocking synchronous operations. - -Since OCaml 4.02, it is possible to specify a \var{refill-handler}, -a function that will be called when refill happens. It is passed the -continuation of the lexing, on which it has total control. The OCaml -expression used as refill action should have a type that is an -instance of -\begin{verbatim} - (Lexing.lexbuf -> 'a) -> Lexing.lexbuf -> 'a -\end{verbatim} -where the first argument is the continuation which captures the -processing ocamllex would usually perform (refilling the buffer, then -calling the lexing function again), and the result type that -instantiates ['a] should unify with the result type of all lexing -rules. - -As an example, consider the following lexer that is parametrized over -an arbitrary monad: -\begin{verbatim} -{ -type token = EOL | INT of int | PLUS - -module Make (M : sig - type 'a t - val return: 'a -> 'a t - val bind: 'a t -> ('a -> 'b t) -> 'b t - val fail : string -> 'a t - - (* Set up lexbuf *) - val on_refill : Lexing.lexbuf -> unit t - end) -= struct - -let refill_handler k lexbuf = - M.bind (M.on_refill lexbuf) (fun () -> k lexbuf) - -} - -refill {refill_handler} - -rule token = parse -| [' ' '\t'] - { token lexbuf } -| '\n' - { M.return EOL } -| ['0'-'9']+ as i - { M.return (INT (int_of_string i)) } -| '+' - { M.return PLUS } -| _ - { M.fail "unexpected character" } -{ -end -} -\end{verbatim} - -\subsection{ss:ocamllex-reserved-ident}{Reserved identifiers} - -All identifiers starting with "__ocaml_lex" are reserved for use by -"ocamllex"; do not use any such identifier in your programs. - - -\section{s:ocamlyacc-overview}{Overview of \texttt{ocamlyacc}} - -The "ocamlyacc" command produces a parser from a context-free grammar -specification with attached semantic actions, in the style of "yacc". -Assuming the input file is \var{grammar}".mly", executing -\begin{alltt} - ocamlyacc \var{options} \var{grammar}.mly -\end{alltt} -produces OCaml code for a parser in the file \var{grammar}".ml", -and its interface in file \var{grammar}".mli". - -The generated module defines one parsing function per entry point in -the grammar. These functions have the same names as the entry points. -Parsing functions take as arguments a lexical analyzer (a function -from lexer buffers to tokens) and a lexer buffer, and return the -semantic attribute of the corresponding entry point. Lexical analyzer -functions are usually generated from a lexer specification by the -"ocamllex" program. Lexer buffers are an abstract data type -implemented in the standard library module "Lexing". Tokens are values from -the concrete type "token", defined in the interface file -\var{grammar}".mli" produced by "ocamlyacc". - -\section{s:ocamlyacc-syntax}{Syntax of grammar definitions} - -Grammar definitions have the following format: -\begin{alltt} -\%\{ - \var{header} -\%\} - \var{declarations} -\%\% - \var{rules} -\%\% - \var{trailer} -\end{alltt} - -Comments are enclosed between \verb|/*| and \verb|*/| (as in C) in the -``declarations'' and ``rules'' sections, and between \verb|(*| and -\verb|*)| (as in OCaml) in the ``header'' and ``trailer'' sections. - -\subsection{ss:ocamlyacc-header-trailer}{Header and trailer} - -The header and the trailer sections are OCaml code that is copied -as is into file \var{grammar}".ml". Both sections are optional. The header -goes at the beginning of the output file; it usually contains -"open" directives and auxiliary functions required by the semantic -actions of the rules. The trailer goes at the end of the output file. - -\subsection{ss:ocamlyacc-declarations}{Declarations} - -Declarations are given one per line. They all start with a \verb"%" sign. - -\begin{options} - -\item[@"%token" constr \ldots constr@] -Declare the given symbols @constr \ldots constr@ -as tokens (terminal symbols). These symbols -are added as constant constructors for the "token" concrete type. - -\item[@"%token" "<" typexpr ">" constr \ldots constr@] -Declare the given symbols @constr \ldots constr@ as tokens with an -attached attribute of the -given type. These symbols are added as constructors with arguments of -the given type for the "token" concrete type. The @typexpr@ part is -an arbitrary OCaml type expression, except that all type -constructor names must be fully qualified (e.g. "Modname.typename") -for all types except standard built-in types, even if the proper -\verb|open| directives (e.g. \verb|open Modname|) were given in the -header section. That's because the header is copied only to the ".ml" -output file, but not to the ".mli" output file, while the @typexpr@ part -of a \verb"%token" declaration is copied to both. - -\item[@"%start" symbol \ldots symbol@] -Declare the given symbols as entry points for the grammar. For each -entry point, a parsing function with the same name is defined in the -output module. Non-terminals that are not declared as entry points -have no such parsing function. Start symbols must be given a type with -the \verb|%type| directive below. - -\item[@"%type" "<" typexpr ">" symbol \ldots symbol@] -Specify the type of the semantic attributes for the given symbols. -This is mandatory for start symbols only. Other nonterminal symbols -need not be given types by hand: these types will be inferred when -running the output files through the OCaml compiler (unless the -\verb"-s" option is in effect). The @typexpr@ part is an arbitrary OCaml -type expression, except that all type constructor names must be -fully qualified, as explained above for "%token". - -\item[@"%left" symbol \ldots symbol@] -\item[@"%right" symbol \ldots symbol@] -\item[@"%nonassoc" symbol \ldots symbol@] - -Associate precedences and associativities to the given symbols. All -symbols on the same line are given the same precedence. They have -higher precedence than symbols declared before in a \verb"%left", -\verb"%right" or \verb"%nonassoc" line. They have lower precedence -than symbols declared after in a \verb"%left", \verb"%right" or -\verb"%nonassoc" line. The symbols are declared to associate to the -left (\verb"%left"), to the right (\verb"%right"), or to be -non-associative (\verb"%nonassoc"). The symbols are usually tokens. -They can also be dummy nonterminals, for use with the \verb"%prec" -directive inside the rules. - -The precedence declarations are used in the following way to -resolve reduce/reduce and shift/reduce conflicts: -\begin{itemize} -\item Tokens and rules have precedences. By default, the precedence - of a rule is the precedence of its rightmost terminal. You - can override this default by using the @"%prec"@ directive in the rule. -\item A reduce/reduce conflict - is resolved in favor of the first rule (in the order given by the - source file), and "ocamlyacc" outputs a warning. -\item A shift/reduce conflict - is resolved by comparing the precedence of the rule to be - reduced with the precedence of the token to be shifted. If the - precedence of the rule is higher, then the rule will be reduced; - if the precedence of the token is higher, then the token will - be shifted. -\item A shift/reduce conflict between a rule and a token with the - same precedence will be resolved using the associativity: if the - token is left-associative, then the parser will reduce; if the - token is right-associative, then the parser will shift. If the - token is non-associative, then the parser will declare a syntax - error. -\item When a shift/reduce conflict cannot be resolved using the above - method, then "ocamlyacc" will output a warning and the parser will - always shift. -\end{itemize} - -\end{options} - -\subsection{ss:ocamlyacc-rules}{Rules} - -The syntax for rules is as usual: -\begin{alltt} -\var{nonterminal} : - \var{symbol} \ldots \var{symbol} \{ \var{semantic-action} \} - | \ldots - | \var{symbol} \ldots \var{symbol} \{ \var{semantic-action} \} -; -\end{alltt} -% -Rules can also contain the \verb"%prec "{\it symbol} directive in the -right-hand side part, to override the default precedence and -associativity of the rule with the precedence and associativity of the -given symbol. - -Semantic actions are arbitrary OCaml expressions, that -are evaluated to produce the semantic attribute attached to -the defined nonterminal. The semantic actions can access the -semantic attributes of the symbols in the right-hand side of -the rule with the \verb"$" notation: \verb"$1" is the attribute for the -first (leftmost) symbol, \verb"$2" is the attribute for the second -symbol, etc. - -The rules may contain the special symbol "error" to indicate -resynchronization points, as in "yacc". - -Actions occurring in the middle of rules are not supported. - -Nonterminal symbols are like regular OCaml symbols, except that they -cannot end with "'" (single quote). - -\subsection{ss:ocamlyacc-error-handling}{Error handling} - -Error recovery is supported as follows: when the parser reaches an -error state (no grammar rules can apply), it calls a function named -"parse_error" with the string "\"syntax error\"" as argument. The default -"parse_error" function does nothing and returns, thus initiating error -recovery (see below). The user can define a customized "parse_error" -function in the header section of the grammar file. - -The parser also enters error recovery mode if one of the grammar -actions raises the "Parsing.Parse_error" exception. - -In error recovery mode, the parser discards states from the -stack until it reaches a place where the error token can be shifted. -It then discards tokens from the input until it finds three successive -tokens that can be accepted, and starts processing with the first of -these. If no state can be uncovered where the error token can be -shifted, then the parser aborts by raising the "Parsing.Parse_error" -exception. - -Refer to documentation on "yacc" for more details and guidance in how -to use error recovery. - -\section{s:ocamlyacc-options}{Options} - -The "ocamlyacc" command recognizes the following options: - -\begin{options} - -\item["-b"{\it prefix}] -Name the output files {\it prefix}".ml", {\it prefix}".mli", -{\it prefix}".output", instead of the default naming convention. - -\item["-q"] -This option has no effect. - -\item["-v"] -Generate a description of the parsing tables and a report on conflicts -resulting from ambiguities in the grammar. The description is put in -file \var{grammar}".output". - -\item["-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-"] -Read the grammar specification from standard input. The default -output file names are "stdin.ml" and "stdin.mli". - -\item["--" \var{file}] -Process \var{file} as the grammar specification, even if its name -starts with a dash (-) character. This option must be the last on the -command line. - -\end{options} - -At run-time, the "ocamlyacc"-generated parser can be debugged by -setting the "p" option in the "OCAMLRUNPARAM" environment variable -(see section~\ref{s:ocamlrun-options}). This causes the pushdown -automaton executing the parser to print a trace of its action (tokens -shifted, rules reduced, etc). The trace mentions rule numbers and -state numbers that can be interpreted by looking at the file -\var{grammar}".output" generated by "ocamlyacc -v". - -\section{s:lexyacc-example}{A complete example} - -The all-time favorite: a desk calculator. This program reads -arithmetic expressions on standard input, one per line, and prints -their values. Here is the grammar definition: -\begin{verbatim} - /* File parser.mly */ - %token INT - %token PLUS MINUS TIMES DIV - %token LPAREN RPAREN - %token EOL - %left PLUS MINUS /* lowest precedence */ - %left TIMES DIV /* medium precedence */ - %nonassoc UMINUS /* highest precedence */ - %start main /* the entry point */ - %type main - %% - main: - expr EOL { $1 } - ; - expr: - INT { $1 } - | LPAREN expr RPAREN { $2 } - | expr PLUS expr { $1 + $3 } - | expr MINUS expr { $1 - $3 } - | expr TIMES expr { $1 * $3 } - | expr DIV expr { $1 / $3 } - | MINUS expr %prec UMINUS { - $2 } - ; -\end{verbatim} -Here is the definition for the corresponding lexer: -\begin{verbatim} - (* File lexer.mll *) - { - open Parser (* The type token is defined in parser.mli *) - exception Eof - } - rule token = parse - [' ' '\t'] { token lexbuf } (* skip blanks *) - | ['\n' ] { EOL } - | ['0'-'9']+ as lxm { INT(int_of_string lxm) } - | '+' { PLUS } - | '-' { MINUS } - | '*' { TIMES } - | '/' { DIV } - | '(' { LPAREN } - | ')' { RPAREN } - | eof { raise Eof } -\end{verbatim} -Here is the main program, that combines the parser with the lexer: -\begin{verbatim} - (* File calc.ml *) - let _ = - try - let lexbuf = Lexing.from_channel stdin in - while true do - let result = Parser.main Lexer.token lexbuf in - print_int result; print_newline(); flush stdout - done - with Lexer.Eof -> - exit 0 -\end{verbatim} -To compile everything, execute: -\begin{verbatim} - ocamllex lexer.mll # generates lexer.ml - ocamlyacc parser.mly # generates parser.ml and parser.mli - ocamlc -c parser.mli - ocamlc -c lexer.ml - ocamlc -c parser.ml - ocamlc -c calc.ml - ocamlc -o calc lexer.cmo parser.cmo calc.cmo -\end{verbatim} - -\section{s:lexyacc-common-errors}{Common errors} - -\begin{options} - -\item[ocamllex: transition table overflow, automaton is too big] - -The deterministic automata generated by "ocamllex" are limited to at -most 32767 transitions. The message above indicates that your lexer -definition is too complex and overflows this limit. This is commonly -caused by lexer definitions that have separate rules for each of the -alphabetic keywords of the language, as in the following example. -\begin{verbatim} -rule token = parse - "keyword1" { KWD1 } -| "keyword2" { KWD2 } -| ... -| "keyword100" { KWD100 } -| ['A'-'Z' 'a'-'z'] ['A'-'Z' 'a'-'z' '0'-'9' '_'] * as id - { IDENT id} -\end{verbatim} -To keep the generated automata small, rewrite those definitions with -only one general ``identifier'' rule, followed by a hashtable lookup -to separate keywords from identifiers: -\begin{verbatim} -{ let keyword_table = Hashtbl.create 53 - let _ = - List.iter (fun (kwd, tok) -> Hashtbl.add keyword_table kwd tok) - [ "keyword1", KWD1; - "keyword2", KWD2; ... - "keyword100", KWD100 ] -} -rule token = parse - ['A'-'Z' 'a'-'z'] ['A'-'Z' 'a'-'z' '0'-'9' '_'] * as id - { try - Hashtbl.find keyword_table id - with Not_found -> - IDENT id } -\end{verbatim} - -\item[ocamllex: Position memory overflow, too many bindings] -The deterministic automata generated by "ocamllex" maintain a table of -positions inside the scanned lexer buffer. The size of this table is -limited to at most 255 cells. This error should not show up in normal -situations. - -\end{options} diff --git a/manual/manual/cmds/native.etex b/manual/manual/cmds/native.etex deleted file mode 100644 index ee156218..00000000 --- a/manual/manual/cmds/native.etex +++ /dev/null @@ -1,267 +0,0 @@ -\chapter{Native-code compilation (ocamlopt)} \label{c:nativecomp} -%HEVEA\cutname{native.html} - -This chapter describes the OCaml high-performance -native-code compiler "ocamlopt", which compiles OCaml source files to -native code object files and links these object files to produce -standalone executables. - -The native-code compiler is only available on certain platforms. -It produces code that runs faster than the bytecode produced by -"ocamlc", at the cost of increased compilation time and executable code -size. Compatibility with the bytecode compiler is extremely high: the -same source code should run identically when compiled with "ocamlc" and -"ocamlopt". - -It is not possible to mix native-code object files produced by "ocamlopt" -with bytecode object files produced by "ocamlc": a program must be -compiled entirely with "ocamlopt" or entirely with "ocamlc". Native-code -object files produced by "ocamlopt" cannot be loaded in the toplevel -system "ocaml". - -\section{s:native-overview}{Overview of the compiler} - -The "ocamlopt" command has a command-line interface very close to that -of "ocamlc". It accepts the same types of arguments, and processes them -sequentially, after all options have been processed: - -\begin{itemize} -\item -Arguments ending in ".mli" are taken to be source files for -compilation unit interfaces. Interfaces specify the names exported by -compilation units: they declare value names with their types, define -public data types, declare abstract data types, and so on. From the -file \var{x}".mli", the "ocamlopt" compiler produces a compiled interface -in the file \var{x}".cmi". The interface produced is identical to that -produced by the bytecode compiler "ocamlc". - -\item -Arguments ending in ".ml" are taken to be source files for compilation -unit implementations. Implementations provide definitions for the -names exported by the unit, and also contain expressions to be -evaluated for their side-effects. From the file \var{x}".ml", the "ocamlopt" -compiler produces two files: \var{x}".o", containing native object code, -and \var{x}".cmx", containing extra information for linking and -optimization of the clients of the unit. The compiled implementation -should always be referred to under the name \var{x}".cmx" (when given -a ".o" or ".obj" file, "ocamlopt" assumes that it contains code compiled from C, -not from OCaml). - -The implementation is checked against the interface file \var{x}".mli" -(if it exists) as described in the manual for "ocamlc" -(chapter~\ref{c:camlc}). - -\item -Arguments ending in ".cmx" are taken to be compiled object code. These -files are linked together, along with the object files obtained -by compiling ".ml" arguments (if any), and the OCaml standard -library, to produce a native-code executable program. The order in -which ".cmx" and ".ml" arguments are presented on the command line is -relevant: compilation units are initialized in that order at -run-time, and it is a link-time error to use a component of a unit -before having initialized it. Hence, a given \var{x}".cmx" file must come -before all ".cmx" files that refer to the unit \var{x}. - -\item -Arguments ending in ".cmxa" are taken to be libraries of object code. -Such a library packs in two files (\var{lib}".cmxa" and \var{lib}".a"/".lib") -a set of object files (".cmx" and ".o"/".obj" files). Libraries are build with -"ocamlopt -a" (see the description of the "-a" option below). The object -files contained in the library are linked as regular ".cmx" files (see -above), in the order specified when the library was built. The only -difference is that if an object file contained in a library is not -referenced anywhere in the program, then it is not linked in. - -\item -Arguments ending in ".c" are passed to the C compiler, which generates -a ".o"/".obj" object file. This object file is linked with the program. - -\item -Arguments ending in ".o", ".a" or ".so" (".obj", ".lib" and ".dll" -under Windows) are assumed to be C object files and -libraries. They are linked with the program. - -\end{itemize} - -The output of the linking phase is a regular Unix or Windows -executable file. It does not need "ocamlrun" to run. - -The compiler is able to emit some information on its internal stages: - -\begin{itemize} -\item -% The following two paragraphs are a duplicate from the description of the batch compiler. -".cmt" files for the implementation of the compilation unit -and ".cmti" for signatures if the option "-bin-annot" is passed to it (see the -description of "-bin-annot" below). -Each such file contains a typed abstract syntax tree (AST), that is produced -during the type checking procedure. This tree contains all available information -about the location and the specific type of each term in the source file. -The AST is partial if type checking was unsuccessful. - -These ".cmt" and ".cmti" files are typically useful for code inspection tools. - -\item -".cmir-linear" files for the implementation of the compilation unit -if the option "-save-ir-after scheduling" is passed to it. -Each such file contains a low-level intermediate representation, -produced by the instruction scheduling pass. - -An external tool can perform low-level optimisations, -such as code layout, by transforming a ".cmir-linear" file. -To continue compilation, the compiler can be invoked with (a possibly modified) -".cmir-linear" file as an argument, instead of the corresponding source file. -\end{itemize} - -\section{s:native-options}{Options} - -The following command-line options are recognized by "ocamlopt". -The options "-pack", "-a", "-shared", "-c" and "-output-obj" are mutually -exclusive. - -% Configure boolean variables used by the macros in unified-options.etex -\compfalse -\nattrue -\topfalse -% unified-options gathers all options across the native/bytecode -% compilers and toplevel -\input{unified-options.tex} - -\paragraph{Options for the 32-bit x86 architecture} -The 32-bit code generator for Intel/AMD x86 processors ("i386" -architecture) supports the -following additional option: - -\begin{options} -\item["-ffast-math"] Use the processor instructions to compute -trigonometric and exponential functions, instead of calling the -corresponding library routines. The functions affected are: -"atan", "atan2", "cos", "log", "log10", "sin", "sqrt" and "tan". -The resulting code runs faster, but the range of supported arguments -and the precision of the result can be reduced. In particular, -trigonometric operations "cos", "sin", "tan" have their range reduced to -$[-2^{64}, 2^{64}]$. -\end{options} - -\paragraph{Options for the 64-bit x86 architecture} -The 64-bit code generator for Intel/AMD x86 processors ("amd64" -architecture) supports the following additional options: - -\begin{options} -\item["-fPIC"] Generate position-independent machine code. This is -the default. -\item["-fno-PIC"] Generate position-dependent machine code. -\end{options} - -\paragraph{Options for the PowerPC architecture} -The PowerPC code generator supports the following additional options: - -\begin{options} -\item["-flarge-toc"] Enables the PowerPC large model allowing the TOC (table of -contents) to be arbitrarily large. This is the default since 4.11. -\item["-fsmall-toc"] Enables the PowerPC small model allowing the TOC to be up -to 64 kbytes per compilation unit. Prior to 4.11 this was the default -behaviour. -\end{options} - -\paragraph{Contextual control of command-line options} - -The compiler command line can be modified ``from the outside'' -with the following mechanisms. These are experimental -and subject to change. They should be used only for experimental and -development work, not in released packages. - -\begin{options} -\item["OCAMLPARAM" \rm(environment variable)] -A set of arguments that will be inserted before or after the arguments from -the command line. Arguments are specified in a comma-separated list -of "name=value" pairs. A "_" is used to specify the position of -the command line arguments, i.e. "a=x,_,b=y" means that "a=x" should be -executed before parsing the arguments, and "b=y" after. Finally, -an alternative separator can be specified as the -first character of the string, within the set ":|; ,". -\item["ocaml_compiler_internal_params" \rm(file in the stdlib directory)] -A mapping of file names to lists of arguments that -will be added to the command line (and "OCAMLPARAM") arguments. -\item["OCAML_FLEXLINK" \rm(environment variable)] -Alternative executable to use on native -Windows for "flexlink" instead of the -configured value. Primarily used for bootstrapping. -\end{options} - -\section{s:native-common-errors}{Common errors} - -The error messages are almost identical to those of "ocamlc". -See section~\ref{s:comp-errors}. - -\section{s:native:running-executable}{Running executables produced by ocamlopt} - -Executables generated by "ocamlopt" are native, stand-alone executable -files that can be invoked directly. They do -not depend on the "ocamlrun" bytecode runtime system nor on -dynamically-loaded C/OCaml stub libraries. - -During execution of an "ocamlopt"-generated executable, -the following environment variables are also consulted: -\begin{options} -\item["OCAMLRUNPARAM"] Same usage as in "ocamlrun" - (see section~\ref{s:ocamlrun-options}), except that option "l" - is ignored (the operating system's stack size limit - is used instead). -\item["CAMLRUNPARAM"] If "OCAMLRUNPARAM" is not found in the - environment, then "CAMLRUNPARAM" will be used instead. If - "CAMLRUNPARAM" is not found, then the default values will be used. -\end{options} - -\section{s:compat-native-bytecode}{Compatibility with the bytecode compiler} - -This section lists the known incompatibilities between the bytecode -compiler and the native-code compiler. Except on those points, the two -compilers should generate code that behave identically. - -\begin{itemize} - -\item Signals are detected only when the program performs an -allocation in the heap. That is, if a signal is delivered while in a -piece of code that does not allocate, its handler will not be called -until the next heap allocation. - -\item On ARM and PowerPC processors (32 and 64 bits), fused - multiply-add (FMA) instructions can be generated for a - floating-point multiplication followed by a floating-point addition - or subtraction, as in "x *. y +. z". The FMA instruction avoids - rounding the intermediate result "x *. y", which is generally - beneficial, but produces floating-point results that differ slightly - from those produced by the bytecode interpreter. - -\item On Intel/AMD x86 processors in 32-bit mode, -some intermediate results in floating-point computations are -kept in extended precision rather than being rounded to double -precision like the bytecode compiler always does. Floating-point -results can therefore differ slightly between bytecode and native code. - -\item The native-code compiler performs a number of optimizations that -the bytecode compiler does not perform, especially when the Flambda -optimizer is active. In particular, the native-code compiler -identifies and eliminates ``dead code'', i.e.\ computations that do -not contribute to the results of the program. For example, -\begin{verbatim} - let _ = ignore M.f -\end{verbatim} -contains a reference to compilation unit "M" when compiled to -bytecode. This reference forces "M" to be linked and its -initialization code to be executed. The native-code compiler -eliminates the reference to "M", hence the compilation unit "M" may -not be linked and executed. A workaround is to compile "M" with the -"-linkall" flag so that it will always be linked and executed, even if -not referenced. See also the "Sys.opaque_identity" function from the -"Sys" standard library module. - -\item Before 4.10, stack overflows, typically caused by excessively - deep recursion, are not always turned into a "Stack_overflow" - exception like with the bytecode compiler. The runtime system makes - a best effort to trap stack overflows and raise the "Stack_overflow" - exception, but sometimes it fails and a ``segmentation fault'' or - another system fault occurs instead. - -\end{itemize} diff --git a/manual/manual/cmds/ocamldep.etex b/manual/manual/cmds/ocamldep.etex deleted file mode 100644 index 2b761e16..00000000 --- a/manual/manual/cmds/ocamldep.etex +++ /dev/null @@ -1,216 +0,0 @@ -\chapter{Dependency generator (ocamldep)} \label{c:camldep} -%HEVEA\cutname{depend.html} - -The "ocamldep" command scans a set of OCaml source files -(".ml" and ".mli" files) for references to external compilation units, -and outputs dependency lines in a format suitable for the "make" -utility. This ensures that "make" will compile the source files in the -correct order, and recompile those files that need to when a source -file is modified. - -The typical usage is: -\begin{alltt} - ocamldep \var{options} *.mli *.ml > .depend -\end{alltt} -where "*.mli *.ml" expands to all source files in the current -directory and ".depend" is the file that should contain the -dependencies. (See below for a typical "Makefile".) - -Dependencies are generated both for compiling with the bytecode -compiler "ocamlc" and with the native-code compiler "ocamlopt". - -\section{s:ocamldep-options}{Options} - -The following command-line options are recognized by "ocamldep". - -\begin{options} - -\item["-absname"] -Show absolute filenames in error messages. - -\item["-all"] -Generate dependencies on all required files, rather than assuming -implicit dependencies. - -\item["-allow-approx"] -Allow falling back on a lexer-based approximation when parsing fails. - -\item["-args" \var{filename}] - Read additional newline-terminated command line arguments from \var{filename}. - -\item["-args0" \var{filename}] - Read additional null character terminated command line arguments from \var{filename}. - -\item["-as-map"] -For the following files, do not include delayed dependencies for -module aliases. -This option assumes that they are compiled using options -"-no-alias-deps -w -49", and that those files or their interface are -passed with the "-map" option when computing dependencies for other -files. Note also that for dependencies to be correct in the -implementation of a map file, its interface should not coerce any of -the aliases it contains. - -\item["-debug-map"] -Dump the delayed dependency map for each map file. - -\item["-I" \var{directory}] -Add the given directory to the list of directories searched for -source files. If a source file "foo.ml" mentions an external -compilation unit "Bar", a dependency on that unit's interface -"bar.cmi" is generated only if the source for "bar" is found in the -current directory or in one of the directories specified with "-I". -Otherwise, "Bar" is assumed to be a module from the standard library, -and no dependencies are generated. For programs that span multiple -directories, it is recommended to pass "ocamldep" the same "-I" options -that are passed to the compiler. - -\item["-nocwd"] -Do not add current working directory to the list of include directories. - -\item["-impl" \var{file}] -Process \var{file} as a ".ml" file. - -\item["-intf" \var{file}] -Process \var{file} as a ".mli" file. - -\item["-map" \var{file}] -Read and propagate the delayed dependencies for module aliases in -\var{file}, so that the following files will depend on the -exported aliased modules if they use them. See the example below. - -\item["-ml-synonym" \var{.ext}] -Consider the given extension (with leading dot) to be a synonym for .ml. - -\item["-mli-synonym" \var{.ext}] -Consider the given extension (with leading dot) to be a synonym for .mli. - -\item["-modules"] -Output raw dependencies of the form -\begin{verbatim} - filename: Module1 Module2 ... ModuleN -\end{verbatim} -where "Module1", \ldots, "ModuleN" are the names of the compilation -units referenced within the file "filename", but these names are not -resolved to source file names. Such raw dependencies cannot be used -by "make", but can be post-processed by other tools such as "Omake". - -\item["-native"] -Generate dependencies for a pure native-code program (no bytecode -version). When an implementation file (".ml" file) has no explicit -interface file (".mli" file), "ocamldep" generates dependencies on the -bytecode compiled file (".cmo" file) to reflect interface changes. -This can cause unnecessary bytecode recompilations for programs that -are compiled to native-code only. The flag "-native" causes -dependencies on native compiled files (".cmx") to be generated instead -of on ".cmo" files. (This flag makes no difference if all source files -have explicit ".mli" interface files.) - -\item["-one-line"] -Output one line per file, regardless of the length. - -\item["-open" \var{module}] -Assume that module \var{module} is opened before parsing each of the -following files. - -\item["-pp" \var{command}] -Cause "ocamldep" to call the given \var{command} as a preprocessor -for each source file. - -\item["-ppx" \var{command}] -Pipe abstract syntax trees through preprocessor \var{command}. - -\item["-shared"] -Generate dependencies for native plugin files (.cmxs) in addition to -native compiled files (.cmx). - -\item["-slash"] -Under Windows, use a forward slash (/) as the path separator instead -of the usual backward slash ($\backslash$). Under Unix, this option does -nothing. - -\item["-sort"] -Sort files according to their dependencies. - -\item["-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-help" or "--help"] -Display a short usage summary and exit. -% -\end{options} - -\section{s:ocamldep-makefile}{A typical Makefile} - -Here is a template "Makefile" for a OCaml program. - -\begin{verbatim} -OCAMLC=ocamlc -OCAMLOPT=ocamlopt -OCAMLDEP=ocamldep -INCLUDES= # all relevant -I options here -OCAMLFLAGS=$(INCLUDES) # add other options for ocamlc here -OCAMLOPTFLAGS=$(INCLUDES) # add other options for ocamlopt here - -# prog1 should be compiled to bytecode, and is composed of three -# units: mod1, mod2 and mod3. - -# The list of object files for prog1 -PROG1_OBJS=mod1.cmo mod2.cmo mod3.cmo - -prog1: $(PROG1_OBJS) - $(OCAMLC) -o prog1 $(OCAMLFLAGS) $(PROG1_OBJS) - -# prog2 should be compiled to native-code, and is composed of two -# units: mod4 and mod5. - -# The list of object files for prog2 -PROG2_OBJS=mod4.cmx mod5.cmx - -prog2: $(PROG2_OBJS) - $(OCAMLOPT) -o prog2 $(OCAMLFLAGS) $(PROG2_OBJS) - -# Common rules -.SUFFIXES: .ml .mli .cmo .cmi .cmx - -.ml.cmo: - $(OCAMLC) $(OCAMLFLAGS) -c $< - -.mli.cmi: - $(OCAMLC) $(OCAMLFLAGS) -c $< - -.ml.cmx: - $(OCAMLOPT) $(OCAMLOPTFLAGS) -c $< - -# Clean up -clean: - rm -f prog1 prog2 - rm -f *.cm[iox] - -# Dependencies -depend: - $(OCAMLDEP) $(INCLUDES) *.mli *.ml > .depend - -include .depend -\end{verbatim} - -If you use module aliases to give shorter names to modules, you need -to change the above definitions. Assuming that your map file is called -"mylib.mli", here are minimal modifications. -\begin{verbatim} -OCAMLFLAGS=$(INCLUDES) -open Mylib - -mylib.cmi: mylib.mli - $(OCAMLC) $(INCLUDES) -no-alias-deps -w -49 -c $< - -depend: - $(OCAMLDEP) $(INCLUDES) -map mylib.mli $(PROG1_OBJS:.cmo=.ml) > .depend -\end{verbatim} -Note that in this case you should not compute dependencies for -"mylib.mli" together with the other files, hence the need to pass -explicitly the list of files to process. -If "mylib.mli" itself has dependencies, you should compute them using -"-as-map". diff --git a/manual/manual/cmds/ocamldoc.etex b/manual/manual/cmds/ocamldoc.etex deleted file mode 100644 index 65986611..00000000 --- a/manual/manual/cmds/ocamldoc.etex +++ /dev/null @@ -1,1126 +0,0 @@ -\chapter{The documentation generator (ocamldoc)} \label{c:ocamldoc} -%HEVEA\cutname{ocamldoc.html} - -This chapter describes OCamldoc, a tool that generates documentation from -special comments embedded in source files. The comments used by OCamldoc -are of the form "(**"\ldots"*)" and follow the format described -in section \ref{s:ocamldoc-comments}. - -OCamldoc can produce documentation in various formats: HTML, \LaTeX , -TeXinfo, Unix man pages, and "dot" dependency graphs. Moreover, -users can add their own custom generators, as explained in -section \ref{s:ocamldoc-custom-generators}. - -In this chapter, we use the word {\em element} to refer to any of the -following parts of an OCaml source file: a type declaration, a value, -a module, an exception, a module type, a type constructor, a record -field, a class, a class type, a class method, a class value or a class -inheritance clause. - -\section{s:ocamldoc-usage}{Usage} - -\subsection{ss:ocamldoc-invocation}{Invocation} - -OCamldoc is invoked via the command "ocamldoc", as follows: -\begin{alltt} - ocamldoc \var{options} \var{sourcefiles} -\end{alltt} - -\subsubsection*{sss:ocamldoc-output}{Options for choosing the output format} - -The following options determine the format for the generated -documentation. - -\begin{options} -\item["-html"] -Generate documentation in HTML default format. The generated HTML pages -are stored in the current directory, or in the directory specified -with the {\bf\tt -d} option. You can customize the style of the -generated pages by editing the generated "style.css" file, or by providing -your own style sheet using option "-css-style". -The file "style.css" is not generated if it already exists or if -css-style is used. - -\item["-latex"] -Generate documentation in \LaTeX\ default format. The generated -\LaTeX\ document is saved in file "ocamldoc.out", or in the file -specified with the {\bf\tt -o} option. The document uses the style file -"ocamldoc.sty". This file is generated when using the "-latex" option, -if it does not already exist. -You can change this file to customize the style of your \LaTeX\ documentation. - -\item["-texi"] -Generate documentation in TeXinfo default format. The generated -\LaTeX\ document is saved in file "ocamldoc.out", or in the file -specified with the {\bf\tt -o} option. - -\item["-man"] -Generate documentation as a set of Unix "man" pages. The generated pages -are stored in the current directory, or in the directory specified -with the {\bf\tt -d} option. - -\item["-dot"] -Generate a dependency graph for the toplevel modules, in a format suitable -for displaying and processing by "dot". The "dot" tool is available from -\url{https://graphviz.org/}. -The textual representation of the graph is written to the file -"ocamldoc.out", or to the file specified with the {\bf\tt -o} option. -Use "dot ocamldoc.out" to display it. - -\item["-g" \var{file.cm[o,a,xs]}] -Dynamically load the given file, which defines a custom documentation -generator. See section \ref{ss:ocamldoc-compilation-and-usage}. This -option is supported by the "ocamldoc" command (to load ".cmo" and ".cma" files) -and by its native-code version "ocamldoc.opt" (to load ".cmxs" files). -If the given file is a simple one and does not exist in -the current directory, then ocamldoc looks for it in the custom -generators default directory, and in the directories specified with -optional "-i" options. - -\item["-customdir"] -Display the custom generators default directory. - -\item["-i" \var{directory}] -Add the given directory to the path where to look for custom generators. - -\end{options} - -\subsubsection*{sss:ocamldoc-options}{General options} - -\begin{options} - -\item["-d" \var{dir}] -Generate files in directory \var{dir}, rather than the current directory. - -\item["-dump" \var{file}] -Dump collected information into \var{file}. This information can be -read with the "-load" option in a subsequent invocation of "ocamldoc". - -\item["-hide" \var{modules}] -Hide the given complete module names in the generated documentation. -\var{modules} is a list of complete module names separated - by '","', without blanks. For instance: "Stdlib,M2.M3". - -\item["-inv-merge-ml-mli"] -Reverse the precedence of implementations and interfaces when merging. -All elements -in implementation files are kept, and the {\bf\tt -m} option -indicates which parts of the comments in interface files are merged -with the comments in implementation files. - -\item["-keep-code"] -Always keep the source code for values, methods and instance variables, -when available. - -\item["-load" \var{file}] -Load information from \var{file}, which has been produced by -"ocamldoc -dump". Several "-load" options can be given. - -\item["-m" \var{flags}] -Specify merge options between interfaces and implementations. -(see section \ref{ss:ocamldoc-merge} for details). -\var{flags} can be one or several of the following characters: -\begin{options} - \item["d"] merge description - \item["a"] merge "\@author" - \item["v"] merge "\@version" - \item["l"] merge "\@see" - \item["s"] merge "\@since" - \item["b"] merge "\@before" - \item["o"] merge "\@deprecated" - \item["p"] merge "\@param" - \item["e"] merge "\@raise" - \item["r"] merge "\@return" - \item["A"] merge everything -\end{options} - -\item["-no-custom-tags"] -Do not allow custom \@-tags (see section \ref{ss:ocamldoc-tags}). - -\item["-no-stop"] -Keep elements placed after/between the "(**/**)" special comment(s) -(see section \ref{s:ocamldoc-comments}). - -\item["-o" \var{file}] -Output the generated documentation to \var{file} instead of "ocamldoc.out". -This option is meaningful only in conjunction with the -{\bf\tt -latex}, {\bf\tt -texi}, or {\bf\tt -dot} options. - -\item["-pp" \var{command}] -Pipe sources through preprocessor \var{command}. - -\item["-impl" \var{filename}] -Process the file \var{filename} as an implementation file, even if its -extension is not ".ml". - -\item["-intf" \var{filename}] -Process the file \var{filename} as an interface file, even if its -extension is not ".mli". - -\item["-text" \var{filename}] -Process the file \var{filename} as a text file, even if its -extension is not ".txt". - -\item["-sort"] -Sort the list of top-level modules before generating the documentation. - -\item["-stars"] -Remove blank characters until the first asterisk ('"*"') in each -line of comments. - -\item["-t" \var{title}] -Use \var{title} as the title for the generated documentation. - -\item["-intro" \var{file}] -Use content of \var{file} as ocamldoc text to use as introduction (HTML, -\LaTeX{} and TeXinfo only). -For HTML, the file is used to create the whole "index.html" file. - -\item["-v"] -Verbose mode. Display progress information. - -\item["-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-warn-error"] -Treat Ocamldoc warnings as errors. - -\item["-hide-warnings"] -Do not print OCamldoc warnings. - -\item["-help" or "--help"] -Display a short usage summary and exit. -% -\end{options} - -\subsubsection*{sss:ocamldoc-type-checking}{Type-checking options} - -OCamldoc calls the OCaml type-checker to obtain type -information. The following options impact the type-checking phase. -They have the same meaning as for the "ocamlc" and "ocamlopt" commands. - -\begin{options} - -\item["-I" \var{directory}] -Add \var{directory} to the list of directories search for compiled -interface files (".cmi" files). - -\item["-nolabels"] -Ignore non-optional labels in types. - -\item["-rectypes"] -Allow arbitrary recursive types. (See the "-rectypes" option to "ocamlc".) - -\end{options} - -\subsubsection*{sss:ocamldoc-html}{Options for generating HTML pages} - -The following options apply in conjunction with the "-html" option: - -\begin{options} -\item["-all-params"] -Display the complete list of parameters for functions and methods. - -\item["-charset" \var{charset}] -Add information about character encoding being \var{charset} -(default is iso-8859-1). - -\item["-colorize-code"] -Colorize the OCaml code enclosed in "[ ]" and "{[ ]}", using colors -to emphasize keywords, etc. If the code fragments are not -syntactically correct, no color is added. - -\item["-css-style" \var{filename}] -Use \var{filename} as the Cascading Style Sheet file. - -\item["-index-only"] -Generate only index files. - -\item["-short-functors"] -Use a short form to display functors: -\begin{alltt} -module M : functor (A:Module) -> functor (B:Module2) -> sig .. end -\end{alltt} -is displayed as: -\begin{alltt} -module M (A:Module) (B:Module2) : sig .. end -\end{alltt} - -\end{options} - -\subsubsection*{sss:ocamldoc-latex}{Options for generating \LaTeX\ files} - -The following options apply in conjunction with the "-latex" option: - -\begin{options} -\item["-latex-value-prefix" \var{prefix}] -Give a prefix to use for the labels of the values in the generated -\LaTeX\ document. -The default prefix is the empty string. You can also use the options -{\tt -latex-type-prefix}, {\tt -latex-exception-prefix}, -{\tt -latex-module-prefix}, -{\tt -latex-module-type-prefix}, {\tt -latex-class-prefix}, -{\tt -latex-class-type-prefix}, -{\tt -latex-attribute-prefix} and {\tt -latex-method-prefix}. - -These options are useful when you have, for example, a type and a value with - the same name. If you do not specify prefixes, \LaTeX\ will complain about -multiply defined labels. - -\item["-latextitle" \var{n,style}] -Associate style number \var{n} to the given \LaTeX\ sectioning command -\var{style}, e.g. "section" or "subsection". (\LaTeX\ only.) This is -useful when including the generated document in another \LaTeX\ document, -at a given sectioning level. The default association is 1 for "section", -2 for "subsection", 3 for "subsubsection", 4 for "paragraph" and 5 for -"subparagraph". - -\item["-noheader"] -Suppress header in generated documentation. - -\item["-notoc"] -Do not generate a table of contents. - -\item["-notrailer"] -Suppress trailer in generated documentation. - -\item["-sepfiles"] -Generate one ".tex" file per toplevel module, instead of the global -"ocamldoc.out" file. -\end{options} - -\subsubsection*{sss:ocamldoc-info}{Options for generating TeXinfo files} - -The following options apply in conjunction with the "-texi" option: - -\begin{options} -\item["-esc8"] -Escape accented characters in Info files. - -\item["-info-entry"] -Specify Info directory entry. - -\item["-info-section"] -Specify section of Info directory. - -\item["-noheader"] -Suppress header in generated documentation. - -\item["-noindex"] -Do not build index for Info files. - -\item["-notrailer"] -Suppress trailer in generated documentation. -\end{options} - -\subsubsection*{sss:ocamldoc-dot}{Options for generating "dot" graphs} - -The following options apply in conjunction with the "-dot" option: - -\begin{options} -\item["-dot-colors" \var{colors}] -Specify the colors to use in the generated "dot" code. -When generating module dependencies, "ocamldoc" uses different colors -for modules, depending on the directories in which they reside. -When generating types dependencies, "ocamldoc" uses different colors -for types, depending on the modules in which they are defined. -\var{colors} is a list of color names separated by '","', as -in "Red,Blue,Green". The available colors are the ones supported by -the "dot" tool. - -\item["-dot-include-all"] -Include all modules in the "dot" output, not only modules given -on the command line or loaded with the {\bf\tt -load} option. - -\item["-dot-reduce"] -Perform a transitive reduction of the dependency graph before -outputting the "dot" code. This can be useful if there are -a lot of transitive dependencies that clutter the graph. - -\item["-dot-types"] -Output "dot" code describing the type dependency graph instead of -the module dependency graph. -\end{options} - -\subsubsection*{sss:ocamldoc-man}{Options for generating man files} - -The following options apply in conjunction with the "-man" option: - -\begin{options} -\item["-man-mini"] -Generate man pages only for modules, module types, classes and class -types, instead of pages for all elements. - -\item["-man-suffix" \var{suffix}] -Set the suffix used for generated man filenames. Default is '"3o"', -as in "List.3o". - -\item["-man-section" \var{section}] -Set the section number used for generated man filenames. Default is '"3"'. - -\end{options} - -\subsection{ss:ocamldoc-merge}{Merging of module information} - -Information on a module can be extracted either from the ".mli" or ".ml" -file, or both, depending on the files given on the command line. -When both ".mli" and ".ml" files are given for the same module, -information extracted from these files is merged according to the -following rules: -\begin{itemize} -\item Only elements (values, types, classes, ...) declared in the ".mli" -file are kept. In other terms, definitions from the ".ml" file that are -not exported in the ".mli" file are not documented. -\item Descriptions of elements and descriptions in \@-tags are handled -as follows. If a description for the same element or in the same -\@-tag of the same element is present in both files, then the -description of the ".ml" file is concatenated to the one in the ".mli" file, -if the corresponding "-m" flag is given on the command line. -If a description is present in the ".ml" file and not in the -".mli" file, the ".ml" description is kept. -In either case, all the information given in the ".mli" file is kept. -\end{itemize} - -\subsection{ss:ocamldoc-rules}{Coding rules} -The following rules must be respected in order to avoid name clashes -resulting in cross-reference errors: -\begin{itemize} -\item In a module, there must not be two modules, two module types or - a module and a module type with the same name. - In the default HTML generator, modules "ab" and "AB" will be printed - to the same file on case insensitive file systems. -\item In a module, there must not be two classes, two class types or - a class and a class type with the same name. -\item In a module, there must not be two values, two types, or two - exceptions with the same name. -\item Values defined in tuple, as in "let (x,y,z) = (1,2,3)" -are not kept by OCamldoc. -\item Avoid the following construction: -\begin{caml_eval} -module Foo = struct module Bar = struct let x = 1 end end;; -\end{caml_eval} -\begin{caml_example*}{verbatim} -open Foo (* which has a module Bar with a value x *) -module Foo = - struct - module Bar = - struct - let x = 1 - end - end - let dummy = Bar.x -\end{caml_example*} -In this case, OCamldoc will associate "Bar.x" to the "x" of module -"Foo" defined just above, instead of to the "Bar.x" defined in the -opened module "Foo". -\end{itemize} - -\section{s:ocamldoc-comments}{Syntax of documentation comments} - -Comments containing documentation material are called {\em special -comments} and are written between "(**" and "*)". Special comments -must start exactly with "(**". Comments beginning with "(" and more -than two "*" are ignored. - -\subsection{ss:ocamldoc-placement}{Placement of documentation comments} -OCamldoc can associate comments to some elements of the language -encountered in the source files. The association is made according to -the locations of comments with respect to the language elements. The -locations of comments in ".mli" and ".ml" files are different. - -%%%%%%%%%%%%% -\subsubsection{sss:ocamldoc-mli}{Comments in ".mli" files} -A special comment is associated to an element if it is placed before or -after the element.\\ -A special comment before an element is associated to this element if~: -\begin{itemize} -\item There is no blank line or another special comment between the special -comment and the element. However, a regular comment can occur between -the special comment and the element. -\item The special comment is not already associated to the previous element. -\item The special comment is not the first one of a toplevel module. -\end{itemize} - -A special comment after an element is associated to this element if -there is no blank line or comment between the special comment and the -element. - -There are two exceptions: for constructors and record fields in -type definitions, the associated comment can only be placed after the -constructor or field definition, without blank lines or other comments -between them. The special comment for a constructor -with another constructor following must be placed before the '"|"' -character separating the two constructors. - -The following sample interface file "foo.mli" illustrates the -placement rules for comments in ".mli" files. - -\begin{caml_eval} -class cl = object end -\end{caml_eval} -\begin{caml_example*}{signature} -(** The first special comment of the file is the comment associated - with the whole module.*) - - -(** Special comments can be placed between elements and are kept - by the OCamldoc tool, but are not associated to any element. - @-tags in these comments are ignored.*) - -(*******************************************************************) -(** Comments like the one above, with more than two asterisks, - are ignored. *) - -(** The comment for function f. *) -val f : int -> int -> int -(** The continuation of the comment for function f. *) - -(** Comment for exception My_exception, even with a simple comment - between the special comment and the exception.*) -(* Hello, I'm a simple comment :-) *) -exception My_exception of (int -> int) * int - -(** Comment for type weather *) -type weather = -| Rain of int (** The comment for constructor Rain *) -| Sun (** The comment for constructor Sun *) - -(** Comment for type weather2 *) -type weather2 = -| Rain of int (** The comment for constructor Rain *) -| Sun (** The comment for constructor Sun *) -(** I can continue the comment for type weather2 here - because there is already a comment associated to the last constructor.*) - -(** The comment for type my_record *) -type my_record = { - foo : int ; (** Comment for field foo *) - bar : string ; (** Comment for field bar *) - } - (** Continuation of comment for type my_record *) - -(** Comment for foo *) -val foo : string -(** This comment is associated to foo and not to bar. *) -val bar : string -(** This comment is associated to bar. *) - -(** The comment for class my_class *) -class my_class : - object - (** A comment to describe inheritance from cl *) - inherit cl - - (** The comment for attribute tutu *) - val mutable tutu : string - - (** The comment for attribute toto. *) - val toto : int - - (** This comment is not attached to titi since - there is a blank line before titi, but is kept - as a comment in the class. *) - - val titi : string - - (** Comment for method toto *) - method toto : string - - (** Comment for method m *) - method m : float -> int - end - -(** The comment for the class type my_class_type *) -class type my_class_type = - object - (** The comment for variable x. *) - val mutable x : int - - (** The comment for method m. *) - method m : int -> int -end - -(** The comment for module Foo *) -module Foo : - sig - (** The comment for x *) - val x : int - - (** A special comment that is kept but not associated to any element *) - end - -(** The comment for module type my_module_type. *) -module type my_module_type = - sig - (** The comment for value x. *) - val x : int - - (** The comment for module M. *) - module M : - sig - (** The comment for value y. *) - val y : int - - (* ... *) - end - - end - -\end{caml_example*} - -%%%%%%%%%%%%% -\subsubsection{sss:ocamldoc-comments-ml}{Comments in {\tt .ml} files} - -A special comment is associated to an element if it is placed before -the element and there is no blank line between the comment and the -element. Meanwhile, there can be a simple comment between the special -comment and the element. There are two exceptions, for -constructors and record fields in type definitions, whose associated -comment must be placed after the constructor or field definition, -without blank line between them. The special comment for a constructor -with another constructor following must be placed before the '"|"' -character separating the two constructors. - -The following example of file "toto.ml" shows where to place comments -in a ".ml" file. - -\begin{caml_example*}{verbatim} -(** The first special comment of the file is the comment associated - to the whole module. *) - -(** The comment for function f *) -let f x y = x + y - -(** This comment is not attached to any element since there is another - special comment just before the next element. *) - -(** Comment for exception My_exception, even with a simple comment - between the special comment and the exception.*) -(* A simple comment. *) -exception My_exception of (int -> int) * int - -(** Comment for type weather *) -type weather = -| Rain of int (** The comment for constructor Rain *) -| Sun (** The comment for constructor Sun *) - -(** The comment for type my_record *) -type my_record = { - foo : int ; (** Comment for field foo *) - bar : string ; (** Comment for field bar *) - } - -(** The comment for class my_class *) -class my_class = - object - (** A comment to describe inheritance from cl *) - inherit cl - - (** The comment for the instance variable tutu *) - val mutable tutu = "tutu" - (** The comment for toto *) - val toto = 1 - val titi = "titi" - (** Comment for method toto *) - method toto = tutu ^ "!" - (** Comment for method m *) - method m (f : float) = 1 - end - -(** The comment for class type my_class_type *) -class type my_class_type = - object - (** The comment for the instance variable x. *) - val mutable x : int - (** The comment for method m. *) - method m : int -> int - end - -(** The comment for module Foo *) -module Foo = - struct - (** The comment for x *) - let x = 0 - (** A special comment in the class, but not associated to any element. *) - end - -(** The comment for module type my_module_type. *) -module type my_module_type = - sig - (* Comment for value x. *) - val x : int - (* ... *) - end -\end{caml_example} - -%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{ss:ocamldoc-stop}{The Stop special comment} -The special comment "(**/**)" tells OCamldoc to discard -elements placed after this comment, up to the end of the current -class, class type, module or module type, or up to the next stop comment. -For instance: -\begin{caml_example*}{signature} -class type foo = - object - (** comment for method m *) - method m : string - - (**/**) - - (** This method won't appear in the documentation *) - method bar : int - end - -(** This value appears in the documentation, since the Stop special comment - in the class does not affect the parent module of the class.*) -val foo : string - -(**/**) -(** The value bar does not appear in the documentation.*) -val bar : string -(**/**) - -(** The type t appears since in the documentation since the previous stop comment -toggled off the "no documentation mode". *) -type t = string -\end{caml_example*} - -The {\bf\tt -no-stop} option to "ocamldoc" causes the Stop special -comments to be ignored. - -%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{ss:ocamldoc-syntax}{Syntax of documentation comments} - -The inside of documentation comments "(**"\ldots"*)" consists of -free-form text with optional formatting annotations, followed by -optional {\em tags} giving more specific information about parameters, -version, authors, \ldots\ The tags are distinguished by a leading "\@" -character. Thus, a documentation comment has the following shape: -\begin{verbatim} -(** The comment begins with a description, which is text formatted - according to the rules described in the next section. - The description continues until the first non-escaped '@' character. - @author Mr Smith - @param x description for parameter x -*) -\end{verbatim} -Some elements support only a subset of all \@-tags. Tags that are not -relevant to the documented element are simply ignored. For instance, -all tags are ignored when documenting type constructors, record -fields, and class inheritance clauses. Similarly, a "\@param" tag on a -class instance variable is ignored. - -At last, "(**)" is the empty documentation comment. - -%%%%%%%%%%%%% - -% enable section numbering for subsubsections (PR#6189, item 3) -\setcounter{secnumdepth}{3} - -\subsection{ss:ocamldoc-formatting}{Text formatting} - -Here is the BNF grammar for the simple markup language used to format -text descriptions. - -\newpage - -\begin{syntax} -text: {{text-element}} -; -\end{syntax} - -\noindent -\begin{syntaxleft} -\nonterm{text-element}\is{} -\end{syntaxleft} - -\begin{tabular}{rlp{10cm}} -@||@&@ '{' {{ "0" \ldots "9" }} text '}' @ & format @text@ as a section header; - the integer following "{" indicates the sectioning level. \\ -@||@&@ '{' {{ "0" \ldots "9" }} ':' @ \nt{label} @ text '}' @ & - same, but also associate the name \nt{label} to the current point. - This point can be referenced by its fully-qualified label in a - "{!" command, just like any other element. \\ -@||@&@ '{b' text '}' @ & set @text@ in bold. \\ -@||@&@ '{i' text '}' @ & set @text@ in italic. \\ -@||@&@ '{e' text '}' @ & emphasize @text@. \\ -@||@&@ '{C' text '}' @ & center @text@. \\ -@||@&@ '{L' text '}' @ & left align @text@. \\ -@||@&@ '{R' text '}' @ & right align @text@. \\ -@||@&@ '{ul' list '}' @ & build a list. \\ -@||@&@ '{ol' list '}' @ & build an enumerated list. \\ -@||@&@ '{{:' string '}' text '}' @ & put a link to the given address -(given as @string@) on the given @text@. \\ -@||@&@ '[' string ']' @ & set the given @string@ in source code style. \\ -@||@&@ '{[' string ']}' @ & set the given @string@ in preformatted - source code style.\\ -@||@&@ '{v' string 'v}' @ & set the given @string@ in verbatim style. \\ -@||@&@ '{%' string '%}' @ & target-specific content - (\LaTeX\ code by default, see details - in \ref{sss:ocamldoc-target-specific-syntax}) \\ -@||@&@ '{!' string '}' @ & insert a cross-reference to an element - (see section \ref{sss:ocamldoc-crossref} for the syntax of cross-references).\\ -@||@&@ '{!modules:' string string ... '}' @ & insert an index table -for the given module names. Used in HTML only.\\ -@||@&@ '{!indexlist}' @ & insert a table of links to the various indexes -(types, values, modules, ...). Used in HTML only.\\ -@||@&@ '{^' text '}' @ & set text in superscript.\\ -@||@&@ '{_' text '}' @ & set text in subscript.\\ -@||@& \nt{escaped-string} & typeset the given string as is; -special characters ('"{"', '"}"', '"["', '"]"' and '"\@"') -must be escaped by a '"\\"'\\ -@||@& \nt{blank-line} & force a new line. -\end{tabular} \\ - -\subsubsection{sss:ocamldoc-list}{List formatting} - -\begin{syntax} -list: -| {{ '{-' text '}' }} -| {{ '{li' text '}' }} -\end{syntax} - -A shortcut syntax exists for lists and enumerated lists: -\begin{verbatim} -(** Here is a {b list} -- item 1 -- item 2 -- item 3 - -The list is ended by the blank line.*) -\end{verbatim} -is equivalent to: -\begin{verbatim} -(** Here is a {b list} -{ul {- item 1} -{- item 2} -{- item 3}} -The list is ended by the blank line.*) -\end{verbatim} - -The same shortcut is available for enumerated lists, using '"+"' -instead of '"-"'. -Note that only one list can be defined by this shortcut in nested lists. - -\subsubsection{sss:ocamldoc-crossref}{Cross-reference formatting} - -Cross-references are fully qualified element names, as in the example -"{!Foo.Bar.t}". This is an ambiguous reference as it may designate -a type name, a value name, a class name, etc. It is possible to make -explicit the intended syntactic class, using "{!type:Foo.Bar.t}" to -designate a type, and "{!val:Foo.Bar.t}" a value of the same name. - -The list of possible syntactic class is as follows: -\begin{center} -\begin{tabular}{rl} -\multicolumn{1}{c}{"tag"} & \multicolumn{1}{c}{syntactic class}\\ \hline -"module:" & module \\ -"modtype:" & module type \\ -"class:" & class \\ -"classtype:" & class type \\ -"val:" & value \\ -"type:" & type \\ -"exception:" & exception \\ -"attribute:" & attribute \\ -"method:" & class method \\ -"section:" & ocamldoc section \\ -"const:" & variant constructor \\ -"recfield:" & record field -\end{tabular} -\end{center} - -In the case of variant constructors or record field, the constructor -or field name should be preceded by the name of the correspond type -- -to avoid the ambiguity of several types having the same constructor -names. For example, the constructor "Node" of the type "tree" will be -referenced as "{!tree.Node}" or "{!const:tree.Node}", or possibly -"{!Mod1.Mod2.tree.Node}" from outside the module. - -\subsubsection{sss:ocamldoc-preamble}{First sentence} - -In the description of a value, type, exception, module, module type, class -or class type, the {\em first sentence} is sometimes used in indexes, or -when just a part of the description is needed. The first sentence -is composed of the first characters of the description, until -\begin{itemize} -\item the first dot followed by a blank, or -\item the first blank line -\end{itemize} -outside of the following text formatting : -@ '{ul' list '}' @, -@ '{ol' list '}' @, -@ '[' string ']' @, -@ '{[' string ']}' @, -@ '{v' string 'v}' @, -@ '{%' string '%}' @, -@ '{!' string '}' @, -@ '{^' text '}' @, -@ '{_' text '}' @. - -\subsubsection{sss:ocamldoc-target-specific-syntax}{Target-specific formatting} - -The content inside "{%foo: ... %}" is target-specific and will only be -interpreted by the backend "foo", and ignored by the others. The -backends of the distribution are "latex", "html", "texi" and "man". If -no target is specified (syntax "{% ... %}"), "latex" is chosen by -default. Custom generators may support their own target prefix. - -\subsubsection{sss:ocamldoc-html-tags}{Recognized HTML tags} -The HTML tags "..", -"..", -"..", -"
    ..
", -"
    ..
", -"
  • ..
  • ", -"
    ..
    " and -".." can be used instead of, respectively, -@ '{b ..}' @, -@ '[..]' @, -@ '{i ..}' @, -@ '{ul ..}' @, -@ '{ol ..}' @, -@ '{li ..}' @, -@ '{C ..}' @ and -"{[0-9] ..}". - -%disable section numbering for subsubsections -\setcounter{secnumdepth}{2} - -%%%%%%%%%%%%% -\subsection{ss:ocamldoc-tags}{Documentation tags (\@-tags)} - - -\subsubsection{sss:ocamldoc-builtin-tags}{Predefined tags} -The following table gives the list of predefined \@-tags, with their -syntax and meaning.\\ - -\begin{tabular}{|p{5cm}|p{10cm}|}\hline -@ "@author" string @ & The author of the element. One author per -"\@author" tag. -There may be several "\@author" tags for the same element. \\ \hline - -@ "@deprecated" text @ & The @text@ should describe when the element was -deprecated, what to use as a replacement, and possibly the reason -for deprecation. \\ \hline - -@ "@param" id text @ & Associate the given description (@text@) to the -given parameter name @id@. This tag is used for functions, -methods, classes and functors. \\ \hline - -@ "@raise" Exc text @ & Explain that the element may raise - the exception @Exc@. \\ \hline - -@ "@return" text @ & Describe the return value and - its possible values. This tag is used for functions - and methods. \\ \hline - -@ "@see" '<' URL '>' text @ & Add a reference to the @URL@ -with the given @text@ as comment. \\ \hline - -@ "@see" "'"@\nt{filename}@"'" text @ & Add a reference to the given file name -(written between single quotes), with the given @text@ as comment. \\ \hline - -@ "@see" '"'@\nt{document-name}@'"' text @ & Add a reference to the given -document name (written between double quotes), with the given @text@ -as comment. \\ \hline - -@ "@since" string @ & Indicate when the element was introduced. \\ \hline - -@ "@before" @ \nt{version} @ text @ & Associate the given description (@text@) -to the given \nt{version} in order to document compatibility issues. \\ \hline - -@ "@version" string @ & The version number for the element. \\ \hline -\end{tabular} - -\subsubsection{sss:ocamldoc-custom-tags}{Custom tags} -You can use custom tags in the documentation comments, but they will -have no effect if the generator used does not handle them. To use a -custom tag, for example "foo", just put "\@foo" with some text in your -comment, as in: -\begin{verbatim} -(** My comment to show you a custom tag. -@foo this is the text argument to the [foo] custom tag. -*) -\end{verbatim} - -To handle custom tags, you need to define a custom generator, -as explained in section \ref{ss:ocamldoc-handling-custom-tags}. - -%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{s:ocamldoc-custom-generators}{Custom generators} - -OCamldoc operates in two steps: -\begin{enumerate} -\item analysis of the source files; -\item generation of documentation, through a documentation generator, - which is an object of class "Odoc_args.class_generator". -\end{enumerate} -Users can provide their own documentation generator to be used during -step 2 instead of the default generators. -All the information retrieved during the analysis step is available through -the "Odoc_info" module, which gives access to all the types and functions - representing the elements found in the given modules, with their associated -description. - -The files you can use to define custom generators are installed in the -"ocamldoc" sub-directory of the OCaml standard library. - -%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{ss:ocamldoc-generators}{The generator modules} -The type of a generator module depends on the kind of generated documentation. -Here is the list of generator module types, with the name of the generator -class in the module~: -\begin{itemize} -\item for HTML~: "Odoc_html.Html_generator" (class "html"), -\item for \LaTeX~: "Odoc_latex.Latex_generator" (class "latex"), -\item for TeXinfo~: "Odoc_texi.Texi_generator" (class "texi"), -\item for man pages~: "Odoc_man.Man_generator" (class "man"), -\item for graphviz (dot)~: "Odoc_dot.Dot_generator" (class "dot"), -\item for other kinds~: "Odoc_gen.Base" (class "generator"). -\end{itemize} -That is, to define a new generator, one must implement a module with -the expected signature, and with the given generator class, providing -the "generate" method as entry point to make the generator generates -documentation for a given list of modules~: - -\begin{verbatim} - method generate : Odoc_info.Module.t_module list -> unit -\end{verbatim} - -\noindent{}This method will be called with the list of analysed and possibly -merged "Odoc_info.t_module" structures. - -It is recommended to inherit from the current generator of the same -kind as the one you want to define. Doing so, it is possible to -load various custom generators to combine improvements brought by each one. - -This is done using first class modules (see chapter \ref{s:first-class-modules}). - -The easiest way to define a custom generator is the following this example, -here extending the current HTML generator. We don't have to know if this is -the original HTML generator defined in ocamldoc or if it has been extended -already by a previously loaded custom generator~: - -\begin{verbatim} -module Generator (G : Odoc_html.Html_generator) = -struct - class html = - object(self) - inherit G.html as html - (* ... *) - - method generate module_list = - (* ... *) - () - - (* ... *) - end -end;; - -let _ = Odoc_args.extend_html_generator (module Generator : Odoc_gen.Html_functor);; -\end{verbatim} - -To know which methods to override and/or which methods are available, -have a look at the different base implementations, depending on the -kind of generator you are extending~: -\newcommand\ocamldocsrc[2]{\href{https://github.com/ocaml/ocaml/blob/{\ocamlversion}/ocamldoc/odoc_#1.ml}{#2}} -\begin{itemize} -\item for HTML~: \ocamldocsrc{html}{"odoc_html.ml"}, -\item for \LaTeX~: \ocamldocsrc{latex}{"odoc_latex.ml"}, -\item for TeXinfo~: \ocamldocsrc{texi}{"odoc_texi.ml"}, -\item for man pages~: \ocamldocsrc{man}{"odoc_man.ml"}, -\item for graphviz (dot)~: \ocamldocsrc{dot}{"odoc_dot.ml"}. -\end{itemize} - -%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{ss:ocamldoc-handling-custom-tags}{Handling custom tags} - -Making a custom generator handle custom tags (see -\ref{sss:ocamldoc-custom-tags}) is very simple. - -\subsubsection*{sss:ocamldoc-html-generator}{For HTML} -Here is how to develop a HTML generator handling your custom tags. - -The class "Odoc_html.Generator.html" inherits -from the class "Odoc_html.info", containing a field "tag_functions" which is a -list pairs composed of a custom tag (e.g. "\"foo\"") and a function taking -a "text" and returning HTML code (of type "string"). -To handle a new tag "bar", extend the current HTML generator - and complete the "tag_functions" field: -\begin{verbatim} -module Generator (G : Odoc_html.Html_generator) = -struct - class html = - object(self) - inherit G.html - - (** Return HTML code for the given text of a bar tag. *) - method html_of_bar t = (* your code here *) - - initializer - tag_functions <- ("bar", self#html_of_bar) :: tag_functions - end -end -let _ = Odoc_args.extend_html_generator (module Generator : Odoc_gen.Html_functor);; -\end{verbatim} - -Another method of the class "Odoc_html.info" will look for the -function associated to a custom tag and apply it to the text given to -the tag. If no function is associated to a custom tag, then the method -prints a warning message on "stderr". - -\subsubsection{sss:ocamldoc-other-generators}{For other generators} -You can act the same way for other kinds of generators. - -%%%%%%%%%%%%%%%%%%%%%%%%%% -\section{s:ocamldoc-adding-flags}{Adding command line options} -The command line analysis is performed after loading the module containing the -documentation generator, thus allowing command line options to be added to the - list of existing ones. Adding an option can be done with the function -\begin{verbatim} - Odoc_args.add_option : string * Arg.spec * string -> unit -\end{verbatim} -\noindent{}Note: Existing command line options can be redefined using -this function. - -%%%%%%%%%%%%%%%%%%%%%%%%%% -\subsection{ss:ocamldoc-compilation-and-usage}{Compilation and usage} - -%%%%%%%%%%%%%% -\subsubsection{sss:ocamldoc-generator-class}{Defining a custom generator class in one file} -Let "custom.ml" be the file defining a new generator class. -Compilation of "custom.ml" can be performed by the following command~: -\begin{alltt} - ocamlc -I +ocamldoc -c custom.ml -\end{alltt} -\noindent{}The file "custom.cmo" is created and can be used this way~: -\begin{alltt} - ocamldoc -g custom.cmo \var{other-options} \var{source-files} -\end{alltt} -\noindent{}Options selecting a built-in generator to "ocamldoc", such as -"-html", have no effect if a custom generator of the same kind is provided using -"-g". If the kinds do not match, the selected built-in generator is used and the -custom one is ignored. - -%%%%%%%%%%%%%% -\subsubsection{sss:ocamldoc-modular-generator}{Defining a custom generator class in several files} -It is possible to define a generator class in several modules, which -are defined in several files \var{\nth{file}{1}}".ml"["i"], -\var{\nth{file}{2}}".ml"["i"], ..., \var{\nth{file}{n}}".ml"["i"]. A ".cma" -library file must be created, including all these files. - -The following commands create the "custom.cma" file from files -\var{\nth{file}{1}}".ml"["i"], ..., \var{\nth{file}{n}}".ml"["i"]~: -\begin{alltt} -ocamlc -I +ocamldoc -c \var{\nth{file}{1}}.ml\textrm{[}i\textrm{]} -ocamlc -I +ocamldoc -c \var{\nth{file}{2}}.ml\textrm{[}i\textrm{]} -... -ocamlc -I +ocamldoc -c \var{\nth{file}{n}}.ml\textrm{[}i\textrm{]} -ocamlc -o custom.cma -a \var{\nth{file}{1}}.cmo \var{\nth{file}{2}}.cmo ... \var{\nth{file}{n}}.cmo -\end{alltt} -\noindent{}Then, the following command uses "custom.cma" as custom generator: -\begin{alltt} - ocamldoc -g custom.cma \var{other-options} \var{source-files} -\end{alltt} diff --git a/manual/manual/cmds/profil.etex b/manual/manual/cmds/profil.etex deleted file mode 100644 index 7826fab3..00000000 --- a/manual/manual/cmds/profil.etex +++ /dev/null @@ -1,146 +0,0 @@ -\chapter{Profiling (ocamlprof)} \label{c:profiler} -%HEVEA\cutname{profil.html} - -This chapter describes how the execution of OCaml -programs can be profiled, by recording how many times functions are -called, branches of conditionals are taken, \ldots - -\section{s:ocamlprof-compiling}{Compiling for profiling} - -Before profiling an execution, the program must be compiled in -profiling mode, using the "ocamlcp" front-end to the "ocamlc" compiler -(see chapter~\ref{c:camlc}) or the "ocamloptp" front-end to the -"ocamlopt" compiler (see chapter~\ref{c:nativecomp}). When compiling -modules separately, "ocamlcp" or "ocamloptp" must be used when -compiling the modules (production of ".cmo" or ".cmx" files), and can -also be used (though this is not strictly necessary) when linking them -together. - -\lparagraph{p:ocamlprof-warning}{Note} If a module (".ml" file) doesn't have a corresponding -interface (".mli" file), then compiling it with "ocamlcp" will produce -object files (".cmi" and ".cmo") that are not compatible with the ones -produced by "ocamlc", which may lead to problems (if the ".cmi" or -".cmo" is still around) when switching between profiling and -non-profiling compilations. To avoid this problem, you should always -have a ".mli" file for each ".ml" file. The same problem exists with -"ocamloptp". - -\lparagraph{p:ocamlprof-reserved}{Note} To make sure your programs can be compiled in -profiling mode, avoid using any identifier that begins with -"__ocaml_prof". - -The amount of profiling information can be controlled through the "-P" -option to "ocamlcp" or "ocamloptp", followed by one or several letters -indicating which parts of the program should be profiled: - -%% description des options -\begin{options} -\item["a"] all options -\item["f"] function calls : a count point is set at the beginning of -each function body -\item["i"] {\bf if \ldots then \ldots else \ldots} : count points are set in -both {\bf then} branch and {\bf else} branch -\item["l"] {\bf while, for} loops: a count point is set at the beginning of -the loop body -\item["m"] {\bf match} branches: a count point is set at the beginning of the -body of each branch -\item["t"] {\bf try \ldots with \ldots} branches: a count point is set at the -beginning of the body of each branch -\end{options} - -For instance, compiling with "ocamlcp -P film" profiles function calls, -if\ldots then\ldots else\ldots, loops and pattern matching. - -Calling "ocamlcp" or "ocamloptp" without the "-P" option defaults to -"-P fm", meaning that only function calls and pattern matching are -profiled. - -\paragraph{Note} For compatibility with previous releases, "ocamlcp" -also accepts the "-p" option, with the same arguments and behaviour as -"-P". - -The "ocamlcp" and "ocamloptp" commands also accept all the options of -the corresponding "ocamlc" or "ocamlopt" compiler, except the "-pp" -(preprocessing) option. - - -\section{s:ocamlprof-profiling}{Profiling an execution} - -Running an executable that has been compiled with "ocamlcp" or -"ocamloptp" records the execution counts for the specified parts of -the program and saves them in a file called "ocamlprof.dump" in the -current directory. - -If the environment variable "OCAMLPROF_DUMP" is set when the program -exits, its value is used as the file name instead of "ocamlprof.dump". - -The dump file is written only if the program terminates -normally (by calling "exit" or by falling through). It is not written -if the program terminates with an uncaught exception. - -If a compatible dump file already exists in the current directory, then the -profiling information is accumulated in this dump file. This allows, for -instance, the profiling of several executions of a program on -different inputs. Note that dump files produced by byte-code -executables (compiled with "ocamlcp") are compatible with the dump -files produced by native executables (compiled with "ocamloptp"). - -\section{s:ocamlprof-printing}{Printing profiling information} - -The "ocamlprof" command produces a source listing of the program modules -where execution counts have been inserted as comments. For instance, -\begin{verbatim} - ocamlprof foo.ml -\end{verbatim} -prints the source code for the "foo" module, with comments indicating -how many times the functions in this module have been called. Naturally, -this information is accurate only if the source file has not been modified -after it was compiled. - -The following options are recognized by "ocamlprof": - -\begin{options} - -\item["-args" \var{filename}] - Read additional newline-terminated command line arguments from \var{filename}. - -\item["-args0" \var{filename}] - Read additional null character terminated command line arguments from \var{filename}. - -\item["-f" \var{dumpfile}] -Specifies an alternate dump file of profiling information to be read. - -\item["-F" \var{string}] -Specifies an additional string to be output with profiling information. -By default, "ocamlprof" will annotate programs with comments of the form -{\tt (* \var{n} *)} where \var{n} is the counter value for a profiling -point. With option {\tt -F \var{s}}, the annotation will be -{\tt (* \var{s}\var{n} *)}. - -\item["-impl" \var{filename}] -Process the file \var{filename} as an implementation file, even if its -extension is not ".ml". - -\item["-intf" \var{filename}] -Process the file \var{filename} as an interface file, even if its -extension is not ".mli". - -\item["-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-help" or "--help"] -Display a short usage summary and exit. -% -\end{options} - -\section{s:ocamlprof-time-profiling}{Time profiling} - -Profiling with "ocamlprof" only records execution counts, not the actual -time spent within each function. There is currently no way to perform -time profiling on bytecode programs generated by "ocamlc". For time -profiling of native code, users are recommended to use standard tools -such as perf (on Linux), Instruments (on macOS) and DTrace. Profiling -with "gprof" is no longer supported. diff --git a/manual/manual/cmds/runtime.etex b/manual/manual/cmds/runtime.etex deleted file mode 100644 index 0e9189dd..00000000 --- a/manual/manual/cmds/runtime.etex +++ /dev/null @@ -1,317 +0,0 @@ -\chapter{The runtime system (ocamlrun)} \label{c:runtime} -%HEVEA\cutname{runtime.html} - -The "ocamlrun" command executes bytecode files produced by the -linking phase of the "ocamlc" command. - -\section{s:ocamlrun-overview}{Overview} - -The "ocamlrun" command comprises three main parts: the bytecode -interpreter, that actually executes bytecode files; the memory -allocator and garbage collector; and a set of C functions that -implement primitive operations such as input/output. - -The usage for "ocamlrun" is: -\begin{alltt} - ocamlrun \var{options} \var{bytecode-executable} \nth{arg}{1} ... \nth{arg}{n} -\end{alltt} -The first non-option argument is taken to be the name of the file -containing the executable bytecode. (That file is searched in the -executable path as well as in the current directory.) The remaining -arguments are passed to the OCaml program, in the string array -"Sys.argv". Element 0 of this array is the name of the -bytecode executable file; elements 1 to \var{n} are the remaining -arguments \nth{arg}{1} to \nth{arg}{n}. - -As mentioned in chapter~\ref{c:camlc}, the bytecode executable files -produced by the "ocamlc" command are self-executable, and manage to -launch the "ocamlrun" command on themselves automatically. That is, -assuming "a.out" is a bytecode executable file, -\begin{alltt} - a.out \nth{arg}{1} ... \nth{arg}{n} -\end{alltt} -works exactly as -\begin{alltt} - ocamlrun a.out \nth{arg}{1} ... \nth{arg}{n} -\end{alltt} -Notice that it is not possible to pass options to "ocamlrun" when -invoking "a.out" directly. - -\begin{windows} -Under several versions of Windows, bytecode executable files are -self-executable only if their name ends in ".exe". It is recommended -to always give ".exe" names to bytecode executables, e.g. compile -with "ocamlc -o myprog.exe ..." rather than "ocamlc -o myprog ...". -\end{windows} - -\section{s:ocamlrun-options}{Options} -The following command-line options are recognized by "ocamlrun". - -\begin{options} - -\item["-b"] -When the program aborts due to an uncaught exception, print a detailed -``back trace'' of the execution, showing where the exception was -raised and which function calls were outstanding at this point. The -back trace is printed only if the bytecode executable contains -debugging information, i.e. was compiled and linked with the "-g" -option to "ocamlc" set. This is equivalent to setting the "b" flag -in the "OCAMLRUNPARAM" environment variable (see below). -\item["-I" \var{dir}] -Search the directory \var{dir} for dynamically-loaded libraries, -in addition to the standard search path (see -section~\ref{s:ocamlrun-dllpath}). -\item["-m"] -Print the magic number of the bytecode executable given as argument -and exit. -\item["-M"] -Print the magic number expected by this version of the runtime and exit. -\item["-p"] -Print the names of the primitives known to this version of -"ocamlrun" and exit. -\item["-v"] -Direct the memory manager to print some progress messages on -standard error. This is equivalent to setting "v=63" in the -"OCAMLRUNPARAM" environment variable (see below). -\item["-version"] -Print version string and exit. -\item["-vnum"] -Print short version number and exit. - -\end{options} - -\noindent -The following environment variables are also consulted: - -\begin{options} -\item["CAML_LD_LIBRARY_PATH"] Additional directories to search for - dynamically-loaded libraries (see section~\ref{s:ocamlrun-dllpath}). - -\item["OCAMLLIB"] The directory containing the OCaml standard - library. (If "OCAMLLIB" is not set, "CAMLLIB" will be used instead.) - Used to locate the "ld.conf" configuration file for - dynamic loading (see section~\ref{s:ocamlrun-dllpath}). If not set, - default to the library directory specified when compiling OCaml. - -\item["OCAMLRUNPARAM"] Set the runtime system options - and garbage collection parameters. - (If "OCAMLRUNPARAM" is not set, "CAMLRUNPARAM" will be used instead.) - This variable must be a sequence of parameter specifications separated - by commas. - For convenience, commas at the beginning of the variable are ignored, - and multiple runs of commas are interpreted as a single one. - A parameter specification is an option letter followed by an "=" - sign, a decimal number (or an hexadecimal number prefixed by "0x"), - and an optional multiplier. The options are documented below; - the last six correspond to the fields of the - "control" record documented in -\ifouthtml - \ahref{libref/Gc.html}{Module \texttt{Gc}}. -\else - section~\ref{Gc}. -\fi - \begin{options} - \item[b] (backtrace) Trigger the printing of a stack backtrace - when an uncaught exception aborts the program. An optional argument can - be provided: "b=0" turns backtrace printing off; "b=1" is equivalent to - "b" and turns backtrace printing on; "b=2" turns backtrace printing on - and forces the runtime system to load debugging information at program - startup time instead of at backtrace printing time. "b=2" can be used if - the runtime is unable to load debugging information at backtrace - printing time, for example if there are no file descriptors available. - \item[p] (parser trace) Turn on debugging support for - "ocamlyacc"-generated parsers. When this option is on, - the pushdown automaton that executes the parsers prints a - trace of its actions. This option takes no argument. - \item[R] (randomize) Turn on randomization of all hash tables by default - (see -\ifouthtml - \ahref{libref/Hashtbl.html}{Module \texttt{Hashtbl}}). -\else - section~\ref{Hashtbl}). -\fi - This option takes no argument. - \item[h] The initial size of the major heap (in words). - \item[a] ("allocation_policy") - The policy used for allocating in the OCaml heap. Possible values - are "0" for the next-fit policy, "1" for the first-fit - policy, and "2" for the best-fit policy. Best-fit is still experimental, - but probably the best of the three. The default is "0" (next-fit). - See the Gc module documentation for details. - \item[s] ("minor_heap_size") Size of the minor heap. (in words) - \item[i] ("major_heap_increment") Default size increment for the - major heap. (in words) - \item[o] ("space_overhead") The major GC speed setting. - See the Gc module documentation for details. - \item[O] ("max_overhead") The heap compaction trigger setting. - \item[l] ("stack_limit") The limit (in words) of the stack size. This is only - relevant to the byte-code runtime, as the native code runtime uses the - operating system's stack. - \item[v] ("verbose") What GC messages to print to stderr. This - is a sum of values selected from the following: - \begin{options} - \item[1 (= 0x001)] Start and end of major GC cycle. - \item[2 (= 0x002)] Minor collection and major GC slice. - \item[4 (= 0x004)] Growing and shrinking of the heap. - \item[8 (= 0x008)] Resizing of stacks and memory manager tables. - \item[16 (= 0x010)] Heap compaction. - \item[32 (= 0x020)] Change of GC parameters. - \item[64 (= 0x040)] Computation of major GC slice size. - \item[128 (= 0x080)] Calling of finalization functions - \item[256 (= 0x100)] Startup messages (loading the bytecode - executable file, resolving shared libraries). - \item[512 (= 0x200)] Computation of compaction-triggering condition. - \item[1024 (= 0x400)] Output GC statistics at program exit. - \end{options} - \item[c] ("cleanup_on_exit") Shut the runtime down gracefully on exit (see - "caml_shutdown" in section~\ref{ss:c-embedded-code}). The option also enables - pooling (as in "caml_startup_pooled"). This mode can be used to detect - leaks with a third-party memory debugger. - % FIXME missing: H, t, w, W see MPR#7870 - \item[M] ("custom_major_ratio") Target ratio of floating garbage to - major heap size for out-of-heap memory held by custom values - (e.g. bigarrays) located in the major heap. The GC speed is adjusted - to try to use this much memory for dead values that are not yet - collected. Expressed as a percentage of major heap size. Default: - 44. Note: this only applies to values allocated with - "caml_alloc_custom_mem". - \item[m] ("custom_minor_ratio") Bound on floating garbage for - out-of-heap memory - held by custom values in the minor heap. A minor GC is triggered - when this much memory is held by custom values located in the minor - heap. Expressed as a percentage of minor heap size. Default: - 100. Note: this only applies to values allocated with - "caml_alloc_custom_mem". - \item[n] ("custom_minor_max_size") Maximum amount of out-of-heap - memory for each custom value allocated in the minor heap. When a custom - value is allocated on the minor heap and holds more than this many - bytes, only this value is counted against "custom_minor_ratio" and - the rest is directly counted against "custom_major_ratio". - Default: 8192 bytes. Note: - this only applies to values allocated with "caml_alloc_custom_mem". - \end{options} - The multiplier is "k", "M", or "G", for multiplication by $2^{10}$, - $2^{20}$, and $2^{30}$ respectively. - - If the option letter is not recognized, the whole parameter is ignored; - if the equal sign or the number is missing, the value is taken as 1; - if the multiplier is not recognized, it is ignored. - - For example, on a 32-bit machine, under "bash" the command -\begin{verbatim} - export OCAMLRUNPARAM='b,s=256k,v=0x015' -\end{verbatim} - tells a subsequent "ocamlrun" to print backtraces for uncaught exceptions, - set its initial minor heap size to 1~megabyte and - print a message at the start of each major GC cycle, when the heap - size changes, and when compaction is triggered. - -\item["CAMLRUNPARAM"] If "OCAMLRUNPARAM" is not found in the - environment, then "CAMLRUNPARAM" will be used instead. If - "CAMLRUNPARAM" is also not found, then the default values will be used. - -\item["PATH"] List of directories searched to find the bytecode -executable file. -\end{options} - -\section{s:ocamlrun-dllpath}{Dynamic loading of shared libraries} - -On platforms that support dynamic loading, "ocamlrun" can link -dynamically with C shared libraries (DLLs) providing additional C primitives -beyond those provided by the standard runtime system. The names for -these libraries are provided at link time as described in -section~\ref{ss:dynlink-c-code}), and recorded in the bytecode executable -file; "ocamlrun", then, locates these libraries and resolves references -to their primitives when the bytecode executable program starts. - -The "ocamlrun" command searches shared libraries in the following -directories, in the order indicated: -\begin{enumerate} -\item Directories specified on the "ocamlrun" command line with the -"-I" option. -\item Directories specified in the "CAML_LD_LIBRARY_PATH" environment -variable. -\item Directories specified at link-time via the "-dllpath" option to -"ocamlc". (These directories are recorded in the bytecode executable -file.) -\item Directories specified in the file "ld.conf". This file resides -in the OCaml standard library directory, and lists directory -names (one per line) to be searched. Typically, it contains only one -line naming the "stublibs" subdirectory of the OCaml standard -library directory. Users can add there the names of other directories -containing frequently-used shared libraries; however, for consistency -of installation, we recommend that shared libraries are installed -directly in the system "stublibs" directory, rather than adding lines -to the "ld.conf" file. -\item Default directories searched by the system dynamic loader. -Under Unix, these generally include "/lib" and "/usr/lib", plus the -directories listed in the file "/etc/ld.so.conf" and the environment -variable "LD_LIBRARY_PATH". Under Windows, these include the Windows -system directories, plus the directories listed in the "PATH" -environment variable. -\end{enumerate} - -\section{s:ocamlrun-common-errors}{Common errors} - -This section describes and explains the most frequently encountered -error messages. - -\begin{options} - -\item[{\it filename}": no such file or directory"] -If {\it filename} is the name of a self-executable bytecode file, this -means that either that file does not exist, or that it failed to run -the "ocamlrun" bytecode interpreter on itself. The second possibility -indicates that OCaml has not been properly installed on your -system. - -\item["Cannot exec ocamlrun"] -(When launching a self-executable bytecode file.) The "ocamlrun" - could not be found in the executable path. Check that OCaml - has been properly installed on your system. - -\item["Cannot find the bytecode file"] -The file that "ocamlrun" is trying to execute (e.g. the file given as -first non-option argument to "ocamlrun") either does not exist, or is -not a valid executable bytecode file. - -\item["Truncated bytecode file"] -The file that "ocamlrun" is trying to execute is not a valid executable -bytecode file. Probably it has been truncated or mangled since -created. Erase and rebuild it. - -\item["Uncaught exception"] -The program being executed contains a ``stray'' exception. That is, -it raises an exception at some point, and this exception is never -caught. This causes immediate termination of the program. The name of -the exception is printed, along with its string, byte sequence, and -integer arguments -(arguments of more complex types are not correctly printed). -To locate the context of the uncaught exception, compile the program -with the "-g" option and either run it again under the "ocamldebug" -debugger (see chapter~\ref{c:debugger}), or run it with "ocamlrun -b" -or with the "OCAMLRUNPARAM" environment variable set to "b=1". - -\item["Out of memory"] -The program being executed requires more memory than available. Either -the program builds excessively large data structures; or the program -contains too many nested function calls, and the stack overflows. In -some cases, your program is perfectly correct, it just requires more -memory than your machine provides. In other cases, the ``out of -memory'' message reveals an error in your program: non-terminating -recursive function, allocation of an excessively large array, -string or byte sequence, attempts to build an infinite list or other -data structure, \ldots - -To help you diagnose this error, run your program with the "-v" option -to "ocamlrun", or with the "OCAMLRUNPARAM" environment variable set to -"v=63". If it displays lots of ``"Growing stack"\ldots'' -messages, this is probably a looping recursive function. If it -displays lots of ``"Growing heap"\ldots'' messages, with the heap size -growing slowly, this is probably an attempt to construct a data -structure with too many (infinitely many?) cells. If it displays few -``"Growing heap"\ldots'' messages, but with a huge increment in the -heap size, this is probably an attempt to build an excessively large -array, string or byte sequence. - -\end{options} diff --git a/manual/manual/cmds/top.etex b/manual/manual/cmds/top.etex deleted file mode 100644 index f8b3b1f2..00000000 --- a/manual/manual/cmds/top.etex +++ /dev/null @@ -1,455 +0,0 @@ -\chapter{The toplevel system or REPL (ocaml)} \label{c:camllight} -%HEVEA\cutname{toplevel.html} - -This chapter describes the toplevel system for OCaml, that permits -interactive use of the OCaml system -through a read-eval-print loop (REPL). In this mode, the system repeatedly -reads OCaml phrases from the input, then typechecks, compile and -evaluate them, then prints the inferred type and result value, if -any. The system prints a "#" (sharp) prompt before reading each -phrase. - -Input to the toplevel can span several lines. It is terminated by @";;"@ (a -double-semicolon). The toplevel input consists in one or several -toplevel phrases, with the following syntax: - -\begin{syntax} -toplevel-input: - {{ definition }} ';;' - | expr ';;' - | '#' ident [ directive-argument ] ';;' -; -directive-argument: - string-literal - | integer-literal - | value-path - | 'true' || 'false' -\end{syntax} - -A phrase can consist of a definition, like those found in -implementations of compilation units or in @'struct' \ldots 'end'@ -module expressions. The definition can bind value names, type names, -an exception, a module name, or a module type name. The toplevel -system performs the bindings, then prints the types and values (if -any) for the names thus defined. - -A phrase may also consist in a value expression -(section~\ref{s:value-expr}). It is simply evaluated -without performing any bindings, and its value is -printed. - -Finally, a phrase can also consist in a toplevel directive, -starting with @"#"@ (the sharp sign). These directives control the -behavior of the toplevel; they are listed below in -section~\ref{s:toplevel-directives}. - -\begin{unix} -The toplevel system is started by the command "ocaml", as follows: -\begin{alltt} - ocaml \var{options} \var{objects} # interactive mode - ocaml \var{options} \var{objects} \var{scriptfile} # script mode -\end{alltt} -\var{options} are described below. -\var{objects} are filenames ending in ".cmo" or ".cma"; they are -loaded into the interpreter immediately after \var{options} are set. -\var{scriptfile} is any file name not ending in ".cmo" or ".cma". - -If no \var{scriptfile} is given on the command line, the toplevel system -enters interactive mode: phrases are read on standard input, results -are printed on standard output, errors on standard error. End-of-file -on standard input terminates "ocaml" (see also the "#quit" directive -in section~\ref{s:toplevel-directives}). - -On start-up (before the first phrase is read), if the file -".ocamlinit" exists in the current directory, -its contents are read as a sequence of OCaml phrases -and executed as per the "#use" directive -described in section~\ref{s:toplevel-directives}. -The evaluation outcode for each phrase are not displayed. -If the current directory does not contain an ".ocamlinit" file, -the file "XDG_CONFIG_HOME/ocaml/init.ml" is looked up according -to the XDG base directory specification and used instead (on Windows -this is skipped). If that file doesn't exist then an [.ocamlinit] file -in the users' home directory (determined via environment variable "HOME") is -used if existing. - -The toplevel system does not perform line editing, but it can -easily be used in conjunction with an external line editor such as -"ledit", or "rlwrap". An improved toplevel, "utop", is also available. -Another option is to use "ocaml" under Gnu Emacs, which gives the -full editing power of Emacs (command "run-caml" from library "inf-caml"). - -At any point, the parsing, compilation or evaluation of the current -phrase can be interrupted by pressing "ctrl-C" (or, more precisely, -by sending the "INTR" signal to the "ocaml" process). The toplevel -then immediately returns to the "#" prompt. - -If \var{scriptfile} is given on the command-line to "ocaml", the toplevel -system enters script mode: the contents of the file are read as a -sequence of OCaml phrases and executed, as per the "#use" -directive (section~\ref{s:toplevel-directives}). The outcome of the -evaluation is not printed. On reaching the end of file, the "ocaml" -command exits immediately. No commands are read from standard input. -"Sys.argv" is transformed, ignoring all OCaml parameters, and -starting with the script file name in "Sys.argv.(0)". - -In script mode, the first line of the script is ignored if it starts -with "#!". Thus, it should be possible to make the script -itself executable and put as first line "#!/usr/local/bin/ocaml", -thus calling the toplevel system automatically when the script is -run. However, "ocaml" itself is a "#!" script on most installations -of OCaml, and Unix kernels usually do not handle nested "#!" -scripts. A better solution is to put the following as the first line -of the script: -\begin{verbatim} - #!/usr/local/bin/ocamlrun /usr/local/bin/ocaml -\end{verbatim} - -\end{unix} - -\section{s:toplevel-options}{Options} - -The following command-line options are recognized by the "ocaml" command. -% Configure boolean variables used by the macros in unified-options.etex -\compfalse -\natfalse -\toptrue -% unified-options gathers all options across the native/bytecode -% compilers and toplevel -\input{unified-options.tex} - -\begin{unix} -The following environment variables are also consulted: -\begin{options} -\item["OCAMLTOP_INCLUDE_PATH"] Additional directories to search for compiled - object code files (".cmi", ".cmo" and ".cma"). The specified directories are - considered from left to right, after the include directories specified on the - command line via "-I" have been searched. Available since OCaml 4.08. - -\item["OCAMLTOP_UTF_8"] When printing string values, non-ascii bytes -($ {} > "\0x7E" $) are printed as decimal escape sequence if "OCAMLTOP_UTF_8" is -set to false. Otherwise, they are printed unescaped. - -\item["TERM"] When printing error messages, the toplevel system -attempts to underline visually the location of the error. It -consults the "TERM" variable to determines the type of output terminal -and look up its capabilities in the terminal database. - -\item["XDG_CONFIG_HOME", "HOME"] -".ocamlinit" lookup procedure (see above). -\end{options} -\end{unix} - -\section{s:toplevel-directives}{Toplevel directives} - -The following directives control the toplevel behavior, load files in -memory, and trace program execution. - -{\bf Note:} all directives start with a "#" (sharp) symbol. This "#" -must be typed before the directive, and must not be confused with the -"#" prompt displayed by the interactive loop. For instance, -typing "#quit;;" will exit the toplevel loop, but typing "quit;;" -will result in an ``unbound value "quit"'' error. - -% -% Remark: this list of options should be kept synchronized with the documentation -% in toplevel/topdirs.ml. -% -\begin{options} -\item[General] - \begin{options} - \item["#help;;"] - Prints a list of all available directives, with corresponding argument type - if appropriate. - \item["#quit;;"] - Exit the toplevel loop and terminate the "ocaml" command. - \end{options} - -\item[Loading codes] - \begin{options} - - \item["#cd \""\var{dir-name}"\";;"] - Change the current working directory. - - \item["#directory \""\var{dir-name}"\";;"] - Add the given directory to the list of directories searched for - source and compiled files. - - \item["#remove_directory \""\var{dir-name}"\";;"] - Remove the given directory from the list of directories searched for - source and compiled files. Do nothing if the list does not contain - the given directory. - - \item["#load \""\var{file-name}"\";;"] - Load in memory a bytecode object file (".cmo" file) or library file - (".cma" file) produced by the batch compiler "ocamlc". - - \item["#load_rec \""\var{file-name}"\";;"] - Load in memory a bytecode object file (".cmo" file) or library file - (".cma" file) produced by the batch compiler "ocamlc". - When loading an object file that depends on other modules - which have not been loaded yet, the .cmo files for these modules - are searched and loaded as well, recursively. The loading order - is not specified. - - \item["#use \""\var{file-name}"\";;"] - Read, compile and execute source phrases from the given file. - This is textual inclusion: phrases are processed just as if - they were typed on standard input. The reading of the file stops at - the first error encountered. - - \item["#use_output \""\var{command}"\";;"] - Execute a command and evaluate its output as if it had been captured - to a file and passed to "#use". - - \item["#mod_use \""\var{file-name}"\";;"] - Similar to "#use" but also wrap the code into a top-level module of the - same name as capitalized file name without extensions, following - semantics of the compiler. - \end{options} - -For directives that take file names as arguments, if the given file -name specifies no directory, the file is searched in the following -directories: -\begin{enumerate} - \item In script mode, the directory containing the script currently - executing; in interactive mode, the current working directory. - \item Directories added with the "#directory" directive. - \item Directories given on the command line with "-I" options. - \item The standard library directory. -\end{enumerate} - -\item[Environment queries] - \begin{options} - \item["#show_class "\var{class-path}";;"]\vspace{-4.7ex} - \item["#show_class_type "\var{class-path}";;"]\vspace{-4.7ex} - \item["#show_exception "\var{ident}";;"]\vspace{-4.7ex} - \item["#show_module "\var{module-path}";;"]\vspace{-4.7ex} - \item["#show_module_type "\var{modtype-path}";;"]\vspace{-4.7ex} - \item["#show_type "\var{typeconstr}";;"]\vspace{-4.7ex} - \item["#show_val "\var{value-path}";;"] - Print the signature of the corresponding component. - - \item["#show "\var{ident}";;"] - Print the signatures of components with name \var{ident} in all the - above categories. - \end{options} - -\item[Pretty-printing] - \begin{options} - - \item["#install_printer "\var{printer-name}";;"] - This directive registers the function named \var{printer-name} (a - value path) as a printer for values whose types match the argument - type of the function. That is, the toplevel loop will call - \var{printer-name} when it has such a value to print. - - The printing function \var{printer-name} should have type - @"Format.formatter" "->" @t@ "->" "unit"@, where @@t@@ is the - type for the values to be printed, and should output its textual - representation for the value of type @@t@@ on the given formatter, - using the functions provided by the "Format" library. For backward - compatibility, \var{printer-name} can also have type - @@t@ "->" "unit"@ and should then output on the standard - formatter, but this usage is deprecated. - - \item["#print_depth "\var{n}";;"] - Limit the printing of values to a maximal depth of \var{n}. - The parts of values whose depth exceeds \var{n} are printed as "..." - (ellipsis). - - \item["#print_length "\var{n}";;"] - Limit the number of value nodes printed to at most \var{n}. - Remaining parts of values are printed as "..." (ellipsis). - - \item["#remove_printer "\var{printer-name}";;"] - Remove the named function from the table of toplevel printers. -\end{options} - -\item[Tracing] - \begin{options} - \item["#trace "\var{function-name}";;"] - After executing this directive, all calls to the function named - \var{function-name} will be ``traced''. That is, the argument and the - result are displayed for each call, as well as the exceptions escaping - out of the function, raised either by the function itself or by - another function it calls. If the function is curried, each argument - is printed as it is passed to the function. - - \item["#untrace "\var{function-name}";;"] - Stop tracing the given function. - - \item["#untrace_all;;"] - Stop tracing all functions traced so far. - \end{options} - -\item[Compiler options] - \begin{options} - \item["#labels "\var{bool}";;"] - Ignore labels in function types if argument is "false", or switch back - to default behaviour (commuting style) if argument is "true". - - \item["#ppx \""\var{file-name}"\";;"] - After parsing, pipe the abstract syntax tree through the preprocessor - command. - - \item["#principal "\var{bool}";;"] - If the argument is "true", check information paths during - type-checking, to make sure that all types are derived in a principal - way. If the argument is "false", do not check information paths. - - \item["#rectypes;;"] - Allow arbitrary recursive types during type-checking. Note: once - enabled, this option cannot be disabled because that would lead to - unsoundness of the type system. - - \item["#warn_error \""\var{warning-list}"\";;"] - Treat as errors the warnings enabled by the argument and as normal - warnings the warnings disabled by the argument. - - \item["#warnings \""\var{warning-list}"\";;"] - Enable or disable warnings according to the argument. - - \end{options} - -\end{options} - -\section{s:toplevel-modules}{The toplevel and the module system} - -Toplevel phrases can refer to identifiers defined in compilation units -with the same mechanisms as for separately compiled units: either by -using qualified names ("Modulename.localname"), or by using -the "open" construct and unqualified names (see section~\ref{s:names}). - -However, before referencing another compilation unit, an -implementation of that unit must be present in memory. -At start-up, the toplevel system contains implementations for all the -modules in the the standard library. Implementations for user modules -can be entered with the "#load" directive described above. Referencing -a unit for which no implementation has been provided -results in the error "Reference to undefined global `...'". - -Note that entering "open "\var{Mod} merely accesses the compiled -interface (".cmi" file) for \var{Mod}, but does not load the -implementation of \var{Mod}, and does not cause any error if no -implementation of \var{Mod} has been loaded. The error -``reference to undefined global \var{Mod}'' will occur only when -executing a value or module definition that refers to \var{Mod}. - -\section{s:toplevel-common-errors}{Common errors} - -This section describes and explains the most frequently encountered -error messages. - -\begin{options} - -\item[Cannot find file \var{filename}] -The named file could not be found in the current directory, nor in the -directories of the search path. - -If \var{filename} has the format \var{mod}".cmi", this -means you have referenced the compilation unit \var{mod}, but its -compiled interface could not be found. Fix: compile \var{mod}".mli" or -\var{mod}".ml" first, to create the compiled interface \var{mod}".cmi". - -If \var{filename} has the format \var{mod}".cmo", this -means you are trying to load with "#load" a bytecode object file that -does not exist yet. Fix: compile \var{mod}".ml" first. - -If your program spans several directories, this error can also appear -because you haven't specified the directories to look into. Fix: use -the "#directory" directive to add the correct directories to the -search path. - -\item[This expression has type \nth{t}{1}, but is used with type \nth{t}{2}] -See section~\ref{s:comp-errors}. - -\item[Reference to undefined global \var{mod}] -You have neglected to load in memory an implementation for a module -with "#load". See section~\ref{s:toplevel-modules} above. - -\end{options} - -\section{s:custom-toplevel}{Building custom toplevel systems: \texttt{ocamlmktop}} - -The "ocamlmktop" command builds OCaml toplevels that -contain user code preloaded at start-up. - -The "ocamlmktop" command takes as argument a set of ".cmo" and ".cma" -files, and links them with the object files that implement the OCaml toplevel. -The typical use is: -\begin{verbatim} - ocamlmktop -o mytoplevel foo.cmo bar.cmo gee.cmo -\end{verbatim} -This creates the bytecode file "mytoplevel", containing the OCaml toplevel -system, plus the code from the three ".cmo" -files. This toplevel is directly executable and is started by: -\begin{verbatim} - ./mytoplevel -\end{verbatim} -This enters a regular toplevel loop, except that the code from -"foo.cmo", "bar.cmo" and "gee.cmo" is already loaded in memory, just as -if you had typed: -\begin{verbatim} - #load "foo.cmo";; - #load "bar.cmo";; - #load "gee.cmo";; -\end{verbatim} -on entrance to the toplevel. The modules "Foo", "Bar" and "Gee" are -not opened, though; you still have to do -\begin{verbatim} - open Foo;; -\end{verbatim} -yourself, if this is what you wish. - -\subsection{ss:ocamlmktop-options}{Options} - -The following command-line options are recognized by "ocamlmktop". - -\begin{options} - -\item["-cclib" \var{libname}] -Pass the "-l"\var{libname} option to the C linker when linking in -``custom runtime'' mode. See the corresponding option for -"ocamlc", in chapter~\ref{c:camlc}. - -\item["-ccopt" \var{option}] -Pass the given option to the C compiler and linker, when linking in -``custom runtime'' mode. See the corresponding option for -"ocamlc", in chapter~\ref{c:camlc}. - -\item["-custom"] -Link in ``custom runtime'' mode. See the corresponding option for -"ocamlc", in chapter~\ref{c:camlc}. - -\item["-I" \var{directory}] -Add the given directory to the list of directories searched for -compiled object code files (".cmo" and ".cma"). - -\item["-o" \var{exec-file}] -Specify the name of the toplevel file produced by the linker. -The default is "a.out". - -\end{options} - -\section{s:ocamlnat}{The native toplevel: \texttt{ocamlnat}\ (experimental)} - -{\bf This section describes a tool that is not yet officially supported % -but may be found useful.} - -OCaml code executing in the traditional toplevel system uses the bytecode -interpreter. When increased performance is required, or for testing -programs that will only execute correctly when compiled to native code, -the {\em native toplevel} may be used instead. - -For the majority of installations the native toplevel will not have been -installed along with the rest of the OCaml toolchain. In such circumstances -it will be necessary to build the OCaml distribution from source. -From the built source tree of the distribution you may use -{\tt make natruntop} to build and execute a native toplevel. (Alternatively -{\tt make ocamlnat} can be used, which just performs the build step.) - -If the {\tt make install} command is run after having built the native -toplevel then the {\tt ocamlnat} program (either from the source or the -installation directory) may be invoked directly rather than using -{\tt make natruntop}. diff --git a/manual/manual/cmds/unified-options.etex b/manual/manual/cmds/unified-options.etex deleted file mode 100644 index b17aed6a..00000000 --- a/manual/manual/cmds/unified-options.etex +++ /dev/null @@ -1,846 +0,0 @@ -% -% This file describes the native/bytecode compiler and toplevel -% options. Since specific options can exist in only a subset of -% \{toplevel, bytecode compiler, native compiler \} and their description -% might differ across this subset, this file uses macros to adapt the -% description tool by tool: -\long\def\comp#1{\ifcomp#1\else\fi} -% \long is needed for multiparagraph macros -\long\def\nat#1{\ifnat#1\else\fi} -\long\def\top#1{\iftop#1\else\fi} -\long\def\notop#1{\iftop\else#1\fi} -% ( Note that the previous definitions relies on the three boolean values -% \top, \nat and \comp. The manual section must therefore -% set these boolean values accordingly. -% ) -% The macros (\comp, \nat, \top) adds a supplementary text -% if we are respectively in the (bytecode compiler, native compiler, toplevel) -% section. -% The toplevel options are quite different from the compilers' options. -% It is therefore useful to have also a substractive \notop macro -% that prints its content only outside of the topvel section -% -% For instance, to add an option "-foo" that applies to the native and -% bytecode compiler, one can write -% \notop{\item["-foo"] -% ... -% } -% -% Similarly, an option "-bar" only available in the native compiler -% can be introduced with -% \nat{\item["-bar"] -% ... -% } -% These macros can be also used to add information that are only relevant to -% some tools or differ slightly from one tool to another. For instance, we -% define the following macro for the pairs cma/cmxa cmo/cmxo and ocamlc/ocamlopt -% -\def\cma{\comp{.cma}\nat{.cmxa}} -\def\cmo{\comp{.cmo}\nat{.cmx}} -\def\qcmo{{\machine\cmo}} -\def\qcma{{\machine\cma}} -\def\ocamlx{\comp{ocamlc}\nat{ocamlopt}} -% -% -\begin{options} -\notop{% -\item["-a"] -Build a library(\nat{".cmxa" and ".a"/".lib" files}\comp{".cma" file}) -with the object files (\nat{".cmx" and ".o"/".obj" files}\comp{ ".cmo" files}) -given on the command line, instead of linking them into an executable file. -The name of the library must be set with the "-o" option. - -If \comp{"-custom", }"-cclib" or "-ccopt" options are passed on the command -line, these options are stored in the resulting \qcma library. Then, -linking with this library automatically adds back the \comp{"-custom", } -"-cclib" and "-ccopt" options as if they had been provided on the -command line, unless the "-noautolink" option is given. -}%notop - -\item["-absname"] -Force error messages to show absolute paths for file names. - -\notop{\item["-annot"] -Deprecated since OCaml 4.11. Please use "-bin-annot" instead. -}%notop - -\item["-args" \var{filename}] -Read additional newline-terminated command line arguments from \var{filename}. -\top{It is not possible to pass a \var{scriptfile} via file to the toplevel. -}%top -\item["-args0" \var{filename}] - Read additional null character terminated command line arguments from - \var{filename}. -\top{It is not possible to pass a \var{scriptfile} via file to the toplevel. -}%top - - -\notop{\item["-bin-annot"] -Dump detailed information about the compilation (types, bindings, -tail-calls, etc) in binary format. The information for file \var{src}".ml" -(resp. \var{src}".mli") is put into file \var{src}".cmt" -(resp. \var{src}".cmti"). In case of a type error, dump -all the information inferred by the type-checker before the error. -The "*.cmt" and "*.cmti" files produced by "-bin-annot" contain -more information and are much more compact than the files produced by -"-annot". -}%notop - -\notop{\item["-c"] -Compile only. Suppress the linking phase of the -compilation. Source code files are turned into compiled files, but no -executable file is produced. This option is useful to -compile modules separately. -}%notop - -\notop{% -\item["-cc" \var{ccomp}] -Use \var{ccomp} as the C linker \nat{called to build the final executable } -\comp{when linking in ``custom runtime'' mode (see the "-custom" option)} -and as the C compiler for compiling ".c" source files. -}%notop - -\notop{% -\item["-cclib" "-l"\var{libname}] -Pass the "-l"\var{libname} option to the \comp{C} linker -\comp{when linking in ``custom runtime'' mode (see the "-custom" option)}. -This causes the given C library to be linked with the program. -}%notop - -\notop{% -\item["-ccopt" \var{option}] -Pass the given option to the C compiler and linker. -\comp{When linking in ``custom runtime'' mode, for instance}% -\nat{For instance,}% -"-ccopt -L"\var{dir} causes the C linker to search for C libraries in -directory \var{dir}.\comp{(See the "-custom" option.)} -}%notop - -\notop{% -\item["-color" \var{mode}] -Enable or disable colors in compiler messages (especially warnings and errors). -The following modes are supported: -\begin{description} - \item["auto"] use heuristics to enable colors only if the output supports them - (an ANSI-compatible tty terminal); - \item["always"] enable colors unconditionally; - \item["never"] disable color output. -\end{description} -The default setting is 'auto', and the current heuristic -checks that the "TERM" environment variable exists and is -not empty or "dumb", and that 'isatty(stderr)' holds. - -The environment variable "OCAML_COLOR" is considered if "-color" is not -provided. Its values are auto/always/never as above. -}%notop - -\notop{% -\item["-error-style" \var{mode}] -Control the way error messages and warnings are printed. -The following modes are supported: -\begin{description} - \item["short"] only print the error and its location; - \item["contextual"] like "short", but also display the source code snippet - corresponding to the location of the error. - \end{description} -The default setting is "contextual". - -The environment variable "OCAML_ERROR_STYLE" is considered if "-error-style" is -not provided. Its values are short/contextual as above. -}%notop - -\comp{% -\item["-compat-32"] -Check that the generated bytecode executable can run on 32-bit -platforms and signal an error if it cannot. This is useful when -compiling bytecode on a 64-bit machine. -}%comp - -\nat{% -\item["-compact"] -Optimize the produced code for space rather than for time. This -results in slightly smaller but slightly slower programs. The default is to -optimize for speed. -}%nat - -\notop{% -\item["-config"] -Print the version number of {\machine\ocamlx} and a detailed -summary of its configuration, then exit. -}%notop - -\notop{% -\item["-config-var" \var{var}] -Print the value of a specific configuration variable from the -"-config" output, then exit. If the variable does not exist, the exit -code is non-zero. This option is only available since OCaml 4.08, -so script authors should have a fallback for older versions. -}%notop - -\comp{% -\item["-custom"] -Link in ``custom runtime'' mode. In the default linking mode, the -linker produces bytecode that is intended to be executed with the -shared runtime system, "ocamlrun". In the custom runtime mode, the -linker produces an output file that contains both the runtime system -and the bytecode for the program. The resulting file is larger, but it -can be executed directly, even if the "ocamlrun" command is not -installed. Moreover, the ``custom runtime'' mode enables static -linking of OCaml code with user-defined C functions, as described in -chapter~\ref{c:intf-c}. -\begin{unix} -Never use the "strip" command on executables produced by "ocamlc -custom", -this would remove the bytecode part of the executable. -\end{unix} -\begin{unix} -Security warning: never set the ``setuid'' or ``setgid'' bits on executables -produced by "ocamlc -custom", this would make them vulnerable to attacks. -\end{unix} -}%comp - -\notop{% -\item["-depend" \var{ocamldep-args}] -Compute dependencies, as the "ocamldep" command would do. The remaining -arguments are interpreted as if they were given to the "ocamldep" command. -}%notop - -\comp{ -\item["-dllib" "-l"\var{libname}] -Arrange for the C shared library "dll"\var{libname}".so" -("dll"\var{libname}".dll" under Windows) to be loaded dynamically -by the run-time system "ocamlrun" at program start-up time. -}%comp - -\comp{\item["-dllpath" \var{dir}] -Adds the directory \var{dir} to the run-time search path for shared -C libraries. At link-time, shared libraries are searched in the -standard search path (the one corresponding to the "-I" option). -The "-dllpath" option simply stores \var{dir} in the produced -executable file, where "ocamlrun" can find it and use it as -described in section~\ref{s:ocamlrun-dllpath}. -}%comp - -\notop{% -\item["-for-pack" \var{module-path}] -Generate an object file (\qcmo\nat{ and ".o"/".obj" files}) -that can later be included -as a sub-module (with the given access path) of a compilation unit -constructed with "-pack". For instance, -{\machine\ocamlx\ -for-pack\ P\ -c\ A.ml} -will generate {\machine a.\cmo}\nat{ and "a.o" files} that can -later be used with {\machine \ocamlx\ -pack\ -o\ P\cmo\ a\cmo}. -Note: you can still pack a module that was compiled without -"-for-pack" but in this case exceptions will be printed with the wrong -names. -}%notop - -\notop{% -\item["-g"] -Add debugging information while compiling and linking. This option is -required in order to \comp{be able to debug the program with "ocamldebug" -(see chapter~\ref{c:debugger}), and to} produce stack backtraces when -the program terminates on an uncaught exception (see -section~\ref{s:ocamlrun-options}). -}%notop - -\notop{% -\item["-i"] -Cause the compiler to print all defined names (with their inferred -types or their definitions) when compiling an implementation (".ml" -file). No compiled files (".cmo" and ".cmi" files) are produced. -This can be useful to check the types inferred by the -compiler. Also, since the output follows the syntax of interfaces, it -can help in writing an explicit interface (".mli" file) for a file: -just redirect the standard output of the compiler to a ".mli" file, -and edit that file to remove all declarations of unexported names. -}%notop - -\item["-I" \var{directory}] -Add the given directory to the list of directories searched for -\nat{compiled interface files (".cmi"), compiled object code files (".cmx"), -and libraries (".cmxa").} -\comp{compiled interface files (".cmi"), compiled object code files ".cmo", -libraries (".cma") and C libraries specified with "-cclib -lxxx".} -\top{source and compiled files.} -By default, the current directory is searched first, then the standard -library directory. Directories added with "-I" are searched after the -current directory, in the order in which they were given on the command line, -but before the standard library directory. See also option "-nostdlib". - -If the given directory starts with "+", it is taken relative to the -standard library directory. For instance, "-I +unix" adds the -subdirectory "unix" of the standard library to the search path. - -\top{% -Directories can also be added to the list once -the toplevel is running with the "#directory" directive -(section~\ref{s:toplevel-directives}). -}%top - -\top{% -\item["-init" \var{file}] -Load the given file instead of the default initialization file. -The default file is ".ocamlinit" in the current directory if it -exists, otherwise "XDG_CONFIG_HOME/ocaml/init.ml" or -".ocamlinit" in the user's home directory. -}%top - -\notop{% -\item["-impl" \var{filename}] -Compile the file \var{filename} as an implementation file, even if its -extension is not ".ml". -}%notop - -\nat{% -\item["-inline" \var{n}] -Set aggressiveness of inlining to \var{n}, where \var{n} is a positive -integer. Specifying "-inline 0" prevents all functions from being -inlined, except those whose body is smaller than the call site. Thus, -inlining causes no expansion in code size. The default aggressiveness, -"-inline 1", allows slightly larger functions to be inlined, resulting -in a slight expansion in code size. Higher values for the "-inline" -option cause larger and larger functions to become candidate for -inlining, but can result in a serious increase in code size. -}%nat - -\notop{% -\item["-intf" \var{filename}] -Compile the file \var{filename} as an interface file, even if its -extension is not ".mli". -}%notop - -\notop{% -\item["-intf-suffix" \var{string}] -Recognize file names ending with \var{string} as interface files -(instead of the default ".mli"). -}%\notop - -\item["-labels"] -Labels are not ignored in types, labels may be used in applications, -and labelled parameters can be given in any order. This is the default. - -\notop{% -\item["-linkall"] -Force all modules contained in libraries to be linked in. If this -flag is not given, unreferenced modules are not linked in. When -building a library (option "-a"), setting the "-linkall" option forces all -subsequent links of programs involving that library to link all the -modules contained in the library. When compiling a module (option -"-c"), setting the "-linkall" option ensures that this module will -always be linked if it is put in a library and this library is linked. -}%notop - -\nat{% -\item["-linscan"] -Use linear scan register allocation. Compiling with this allocator is faster -than with the usual graph coloring allocator, sometimes quite drastically so for -long functions and modules. On the other hand, the generated code can be a bit -slower. -}%nat - -\comp{% -\item["-make-runtime"] -Build a custom runtime system (in the file specified by option "-o") -incorporating the C object files and libraries given on the command -line. This custom runtime system can be used later to execute -bytecode executables produced with the -"ocamlc -use-runtime" \var{runtime-name} option. -See section~\ref{ss:custom-runtime} for more information. -}%comp - -\notop{% -\item["-match-context-rows"] -Set the number of rows of context used for optimization during -pattern matching compilation. The default value is 32. Lower values -cause faster compilation, but less optimized code. This advanced -option is meant for use in the event that a pattern-match-heavy -program leads to significant increases in compilation time. -}%notop - -\notop{% -\item["-no-alias-deps"] -Do not record dependencies for module aliases. See -section~\ref{s:module-alias} for more information. -}%notop - -\item["-no-app-funct"] -Deactivates the applicative behaviour of functors. With this option, -each functor application generates new types in its result and -applying the same functor twice to the same argument yields two -incompatible structures. - -\nat{% -\item["-no-float-const-prop"] -Deactivates the constant propagation for floating-point operations. -This option should be given if the program changes the float rounding -mode during its execution. -}%nat - -\item["-noassert"] -Do not compile assertion checks. Note that the special form -"assert false" is always compiled because it is typed specially. -\notop{This flag has no effect when linking already-compiled files.} - -\notop{% -\item["-noautolink"] -When linking \qcma libraries, ignore \comp{"-custom",} "-cclib" and "-ccopt" -options potentially contained in the libraries (if these options were -given when building the libraries). This can be useful if a library -contains incorrect specifications of C libraries or C options; in this -case, during linking, set "-noautolink" and pass the correct C -libraries and options on the command line. -}% - -\nat{% -\item["-nodynlink"] -Allow the compiler to use some optimizations that are valid only for -code that is statically linked to produce a non-relocatable -executable. The generated code cannot be linked to produce a shared -library nor a position-independent executable (PIE). Many operating -systems produce PIEs by default, causing errors when linking code -compiled with "-nodynlink". Either do not use "-nodynlink" or pass -the option "-ccopt -no-pie" at link-time. -}%nat - -\item["-nolabels"] -Ignore non-optional labels in types. Labels cannot be used in -applications, and parameter order becomes strict. - -\top{% -\item["-noprompt"] -Do not display any prompt when waiting for input. -}%top - -\top{% -\item["-nopromptcont"] -Do not display the secondary prompt when waiting for continuation -lines in multi-line inputs. This should be used e.g. when running -"ocaml" in an "emacs" window. -}%top - -\item["-nostdlib"] -\top{% -Do not include the standard library directory in the list of -directories searched for source and compiled files. -}%top -\comp{% -Do not include the standard library directory in the list of -directories searched for -compiled interface files (".cmi"), compiled object code files -(".cmo"), libraries (".cma"), and C libraries specified with -"-cclib -lxxx". See also option "-I". -}%comp -\nat{% -Do not automatically add the standard library directory to the list of -directories searched for compiled interface files (".cmi"), compiled -object code files (".cmx"), and libraries (".cmxa"). See also option -"-I". -}%nat - -\notop{% -\item["-o" \var{exec-file}] -Specify the name of the output file produced by the -\nat{linker}\comp{compiler}. The -default output name is "a.out" under Unix and "camlprog.exe" under -Windows. If the "-a" option is given, specify the name of the library -produced. If the "-pack" option is given, specify the name of the -packed object file produced. If the "-output-obj" option is given, -specify the name of the output file produced. -\nat{If the "-shared" option is given, specify the name of plugin -file produced.} -\comp{If the "-c" option is given, specify the name of the object -file produced for the {\em next} source file that appears on the -command line.} -}%notop - -\notop{% -\item["-opaque"] -When the native compiler compiles an implementation, by default it -produces a ".cmx" file containing information for cross-module -optimization. It also expects ".cmx" files to be present for the -dependencies of the currently compiled source, and uses them for -optimization. Since OCaml 4.03, the compiler will emit a warning if it -is unable to locate the ".cmx" file of one of those dependencies. - -The "-opaque" option, available since 4.04, disables cross-module -optimization information for the currently compiled unit. When -compiling ".mli" interface, using "-opaque" marks the compiled ".cmi" -interface so that subsequent compilations of modules that depend on it -will not rely on the corresponding ".cmx" file, nor warn if it is -absent. When the native compiler compiles a ".ml" implementation, -using "-opaque" generates a ".cmx" that does not contain any -cross-module optimization information. - -Using this option may degrade the quality of generated code, but it -reduces compilation time, both on clean and incremental -builds. Indeed, with the native compiler, when the implementation of -a compilation unit changes, all the units that depend on it may need -to be recompiled -- because the cross-module information may have -changed. If the compilation unit whose implementation changed was -compiled with "-opaque", no such recompilation needs to occur. This -option can thus be used, for example, to get faster edit-compile-test -feedback loops. -}%notop - -\notop{% -\item["-open" \var{Module}] -Opens the given module before processing the interface or -implementation files. If several "-open" options are given, -they are processed in order, just as if -the statements "open!" \var{Module1}";;" "..." "open!" \var{ModuleN}";;" -were added at the top of each file. -}%notop - -\notop{% -\item["-output-obj"] -Cause the linker to produce a C object file instead of -\comp{a bytecode executable file}\nat{an executable file}. -This is useful to wrap OCaml code as a C library, -callable from any C program. See chapter~\ref{c:intf-c}, -section~\ref{ss:c-embedded-code}. The name of the output object file -must be set with the "-o" option. -This option can also be used to produce a \comp{C source file (".c" extension) -or a} compiled shared/dynamic library (".so" extension, ".dll" under Windows). -}%notop - -\comp{% -\item["-output-complete-exe"] -Build a self-contained executable by linking a C object file containing the -bytecode program, the OCaml runtime system and any other static C code given to -"ocamlc". The resulting effect is similar to "-custom", except that the bytecode -is embedded in the C code so it is no longer accessible to tools such as -"ocamldebug". On the other hand, the resulting binary is resistant to "strip". -}%comp - -\nat{% -\item["-pack"] -Build an object file (".cmx" and ".o"/".obj" files) and its associated compiled -interface (".cmi") that combines the ".cmx" object -files given on the command line, making them appear as sub-modules of -the output ".cmx" file. The name of the output ".cmx" file must be -given with the "-o" option. For instance, -\begin{verbatim} - ocamlopt -pack -o P.cmx A.cmx B.cmx C.cmx -\end{verbatim} -generates compiled files "P.cmx", "P.o" and "P.cmi" describing a -compilation unit having three sub-modules "A", "B" and "C", -corresponding to the contents of the object files "A.cmx", "B.cmx" and -"C.cmx". These contents can be referenced as "P.A", "P.B" and "P.C" -in the remainder of the program. - -The ".cmx" object files being combined must have been compiled with -the appropriate "-for-pack" option. In the example above, -"A.cmx", "B.cmx" and "C.cmx" must have been compiled with -"ocamlopt -for-pack P". - -Multiple levels of packing can be achieved by combining "-pack" with -"-for-pack". Consider the following example: -\begin{verbatim} - ocamlopt -for-pack P.Q -c A.ml - ocamlopt -pack -o Q.cmx -for-pack P A.cmx - ocamlopt -for-pack P -c B.ml - ocamlopt -pack -o P.cmx Q.cmx B.cmx -\end{verbatim} -The resulting "P.cmx" object file has sub-modules "P.Q", "P.Q.A" -and "P.B". -}%nat - -\comp{% -\item["-pack"] -Build a bytecode object file (".cmo" file) and its associated compiled -interface (".cmi") that combines the object -files given on the command line, making them appear as sub-modules of -the output ".cmo" file. The name of the output ".cmo" file must be -given with the "-o" option. For instance, -\begin{verbatim} - ocamlc -pack -o p.cmo a.cmo b.cmo c.cmo -\end{verbatim} -generates compiled files "p.cmo" and "p.cmi" describing a compilation -unit having three sub-modules "A", "B" and "C", corresponding to the -contents of the object files "a.cmo", "b.cmo" and "c.cmo". These -contents can be referenced as "P.A", "P.B" and "P.C" in the remainder -of the program. -}%comp - -\notop{% -\item["-pp" \var{command}] -Cause the compiler to call the given \var{command} as a preprocessor -for each source file. The output of \var{command} is redirected to -an intermediate file, which is compiled. If there are no compilation -errors, the intermediate file is deleted afterwards. -}%notop - -\item["-ppx" \var{command}] -After parsing, pipe the abstract syntax tree through the preprocessor -\var{command}. The module "Ast_mapper", described in -\ifouthtml -chapter~\ref{c:parsinglib}: -\ahref{compilerlibref/Ast\_mapper.html}{ \texttt{Ast_mapper} } -\else section~\ref{Ast-underscoremapper}\fi, -implements the external interface of a preprocessor. - -\item["-principal"] -Check information path during type-checking, to make sure that all -types are derived in a principal way. When using labelled arguments -and/or polymorphic methods, this flag is required to ensure future -versions of the compiler will be able to infer types correctly, even -if internal algorithms change. -All programs accepted in "-principal" mode are also accepted in the -default mode with equivalent types, but different binary signatures, -and this may slow down type checking; yet it is a good idea to -use it once before publishing source code. - -\item["-rectypes"] -Allow arbitrary recursive types during type-checking. By default, -only recursive types where the recursion goes through an object type -are supported.\notop{Note that once you have created an interface using this -flag, you must use it again for all dependencies.} - -\notop{% -\item["-runtime-variant" \var{suffix}] -Add the \var{suffix} string to the name of the runtime library used by -the program. Currently, only one such suffix is supported: "d", and -only if the OCaml compiler was configured with option -"-with-debug-runtime". This suffix gives the debug version of the -runtime, which is useful for debugging pointer problems in low-level -code such as C stubs. -}%notop - -\notop{ -\item["-stop-after" \var{pass}] -Stop compilation after the given compilation pass. The currently -supported passes are: -"parsing", "typing"\nat{, "scheduling", "emit"}. -}%notop - -\nat{ -\item["-save-ir-after" \var{pass}] -Save intermediate representation after the given compilation pass -to a file. -The currently supported passes and the corresponding file extensions are: -"scheduling" (".cmir-linear"). - -This experimental feature enables external tools to inspect and manipulate -compiler's intermediate representation of the program -using "compiler-libs" library (see -\ifouthtml chapter~\ref{c:parsinglib} and -\ahref{compilerlibref/Compiler\_libs.html}{ \texttt{Compiler_libs} } -\else section~\ref{Compiler-underscorelibs}\fi -). -}%nat - -\nat{% -\item["-S"] -Keep the assembly code produced during the compilation. The assembly -code for the source file \var{x}".ml" is saved in the file \var{x}".s". -}%nat - -\nat{% -\item["-shared"] -Build a plugin (usually ".cmxs") that can be dynamically loaded with -the "Dynlink" module. The name of the plugin must be -set with the "-o" option. A plugin can include a number of OCaml -modules and libraries, and extra native objects (".o", ".obj", ".a", -".lib" files). Building native plugins is only supported for some -operating system. Under some systems (currently, -only Linux AMD 64), all the OCaml code linked in a plugin must have -been compiled without the "-nodynlink" flag. Some constraints might also -apply to the way the extra native objects have been compiled (under -Linux AMD 64, they must contain only position-independent code). -}%nat - -\item["-safe-string"] -Enforce the separation between types "string" and "bytes", -thereby making strings read-only. This is the default. - -\item["-short-paths"] -When a type is visible under several module-paths, use the shortest -one when printing the type's name in inferred interfaces and error and -warning messages. Identifier names starting with an underscore "_" or -containing double underscores "__" incur a penalty of $+10$ when computing -their length. - -\top{ -\item["-stdin"] -Read the standard input as a script file rather than starting an -interactive session. -}%top - -\item["-strict-sequence"] -Force the left-hand part of each sequence to have type unit. - -\item["-strict-formats"] -Reject invalid formats that were accepted in legacy format -implementations. You should use this flag to detect and fix such -invalid formats, as they will be rejected by future OCaml versions. - -\notop{% -\item["-unboxed-types"] -When a type is unboxable (i.e. a record with a single argument or a -concrete datatype with a single constructor of one argument) it will -be unboxed unless annotated with "[@@ocaml.boxed]". -}%notop - -\notop{% -\item["-no-unboxed-types"] -When a type is unboxable it will be boxed unless annotated with -"[@@ocaml.unboxed]". This is the default. -}%notop - -\item["-unsafe"] -Turn bound checking off for array and string accesses (the "v.(i)" and -"s.[i]" constructs). Programs compiled with "-unsafe" are therefore -\comp{slightly} faster, but unsafe: anything can happen if the program -accesses an array or string outside of its bounds. -\notop{% -Additionally, turn off the check for zero divisor in integer division - and modulus operations. With "-unsafe", an integer division -(or modulus) by zero can halt the program or continue with an -unspecified result instead of raising a "Division_by_zero" exception. -}%notop - -\item["-unsafe-string"] -Identify the types "string" and "bytes", thereby making strings writable. -This is intended for compatibility with old source code and should not -be used with new software. - -\comp{% -\item["-use-runtime" \var{runtime-name}] -Generate a bytecode executable file that can be executed on the custom -runtime system \var{runtime-name}, built earlier with -"ocamlc -make-runtime" \var{runtime-name}. -See section~\ref{ss:custom-runtime} for more information. -}%comp - -\item["-v"] -Print the version number of the compiler and the location of the -standard library directory, then exit. - -\item["-verbose"] -Print all external commands before they are executed, -\nat{in particular invocations of the assembler, C compiler, and linker.} -\comp{in particular invocations of the C compiler and linker in "-custom" mode.} -Useful to debug C library problems. - -\notop{% -\item["-version" or "-vnum"] -Print the version number of the compiler in short form (e.g. "3.11.0"), -then exit. -}%notop - -\top{% -\item["-version"] -Print version string and exit. - -\item["-vnum"] -Print short version number and exit. - -\item["-no-version"] -Do not print the version banner at startup. -}%top - -\item["-w" \var{warning-list}] -Enable, disable, or mark as fatal the warnings specified by the argument -\var{warning-list}. -Each warning can be {\em enabled} or {\em disabled}, and each warning -can be {\em fatal} or {\em non-fatal}. -If a warning is disabled, it isn't displayed and doesn't affect -compilation in any way (even if it is fatal). If a warning is -enabled, it is displayed normally by the compiler whenever the source -code triggers it. If it is enabled and fatal, the compiler will also -stop with an error after displaying it. - -The \var{warning-list} argument is a sequence of warning specifiers, -with no separators between them. A warning specifier is one of the -following: - -\begin{options} -\item["+"\var{num}] Enable warning number \var{num}. -\item["-"\var{num}] Disable warning number \var{num}. -\item["@"\var{num}] Enable and mark as fatal warning number \var{num}. -\item["+"\var{num1}..\var{num2}] Enable warnings in the given range. -\item["-"\var{num1}..\var{num2}] Disable warnings in the given range. -\item["@"\var{num1}..\var{num2}] Enable and mark as fatal warnings in -the given range. -\item["+"\var{letter}] Enable the set of warnings corresponding to -\var{letter}. The letter may be uppercase or lowercase. -\item["-"\var{letter}] Disable the set of warnings corresponding to -\var{letter}. The letter may be uppercase or lowercase. -\item["@"\var{letter}] Enable and mark as fatal the set of warnings -corresponding to \var{letter}. The letter may be uppercase or -lowercase. -\item[\var{uppercase-letter}] Enable the set of warnings corresponding -to \var{uppercase-letter}. -\item[\var{lowercase-letter}] Disable the set of warnings corresponding -to \var{lowercase-letter}. -\end{options} - -Alternatively, \var{warning-list} can specify a single warning using its -mnemonic name (see below), as follows: - -\begin{options} -\item["+"\var{name}] Enable warning \var{name}. -\item["-"\var{name}] Disable warning \var{name}. -\item["@"\var{name}] Enable and mark as fatal warning \var{name}. -\end{options} - -Warning numbers, letters and names which are not currently defined are -ignored. The warnings are as follows (the name following each number specifies -the mnemonic for that warning). -\begin{options} -\input{warnings-help.tex} -\end{options} - -The default setting is "-w +a-4-6-7-9-27-29-32..42-44-45-48-50-60". -It is displayed by {\machine\ocamlx\ -help}. -Note that warnings 5 and 10 are not always triggered, depending on -the internals of the type checker. - - -\item["-warn-error" \var{warning-list}] -Mark as fatal the warnings specified in the argument \var{warning-list}. -The compiler will stop with an error when one of these warnings is -emitted. The \var{warning-list} has the same meaning as for -the "-w" option: a "+" sign (or an uppercase letter) marks the -corresponding warnings as fatal, a "-" -sign (or a lowercase letter) turns them back into non-fatal warnings, -and a "@" sign both enables and marks as fatal the corresponding -warnings. - -Note: it is not recommended to use warning sets (i.e. letters) as -arguments to "-warn-error" -in production code, because this can break your build when future versions -of OCaml add some new warnings. - -The default setting is "-warn-error -a+31" (only warning 31 is fatal). - -\item["-warn-help"] -Show the description of all available warning numbers. - -\notop{% -\item["-where"] -Print the location of the standard library, then exit. -}%notop - -\notop{% -\item["-with-runtime"] -Include the runtime system in the generated program. This is the default. -} - -\notop{% -\item["-without-runtime"] -The compiler does not include the runtime system (nor a reference to it) in the -generated program; it must be supplied separately. -} - -\item["-" \var{file}] -\notop{Process \var{file} as a file name, even if it starts with a dash ("-") -character.} -\top{Use \var{file} as a script file name, even when it starts with a -hyphen (-).} - -\item["-help" or "--help"] -Display a short usage summary and exit. - -\end{options} -% diff --git a/manual/manual/foreword.etex b/manual/manual/foreword.etex deleted file mode 100644 index 614e6b52..00000000 --- a/manual/manual/foreword.etex +++ /dev/null @@ -1,79 +0,0 @@ -\chapter*{Foreword} -\markboth{Foreword}{} -%HEVEA\cutname{foreword.html} - -This manual documents the release \ocamlversion\ of the OCaml -system. It is organized as follows. -\begin{itemize} -\item Part~\ref{p:tutorials}, ``An introduction to OCaml'', -gives an overview of the language. -\item Part~\ref{p:refman}, ``The OCaml language'', is the -reference description of the language. -\item Part~\ref{p:commands}, ``The OCaml tools'', documents -the compilers, toplevel system, and programming utilities. -\item Part~\ref{p:library}, ``The OCaml library'', describes the -modules provided in the standard library. -\begin{latexonly} -\item Part~\ref{p:indexes}, ``Indexes'', contains an -index of all identifiers defined in the standard library, and an -index of keywords. -\end{latexonly} -\end{itemize} - -\section*{conventions}{Conventions} - -OCaml runs on several operating systems. The parts of -this manual that are specific to one operating system are presented as -shown below: - -\begin{unix} This is material specific to the Unix family of operating -systems, including Linux and macOS. -\end{unix} - -\begin{windows} This is material specific to Microsoft Windows - (Vista, 7, 8, 10). -\end{windows} - -\section*{license}{License} - -The OCaml system is copyright \copyright\ 1996--\number\year\ -Institut National de Recherche en Informatique et en -Automatique (INRIA). -INRIA holds all ownership rights to the OCaml system. - -The OCaml system is open source and can be freely -redistributed. See the file "LICENSE" in the distribution for -licensing information. - -The OCaml documentation and user's manual is -copyright \copyright\ \number\year\ -Institut National de Recherche en Informatique et en -Automatique (INRIA). - -\begin{latexonly} -The OCaml documentation and user's manual is licensed under a Creative -Commons Attribution-ShareAlike 4.0 International License (CC BY-SA -4.0), \url{https://creativecommons.org/licenses/by-sa/4.0/}. -\end{latexonly} - -\begin{htmlonly} -\begin{rawhtml} - -The OCaml documentation and user's manual is licensed under a -Creative Commons Attribution-ShareAlike 4.0 International License. -\end{rawhtml} -\end{htmlonly} - -\section*{availability}{Availability} - -\begin{latexonly} -The complete OCaml distribution can be accessed via the website -\url{https://ocaml.org/}. This site contains a lot of additional -information on OCaml. -\end{latexonly} - -\begin{htmlonly} -The complete OCaml distribution can be accessed via the -\href{https://ocaml.org/}{ocaml.org website}. -This site contains a lot of additional information on OCaml. -\end{htmlonly} diff --git a/manual/manual/html_processing/.gitignore b/manual/manual/html_processing/.gitignore deleted file mode 100644 index fcd498c1..00000000 --- a/manual/manual/html_processing/.gitignore +++ /dev/null @@ -1,7 +0,0 @@ -dune -markup.ml -uchar -uutf -lambdasoup -ocaml-re -.sass-cache diff --git a/manual/manual/html_processing/Makefile b/manual/manual/html_processing/Makefile deleted file mode 100644 index f4d5b147..00000000 --- a/manual/manual/html_processing/Makefile +++ /dev/null @@ -1,137 +0,0 @@ -DUNE_CMD := $(if $(wildcard dune/dune.exe),dune/dune.exe,dune) -DUNE ?= $(DUNE_CMD) - -DEBUG ?= 0 -ifeq ($(DEBUG), 1) - DBG= -else - DBG=quiet -endif - -WEBDIR = ../webman -WEBDIRMAN = $(WEBDIR)/manual -WEBDIRAPI = $(WEBDIR)/api -WEBDIRCOMP = $(WEBDIRAPI)/compilerlibref - -# The "all" target generates the Web Manual in the directories -# ../webman/manual, ../webman/api, and ../webman/api/compilerlibref -all: css js img - $(DUNE) exec --root=. src/process_manual.exe $(DBG) - $(DUNE) exec --root=. src/process_api.exe overwrite $(DBG) - $(DUNE) exec --root=. src/process_api.exe compiler overwrite $(DBG) - -$(WEBDIR): - mkdir -p $(WEBDIRMAN) - mkdir -p $(WEBDIRCOMP) - -$(WEBDIRMAN)/manual.css: scss/_common.scss scss/manual.scss $(WEBDIR) - sass scss/manual.scss > $(WEBDIRMAN)/manual.css - -$(WEBDIRAPI)/style.css: scss/_common.scss scss/style.scss $(WEBDIR) - sass scss/style.scss > $(WEBDIRAPI)/style.css - cp $(WEBDIRAPI)/style.css $(WEBDIRCOMP)/style.css - -css: $(WEBDIRMAN)/manual.css $(WEBDIRAPI)/style.css - -# Just copy the JS files -JS_FILES0 := scroll.js navigation.js -JS_FILES1 := $(JS_FILES0) search.js -JS_FILES := $(addprefix $(WEBDIRAPI)/, $(JS_FILES1)) $(addprefix $(WEBDIRCOMP)/, $(JS_FILES1)) $(addprefix $(WEBDIRMAN)/, $(JS_FILES0)) - -# There must be a more clever way -$(WEBDIRAPI)/%.js: js/%.js - cp $< $@ - -$(WEBDIRMAN)/%.js: js/%.js - cp $< $@ - -$(WEBDIRCOMP)/%.js: js/%.js - cp $< $@ - -js: $(WEBDIR) $(JS_FILES) - -# download images for local use -SEARCH := search_icon.svg -$(WEBDIRAPI)/search_icon.svg: $(WEBDIR) - curl "https://ocaml.org/img/search.svg" > $(WEBDIRAPI)/$(SEARCH) - cp $(WEBDIRAPI)/$(SEARCH) $(WEBDIRCOMP)/$(SEARCH) - -LOGO := colour-logo.svg -$(WEBDIRAPI)/colour-logo.svg: $(WEBDIR) - curl "https://raw.githubusercontent.com/ocaml/ocaml-logo/master/Colour/SVG/colour-logo.svg" > $(WEBDIRAPI)/$(LOGO) - cp $(WEBDIRAPI)/$(LOGO) $(WEBDIRMAN)/$(LOGO) - cp $(WEBDIRAPI)/$(LOGO) $(WEBDIRCOMP)/$(LOGO) - -ICON := favicon.ico -$(WEBDIRAPI)/favicon.ico: $(WEBDIR) - curl "https://raw.githubusercontent.com/ocaml/ocaml-logo/master/Colour/Favicon/32x32.ico" > $(WEBDIRAPI)/$(ICON) - cp $(WEBDIRAPI)/$(ICON) $(WEBDIRMAN)/$(ICON) - cp $(WEBDIRAPI)/$(ICON) $(WEBDIRCOMP)/$(ICON) - -IMG_FILES0 := colour-logo.svg -IMG_FILES := $(addprefix $(WEBDIRAPI)/, $(IMG_FILES0)) $(addprefix $(WEBDIRCOMP)/, $(IMG_FILES0)) $(addprefix $(WEBDIRMAN)/, $(IMG_FILES0)) - -img: $(WEBDIR) $(WEBDIRAPI)/search_icon.svg $(WEBDIRAPI)/favicon.ico $(WEBDIRCOMP)/search_icon.svg $(WEBDIRCOMP)/favicon.ico $(IMG_FILES) - -clean: - rm -rf $(WEBDIR) src/.merlin _build - -distclean:: - rm -rf .sass-cache - -# We need Dune and Lambda Soup; Markup.ml and Uutf are dependencies -DUNE_TAG = 2.6.2 -LAMBDASOUP_TAG = 0.7.1 -MARKUP_TAG = 0.8.2 -UUTF_TAG = v1.0.2 -RE_TAG = 1.9.0 - -# Duniverse rules - set-up dune and the dependencies in-tree for CI -duniverse: dune/dune.exe re markup.ml uutf lambdasoup - -dune/dune.exe: dune - cd dune; ocaml bootstrap.ml - -GIT_CHECKOUT = git -c advice.detachedHead=false checkout - -dune: - git clone https://github.com/ocaml/dune.git -n -o upstream - cd dune; $(GIT_CHECKOUT) $(DUNE_TAG) - -distclean:: - rm -rf dune - -re: - git clone https://github.com/ocaml/ocaml-re.git -n -o upstream - cd ocaml-re; $(GIT_CHECKOUT) $(RE_TAG) - -distclean:: - rm -rf ocaml-re - -lambdasoup: - git clone https://github.com/aantron/lambdasoup.git -n -o upstream - cd lambdasoup; $(GIT_CHECKOUT) $(LAMBDASOUP_TAG) - -distclean:: - rm -rf lambdasoup - -markup.ml: - git clone https://github.com/aantron/markup.ml.git -n -o upstream - cd markup.ml; $(GIT_CHECKOUT) $(MARKUP_TAG) - -distclean:: - rm -rf markup.ml - -uutf: - git clone https://github.com/dbuenzli/uutf.git -n -o upstream - cd uutf; $(GIT_CHECKOUT) $(UUTF_TAG) - cd uutf; \ - mv opam uutf.opam; \ - echo '(lang dune 1.0)' > dune-project; \ - echo '(name uutf)' >> dune-project; \ - echo '(library (name uutf)(public_name uutf)(flags (:standard -w -3-27))(wrapped false))' > src/dune - -distclean:: - rm -rf uutf - -.PHONY: css js img duniverse diff --git a/manual/manual/html_processing/README.md b/manual/manual/html_processing/README.md deleted file mode 100644 index 9741b275..00000000 --- a/manual/manual/html_processing/README.md +++ /dev/null @@ -1,71 +0,0 @@ -# HTML post-processing - -This directory contains material for enhancing the html of the manual -and the API (from the `../htmlman` directory), including a quick -search widget for the API. - -The process will create the `../webman` dir, and output the new html -files (and assets) in `../webman/manual` (the manual) and `../webman/api` (the -API). - -## manual and api - -There are two different scripts, `process_manual.ml` and -`process_api.ml`. The first one deals with all the chapters of the -manual, while the latter deals with the api generated with `ocamldoc`. -They both use a common module `common.ml`. - -## How to build - -With dependencies to build the whole manual: -``` -cd .. -make web -``` - -Or, much faster if you know that `htmlman` is already up-to-date, from -within the `html_processing` dir: - -``` -make -``` - -You need a working -[`sass`](https://sass-lang.com/) CSS processor (tested with version -"3.4.23"). - -## How to browse - -From the `html_processing` directory: - -`firefox ../webman/api/index.html` - -`firefox ../webman/manual/index.html` - -## Debug - -``` -make DEBUG=1 -``` - -By default all html files are re-created by `make`, but the javascript -index `webman/api/index.js` and `webman/api/compilerlibref/index.js` -are kept if they already exist. You can use `make clean` to delete all -generated files. - -The javascript files in the `html_processing/js` dir add functionality -but the web-manual is still browsable without them: - -- `scroll.js`: adds smooth scrolling in the html page, but only for - near targets. The reason is that when you jump to another place in a - text, if the jump is immediate (no scrolling), you easily get lost; - for instance you usually don't even realize that the target of the - link is just half a page below! Thus smooth scrolling helps - _understanding the structure_ of the document. However, when the - target is very far, the browser will scroll a huge amount of text - very quickly, and this becomes useless, and even painful for the - eye. Hence we disable smooth scrolling for far targets. - -- `search.js`: adds an 'as-you-type quick search widget', which - recognize values, modules, and type signatures. It is very useful, - but of course not strictly necessary. diff --git a/manual/manual/html_processing/dune-project b/manual/manual/html_processing/dune-project deleted file mode 100644 index 0636ab6a..00000000 --- a/manual/manual/html_processing/dune-project +++ /dev/null @@ -1 +0,0 @@ -(lang dune 1.11) diff --git a/manual/manual/html_processing/js/navigation.js b/manual/manual/html_processing/js/navigation.js deleted file mode 100644 index 7e21ffeb..00000000 --- a/manual/manual/html_processing/js/navigation.js +++ /dev/null @@ -1,102 +0,0 @@ -// NaVigation helpers for the manual, especially in mobile mode. - -// copyright 2020 San Vu Ngoc -// - -// Permission to use, copy, modify, and/or distribute this software -// for any purpose with or without fee is hereby granted, provided -// that the above copyright notice and this permission notice appear -// in all copies. - -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -// NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// In mobile mode, both left navigation bar and top part menu are -// closed by default. - -var MENU_HEIGHT = 0; - -function closeSidebarExceptSearch (event) { - if ( event && event.target && event.target.classList.contains("api_search") ) { - false; - } else { - closeSidebar (); - true; - } -} - -// This closes the sidebar in mobile mode. This should have no effect -// in desktop mode. -function closeSidebar () { - let bar = document.getElementById("sidebar"); - let w = getComputedStyle(bar).width; - bar.style.left = "-" + w; - document.body.removeEventListener("click", closeSidebarExceptSearch); -} - -function toggleSidebar () { - let bar = document.getElementById("sidebar"); - let l = getComputedStyle(bar).left; - if (l == "0px") { - closeSidebar (); - } else { - bar.style.left = "0px"; - setTimeout(function(){ - // Any click anywhere but in search widget will close the sidebar - document.body.addEventListener("click", closeSidebarExceptSearch); - }, 1000); - } -} - -function togglePartMenu () { - let pm = document.getElementById("part-menu"); - let h = pm.offsetHeight; - if ( h == 0 ) { - pm.style.height = MENU_HEIGHT.toString() + "px"; - } else { - pm.style.height = "0px"; - } -} - -function partMenu () { - let pm = document.getElementById("part-menu"); - if ( pm != null ) { - MENU_HEIGHT = pm.scrollHeight; // This should give the true - // height of the menu, even if - // it was initialized to 0 in - // the CSS (mobile view). - // In desktop mode, the height is initially on "auto"; we - // have to detect it in - // order for the css animmations to work. - // TODO update this when window is resized - let currentHeight = pm.offsetHeight; - pm.style.height = currentHeight.toString() + "px"; - let p = document.getElementById("part-title"); - if ( p != null ) { - p.onclick = togglePartMenu; - } - } -} - -function sideBar () { - closeSidebar(); - let btn = document.getElementById("sidebar-button"); - btn.onclick = toggleSidebar; -} - -// We add it to the chain of window.onload -window.onload=(function(previousLoad){ - return function (){ - previousLoad && previousLoad (); - partMenu (); - sideBar (); - } -})(window.onload); - - diff --git a/manual/manual/html_processing/js/scroll.js b/manual/manual/html_processing/js/scroll.js deleted file mode 100644 index 3d6f731f..00000000 --- a/manual/manual/html_processing/js/scroll.js +++ /dev/null @@ -1,104 +0,0 @@ -// Smooth scrolling only for near targets -// copyright 2019-2020 San Vu Ngoc -// - -// Permission to use, copy, modify, and/or distribute this software -// for any purpose with or without fee is hereby granted, provided -// that the above copyright notice and this permission notice appear -// in all copies. - -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -// NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - - -// Goal: if a link is located at distance larger than MAX_DISTANCE, we -// don't use a smooth scrolling. -// -// usage: to activate this, run setSmooth within window.onload: -// window.onload = setSmooth -// Here instead we create a loading chain because we have other things -// to add window.onload later. - -const MAX_DISTANCE = 1000; -const SCROLL_DURATION = 600; - -const url = window.location.pathname; -var filename = url.substring(url.lastIndexOf('/')+1); -if (filename == "") { filename = "index.html"; } - -function localLink (link) { - return (link.length > 0 && - (link.charAt(0) == '#' - || link.substring(0,filename.length) == filename)); -} - -//aaa.html#s%3Adatatypes --> s:datatypes -function getId (link) { - let uri = link.substring(link.lastIndexOf('#')+1); - return decodeURIComponent(uri) - // for instance decodeURIComponent("s%3Adatatypes") == 's:datatypes' -} - -// Get absolute y position of element. -// modified from: -// https://www.kirupa.com/html5/get_element_position_using_javascript.htm -// assuming effective licence CC0, see -// https://forum.kirupa.com/t/get-an-elements-position-using-javascript/352186/3 -function getPosition(el) { - let yPos = 0; - while (el) { - yPos += (el.offsetTop + el.clientTop); - el = el.offsetParent; - } - return yPos; -} - -// This function scans all "a" tags with a valid "href", and for those -// that are local links (links within the same file) it adds a special -// onclick function for smooth scrolling. -function setSmooth () { - let a = document.getElementsByTagName("a"); - let container = document.body.parentNode; - let i; - for (i = 0; i < a.length; i++) { - let href = a[i].getAttribute("href"); - if (href != null && localLink(href)) { - a[i].onclick = function () { - let id = getId(href); - let target = ""; - if ( id == "" ) { - target = container; - } else { - target = document.getElementById(id); } - if (! target) { - console.log ("Error, no target for id=" + id); - target = container; } - let top = container.scrollTop; - let dist = top - getPosition(target) - if (Math.abs(dist) < MAX_DISTANCE) { - target.scrollIntoView({ block: "start", inline: "nearest", behavior: 'smooth' }); - setTimeout(function () { - location.href = href; - // this will set the "target" property. - }, SCROLL_DURATION); - return false; - // so we don't follow the link immediately - } - } - } - } -} - -// We add it to the chain of window.onload -window.onload=(function(previousLoad){ - return function (){ - previousLoad && previousLoad (); - setSmooth (); - } -})(window.onload); diff --git a/manual/manual/html_processing/js/search.js b/manual/manual/html_processing/js/search.js deleted file mode 100644 index bb0a2c36..00000000 --- a/manual/manual/html_processing/js/search.js +++ /dev/null @@ -1,248 +0,0 @@ -// Searching the OCAML API. -// Copyright 2019-2020 San VU NGOC - -// Permission to use, copy, modify, and/or distribute this software -// for any purpose with or without fee is hereby granted, provided -// that the above copyright notice and this permission notice appear -// in all copies. - -// THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL -// WARRANTIES WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED -// WARRANTIES OF MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE -// AUTHOR BE LIABLE FOR ANY SPECIAL, DIRECT, INDIRECT, OR -// CONSEQUENTIAL DAMAGES OR ANY DAMAGES WHATSOEVER RESULTING FROM LOSS -// OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT, -// NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN -// CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -// Thanks @steinuil for help on deferred loading. -// Thanks @osener, @UnixJunkie, @Armael for very helpful suggestions -// Thanks to all testers! - -const MAX_RESULTS = 20; -const MAX_ERROR = 10; -const DESCR_INDEX = 4; // index of HTML description in index.js -const SIG_INDEX = 6; // index of HTML signature in index.js -const ERR_INDEX = 8; // length of each line in index.js. This is used - // for storing the computed error, except if we - // don't want description and type signature, - // then ERR_INDEX becomes DESCR_INDEX. - -let indexState = 'NOT_LOADED'; - -// return true if we are loading the index file -function loadingIndex (includeDescr) { - switch (indexState) { - case 'NOT_LOADED': - indexState = 'LOADING'; - - const script = document.createElement('script'); - script.src = 'index.js'; - script.addEventListener('load', () => { - indexState = 'HAS_LOADED'; - mySearch(includeDescr); - }); - document.head.appendChild(script); - return true; - - case 'LOADING': - return true; - - case 'HAS_LOADED': - return false; - } -} - -// line is a string array. We check if sub is a substring of one of -// the elements of the array. The start/end of the string s are marked -// by "^" and "$", and hence these chars can be used in sub to refine -// the search. Case sensitive is better for OCaml modules. Searching -// within line.join() is slightly more efficient that iterating 'line' -// with .findIndex (my benchmarks show about 15% faster; except if we -// search for the value at the beginning of line). However it might -// use more memory. -function hasSubString (sub, line) { - let lineAll = "^" + line.join("$^") + "$"; - return (lineAll.includes(sub)); -} - -// Check if one of the strings in subs is a substring of one of the -// strings in line. -function hasSubStrings (subs, line) { - let lineAll = "^" + line.join("$^") + "$"; - return (subs.findIndex(function (sub) { - return (lineAll.includes(sub))}) !== -1); -} -// Error of sub being a substring of s. Best if starts at 0. Except -// for strings containing "->", which is then best if the substring is -// at the most right-hand position (representing the "return type"). -// markers "^" and "$" for start/end of string can be used: if they -// are not satisfied, the MAX_ERROR is returned. -function subError (sub, s) { - let StartOnly = false; - let EndOnly = false; - if (sub.length>1) { - if (sub[0] == "^") { - StartOnly = true; - sub = sub.substring(1); - } - if (sub[sub.length - 1] == "$") { - EndOnly = true; - sub = sub.substring(0, sub.length - 1); - } - } - let err = s.indexOf(sub); - if (err == -1 || - (StartOnly && err != 0) || - (EndOnly && err != s.length - sub.length)) { - err = MAX_ERROR; - } else { - if ( sub.includes("->") ) { - err = Math.min(s.length - sub.length - err,1); // 0 or 1 - // err = 0 if the substring is right-aligned - } else { - err = Math.min(err,1); // 0 or 1 - // err = 0 if the substring - } - err += Math.abs((s.length - sub.length) / s.length);} - return (err) - // between 0 and 2, except if MAX_ERROR -} - -// Minimal substring error. In particular, it returns 0 if the string -// 'sub' has an exact match with one of the strings in 'line'. -function subMinError (sub, line) { - let errs = line.map(function (s) { return subError (sub, s); }); - return Math.min(...errs); // destructuring assignment -} - - -function add (acc, a) { - return acc + a; -} - -// for each sub we compute the minimal error within 'line', and then -// take the average over all 'subs'. Thus it returns 0 if each sub has -// an exact match with one of the strings in 'line'. -function subsAvgMinError (subs, line) { - let errs = subs.map(function (sub) { return subMinError (sub, line); }); - return errs.reduce(add,0) / subs.length; -} - -function formatLine (line) { - let li = '
  • '; - let html = `${line[0]}.${line[2]}`; - if (line.length > 5) { - if ( line[ERR_INDEX] == 0 ) { - li = '
  • '; - } - html = `
    ${html} : ${line[SIG_INDEX]}
    ${line[DESCR_INDEX]}`; } - return (li + html + "
  • \n"); -} - -// Split a string into an array of non-empty words, or phrases -// delimited by quotes ("") -function splitWords (s) { - let phrases = s.split('"'); - let words = []; - phrases.forEach(function (phrase,i) { - if ( i%2 == 0 ) { - words.push(...phrase.split(" ")); - } else { - words.push(phrase); - } - }); - return (words.filter(function (s) { - return (s !== "")})); -} - -// The initial format of an entry of the GENERAL_INDEX array is -// [ module, module_link, -// value, value_link, -// html_description, bare_description, -// html_signature, bare_signature ] - -// If includeDescr is false, the line is truncated to its first 4 -// elements. When searching, the search error is added at the end of -// each line. - -// In order to reduce the size of the index.js file, one could create -// the bare_description on-the-fly using .textContent, see -// https://stackoverflow.com/questions/28899298/extract-the-text-out-of-html-string-using-javascript, -// but it would probably make searching slower (haven't tested). -function mySearch (includeDescr) { - if (loadingIndex (includeDescr)) { - return; - } - let text = document.getElementById('api_search').value; - let results = []; - let html = ""; - let count = 0; - let err_index = DESCR_INDEX; - - if (text !== "") { - if ( includeDescr ) { - err_index = ERR_INDEX; - } - - let t0 = performance.now(); - let exactMatches = 0; - results = GENERAL_INDEX.filter(function (line) { - // We remove the html hrefs and add the Module.value complete name: - let cleanLine = [line[0], line[2], line[0] + '.' + line[2]]; - line.length = err_index; // This truncates the line: - // this removes the description part if includeDescr = - // false (which modifies the lines of the GENERAL_INDEX.) - if ( includeDescr ) { - cleanLine.push(line[DESCR_INDEX+1]); - cleanLine.push(line[SIG_INDEX+1]); - // add the description and signature (txt format) - } - let error = MAX_ERROR; - if ( exactMatches <= MAX_RESULTS ) { - // We may stop searching when exactMatches > - // MAX_RESULTS because the ranking between all exact - // matches is unspecified (depends on the construction - // of the GENERAL_INDEX array) - if ( hasSubString(text, cleanLine) ) { - error = subMinError(text, cleanLine); - // one could merge hasSubString and subMinError - // for efficiency - } - if ( error != 0 && includeDescr ) { - let words = splitWords(text); - if ( hasSubStrings(words, cleanLine) ) { - // if there is no exact match for text and - // includeDescr=true, we also search for all separated - // words - error = subsAvgMinError(words, cleanLine); - } - } - if ( error == 0 ) { exactMatches += 1; } - } - line[err_index] = error; - // we add the error as element #err_index - return ( error != MAX_ERROR ); - }); - // We sort the results by relevance: - results.sort(function(line1, line2) { - return (line1[err_index] - line2[err_index])}); - count = results.length; - console.log("Search results = " + (count.toString())); - results.length = Math.min(results.length, MAX_RESULTS); - html = "no results"; - } - // inject new html - if (results.length > 0) { - html = "
      "; - function myIter(line, index, array) { - html = html + formatLine(line); - } - results.forEach(myIter); - html += "
    "; - if (count > results.length) { - html += "(...)"; - } - } - document.getElementById("search_results").innerHTML = html; -} diff --git a/manual/manual/html_processing/scss/_common.scss b/manual/manual/html_processing/scss/_common.scss deleted file mode 100644 index 425f2639..00000000 --- a/manual/manual/html_processing/scss/_common.scss +++ /dev/null @@ -1,270 +0,0 @@ -// SCSS Module for manual.scss and style.scss - -// set this to true for integration into the ocaml.org wesite -$ocamlorg:false; -/* ocaml logo color */ -$logocolor:#ec6a0d; -$logo_height:67px; - -@if $ocamlorg { - .container { - margin-left:0; - margin-right:0; - } -} - - -/* Fonts */ -@import url(https://fonts.googleapis.com/css?family=Fira+Mono:400,500); -@import url(https://fonts.googleapis.com/css?family=Noticia+Text:400,400i,700); -@import url(https://fonts.googleapis.com/css?family=Fira+Sans:400,400i,500,500i,600,600i,700,700i); - -$font-sans: "Fira Sans", Helvetica, Arial, sans-serif; -$font-mono: "Fira Mono", courier, monospace; -$font-serif: "Noticia Text", Georgia, serif; - -/* Reset */ -.pre,a,b,body,code,div,em,form,h1,h2,h3,h4,h5,h6,header,html,i,img,li,mark,menu,nav,object,output,p,pre,s,section,span,time,ul,td,var{ - margin:0; - padding:0; - border:0; - font-size:inherit; - font:inherit; - line-height:inherit; - vertical-align:baseline; - text-align:inherit; - color:inherit; - background:0 0 -} -*,:after,:before{ - box-sizing:border-box -} - -html.smooth-scroll { - scroll-behavior:smooth; -} - -@media (prefers-reduced-motion: reduce) { - html { - scroll-behavior:auto; - } -} - -body{ - font-family: $font-sans; - text-align:left; - color:#333; - background:#fff -} - -html { - font-size: 16px; - .dt-thefootnotes{ - height:1ex; - } - .footnotetext{ - font-size: 13px; - } -} - -#sidebar-button{ - float:right; - cursor: context-menu; - span{ - font-size:28px; - } - display:none; - } - -.content, .api { - &>header { - margin-bottom: 30px; - nav { - font-family: $font-sans; - } - } -} - -@mixin content-frame { - max-width:90ex; - margin-left:calc(10vw + 20ex); - margin-right:4ex; - margin-top:20px; - margin-bottom:50px; - font-family: $font-serif; - line-height:1.5 -} - -/* Menu in the left bar */ -@mixin nav-toc { - display: block; - padding-top: 10px; - position:fixed; - @if $ocamlorg { - top:0; - } @else { - top:$logo_height; - } - bottom:0; - left:0; - max-width:30ex; - min-width:26ex; - width:20%; - background:linear-gradient(to left,#ccc,transparent); - overflow:auto; - color:#1F2D3D; - padding-left:2ex; - padding-right:2ex; - .toc_version { - font-size:smaller; - text-align:right; - a { - color:#888; - } - } - ul{ - list-style-type:none; - li{ - margin:0; - ul{ - margin:0 - } - li{ - border-left:1px solid #ccc; - margin-left:5px; - padding-left:12px; - } - a { - font-family: $font-sans; - font-size:.95em; - color:#333; - font-weight:400; - line-height:1.6em; - display:block; - &:hover { - box-shadow:none; - background-color: #edbf84;} - } - &.top a { - color: #848484; - &:hover { - background-color: unset; - text-decoration: underline; - } - } - } - } - &>ul>li { - margin-bottom:.3em; - &>a { /* First level titles */ - font-weight:500;} - } -} - -/* OCaml Logo */ -@mixin brand { - @if $ocamlorg { - display:none; - } - top:0; - height:$logo_height; - img{ - margin-top:14px; - height:36px - } -} - -@mixin mobile { - .api, .content{ - margin:auto; - padding:2em; - h1 { - margin-top:0; - } - } -} - -@mixin nav-toc-mobile { - position:static; - width:auto; - min-width:unset; - border:none; - padding:.2em 1em; - border-radius:5px 0; - &.brand {border-radius: 0 5px;} -} - -/* Header is used as a side-bar */ -@mixin header-mobile { - margin-bottom:0; - position:fixed; - left:-10000px; /* initially hidden */ - background-color:#ffefe7; - transition:left 0.4s; - top:0; - max-width:calc(100% - 2em); - max-height: 100%; - overflow-y: auto; - box-shadow:0.4rem 0rem 0.8rem #bbb; -} - -@mixin sidebar-button { - #sidebar-button{ - display:inline-block; - position:fixed; - top:1.5em; - right:1ex; - } -} - -/* Print adjustements. */ -/* This page can be nicely printed or saved to PDF (local version) */ - -@media print { - body { - color: black; - background: white; - } - body nav:first-child { - position: absolute; - background: transparent; - } - .content, .api { - nav.toc { - margin-right: 1em; - float: left; - position: initial; - background: #eee; - } - margin-left: 3em; - margin-right: 3em; - } -} - -@mixin caret { - content:"▶"; - color:$logocolor; - font-size:smaller; - margin-right:4px; - margin-left:-1em -} - -@mixin disc { - content:"●"; - color:$logocolor; - margin-right:4px; - margin-left:-1em; - font-family: $font-sans; - font-size:13px; - vertical-align:1px; -} - -@mixin diamond { - content:"◆"; - color:$logocolor; - margin-right:4px; - margin-left:-1em; - font-family: $font-sans; - font-size:14px; - vertical-align:1px; -} diff --git a/manual/manual/html_processing/scss/manual.scss b/manual/manual/html_processing/scss/manual.scss deleted file mode 100644 index d73151b0..00000000 --- a/manual/manual/html_processing/scss/manual.scss +++ /dev/null @@ -1,395 +0,0 @@ -// SOURCE FILE - -/* If the above line does not say "SOURCE FILE", then do not edit. It */ -/* means this file is generated from [sass manual.scss] */ - -/* CSS file for the Ocaml manual */ - -/* San Vu Ngoc, 2019-2020 */ - -@import "common"; -@charset "UTF-8"; - -.content{ - @include content-frame; - #part-title{ - float:left; - color:#777; - cursor: context-menu; - font-family: $font-sans; - span{ /* menu icon */ - font-size:22px; - margin-right:1ex; - } - } - ul{list-style:none;} - ul.itemize li::before{@include disc;} - - /* When the TOC is repeated in the main content */ - ul.ul-content { - } - /* navigation links at the bottom of page */ - .bottom-navigation { - margin-bottom:1em; - a.next { - float: right; - } - } - .copyright{ - font-size:smaller; - display:inline-block; - } -} -.index{ /* index.html */ - ul{ - list-style: none; - li { - margin-left: 0.5ex; - span { - color:#c88b5f; - } - span.c003{ - color:#564233; - } - } - } - /* only for Contents/Foreword in index.html: */ - ul.ul-content li::before{ - @include disc; - margin-left: 0; - } - /* table of contents: (manual.001.html): */ - ul.toc ul.toc ul.toc{ - font-size:smaller; - } - section>ul>li>a{ /* for Parts title */ - font-family: $font-sans; - font-size:larger; - background:linear-gradient(to left,#fff 0,#ede8e5 100%); - } - section>ul>li>ul>li:hover{ /* Chapters */ - background:linear-gradient(to left,#fff 0,#ede8e5 100%); - } - section>ul>li>ul>li{ - transition: background 0.5s; - } -} -b{ - font-weight:500 -} -em,i{ - font-style:italic -} -.ocaml { - background:#f7f5f4; -} -.ocaml,pre{ - margin-top:.8em; - margin-bottom:1.2em -} -.ocaml .pre{ - white-space:pre -} -p,ul{ - margin-top:.5em; - margin-bottom:1em -} -ul{ - list-style-position:outside -} -ul>li{ - margin-left:22px -} -li>:first-child{ - margin-top:0 -} -.left{ - text-align:left -} -.right{ - text-align:right -} -a{ - text-decoration:none; - color:#92370a -} -a:hover{ - box-shadow:0 1px 0 0 #92370a -} -:target{ - background-color:rgba(255,215,181,.3)!important; - box-shadow:0 0 0 1px rgba(255,215,181,.8)!important; - border-radius:1px -} -:hover>a.section-anchor{ - visibility:visible -} -a.section-anchor:before{ - content:"#" -} -a.section-anchor:hover{ - box-shadow:none; - text-decoration:none; - color:#555 -} -a.section-anchor{ - visibility:hidden; - position:absolute; - margin-left:-1.3em; - font-weight:400; - font-style:normal; - padding-right:.4em; - padding-left:.4em; - color:#d5d5d5 -} -.h10,.h7,.h8,.h9,h1,h2,h3,h4,h5,h6{ - font-family: $font-sans; - font-weight:400; - margin:.5em 0 .5em 0; - padding-top:.1em; - line-height:1.2; - overflow-wrap:break-word -} -h1{ - font-weight:500; - font-size:2.441em; - margin-top:1.214em -} -h1{ - font-weight:500; - font-size:1.953em; - box-shadow:0 1px 0 0 #ddd -} -h2{ - font-size:1.563em -} -h3{ - font-size:1.25em -} -h1 code{ - font-size:inherit; - font-weight:inherit -} -h2 code{ - font-size:inherit; - font-weight:inherit -} -h3 code{ - font-size:inherit; - font-weight:inherit -} -h3 code{ - font-size:inherit; - font-weight:inherit -} -h4{ - font-size:1.12em -} -h2, h3, h4, h5 { - font-weight: 500; -} -.ocaml,.pre,code,pre,tt{ - font-family: $font-mono; - font-weight:400 -} -.pre,pre{ - border-left:4px solid #e69c7f; - overflow-x:auto; - padding-left:1ex -} -.ocaml .pre{ - overflow-x:initial; -} -.caml-example .ocaml{ - overflow-x:auto; -} -li code,p code{ - background-color:#f6f8fa; - color:#0d2b3e; - border-radius:3px; - padding:0 .3ex -} -.pre .code,.pre.code,pre code{ - background-color:inherit -} -p a>code{ - color:#92370a} -.pre code.ocaml,.pre.code.ocaml,pre code.ocaml{ - font-size:.893rem} -.keyword,.ocamlkeyword{ - font-weight:500} -section+section{ - margin-top:25px} - -/* Table of Contents in the Left-hand sidebar */ -nav.toc{ - @include nav-toc; - &.brand{ - @include brand; - } - .toc_title{ - display:block; - margin:.5em 0 1.414em} -/* .toc_title a{ */ -/* color:#777; */ -/* font-size:1em; */ -/* line-height:1.2; */ - /* font-weight:500} */ - -} -.tableau { - table { - border-collapse: collapse; - } - td { - background:#f8f7f6; - border:1px solid #ccc; - padding-left:3px; - padding-right:3px; - } -} - -pre{ - background:linear-gradient(to left,#fff 0,#ede8e5 100%) -} -code.caml-output.ok,div.caml-output.ok{ - color:#045804 -} -code.caml-output.error,div.caml-output.error{ - color:#ff4500; - white-space:normal -} -.chapter span,.tutorial span,.maintitle h1 span{ - color:$logocolor -} -h1 span{ - color: #d28853; -} -blockquote.quote{ - /*font-size: smaller;*/ - hr{ - display:none; - } -} -#part-menu{ - font-family: $font-sans; - text-align:right; - list-style:none; - overflow-y:hidden; - transition:height 0.3s; -} -#part-menu li.active a{ - color:#000; - &::before{@include diamond} -} -.center { - text-align: center; - margin-left: auto; - margin-right: auto; -} -.display { - margin: 0 auto; -} -.c001 { - border-spacing: 6px; - border-collapse: separate; -} -span.c003{ - color:#564233; - font-family: $font-mono; - border-radius:6px -} -div.caml-example.toplevel code.caml-input::before, -div.caml-example.toplevel div.caml-input::before{ - /* content:"#"; */ /* pre-4.11 */ - color:#888 -} -span.number{ - padding-right: 1ex; -} -span.c004, span.c005, span.c007 { - font-family: $font-mono; -} -span.c003, span.c005 { - color: rgba(91, 33, 6, 0.87); -} -span.c002{ - color:#888 -} -span.c006{ - font-weight:700; - color:#564233; - font-family: $font-mono; -} -.c008 { - font-family: $font-sans; -} -span.c010 { - font-style: italic; -} -span.authors{ - font-style:italic; - background-color:inherit -} -span.c011 { - font-style: italic; -} -.c012 { - font-style: italic; -} -span.c013{ - font-style: italic; -} -.center table { - margin-left: inherit; - margin-right: inherit; -} -td .c014 { - font-weight: bold; -} -.c016 { - text-align: center; -} -.cellpadding1 tr td { - padding: 1px 4px; -} -.caml-input{ - span.ocamlkeyword{ - font-weight:500; - color:#444 - } - span.ocamlhighlight{ - font-weight:500; - text-decoration:underline - } - span.id{ - color:#523b74 - } - span.ocamlstring,.caml-input span.string{ - color:#df5000 - } - span.comment, .caml-input span.ocamlcomment{ - color:#969896 - } -} -.ocaml span.ocamlerror{ - font-weight:500 -} - - -/* Mobile */ -@media only screen and (max-width:95ex){ - @include mobile; - @include sidebar-button; - .content #part-menu{ - display:inline-block; - height:0; - width:100%; - } - nav.toc{ - @include nav-toc-mobile; - } - header{ - @include header-mobile; - } -} diff --git a/manual/manual/html_processing/scss/style.scss b/manual/manual/html_processing/scss/style.scss deleted file mode 100644 index 277664e5..00000000 --- a/manual/manual/html_processing/scss/style.scss +++ /dev/null @@ -1,1074 +0,0 @@ -// SOURCE FILE - -/* If the above line does not say "SOURCE FILE", then do not edit. It */ -/* means this file is generated from [sass style.scss] */ - -/* CSS file for the Ocaml API. San Vu Ngoc 2019 */ - -// TODO: the ocamldoc output of Functors like in -// compilerlibref/4.08/Arg_helper.Make.html -// is not easy to style... without breaking other tables. - -@import "common"; -@charset "UTF-8"; - -// tables are difficult to style, be careful. -// These settings should apply to the main index tables -// (like "index_values.html"), which do not have any particular class. -// These tables have two columns. -.api>table { - word-break: break-word; - // this is unfortunately due to some very long names in Internal modules - td.module, - td:first-child { - width: 33%; - } - td:nth-child(2) { - width: 65%; - } - td[align="left"] { - // for the "Parameter" column of module signatures like - // Arg_helper.Make.html, which unfortunately have no class - // either. - word-break: normal; - } - td[align="left"]:first-child { - width: 1%; - } -} - -.api { - // font-size: 16px; - // font-family: $font-sans; - // text-align: left; - // color: #333; - // background: #FFFFFF; - table { - // tables are difficult to style, be careful - border-collapse: collapse; - border-spacing: 0; - thead { - background: rgb(228, 217, 211); - } - /* must be same as
    : */
    -	background: linear-gradient(to left, white 0%, rgb(237, 232, 229) 100%);
    -	width: 100%;
    -	td {
    -	    padding-left: 1ex;
    -	    padding-right: 1ex;
    -	    /*float: left;*/
    -	}
    -	/* add some room at the end of the table */
    -	tr:last-child td {
    -	    padding-bottom: 7px;
    -	}
    -    }
    -    // Tables are used for describing types, in particular union types:
    -    table.typetable {
    -	width: 100%;
    -	word-break: normal;
    -	box-shadow: none;
    -	td {
    -	    float: left;
    -	}
    -	td:nth-child(2) {
    -	    width: 37%;
    -	    code {
    -		white-space: pre-line;
    -	    }
    -	}
    -	td:last-child {
    -	    width: calc(100% - 1.3em);
    -	    // cf: CamlinternalFormatBasics.html
    -	    // the 1.3em is related to the 1em below
    -	}
    -	td:first-child {
    -	    width: 1em;
    -	}
    -	td:nth-child(4).typefieldcomment {
    -	    /* this should be the column with the type */
    -	    width: 60%;
    -	    /* not optimal, see: Format.html#symbolic
    -	    but leaving it automatic is not always good either: see: Arg.html */
    -	}
    -    }
    -
    -    // for functor signature
    -    table.paramstable {
    -	word-break: normal;
    -	td {
    -	    code {
    -		white-space: pre-wrap;
    -	    }	    
    -	}
    -	td:first-child, td:nth-child(2) {
    -	    width: 1em; // second column should contain only
    -			// ":". First one will adapt to size.
    -	}	
    -    }
    -    
    -    .sig_block {
    -	border-left: 4px solid #e69c7f;
    -	padding-left: 1em;
    -	background: linear-gradient(to left, white 0%, rgb(237, 232, 229) 100%);
    -	// PROBLEM the sig_block ends too soon, it should actually
    -	// include the "end)" line ==> REPORT THIS
    -	// (eg: compilerlibref/Arg_helper.html)
    -	pre {
    -	    margin-top: 0;
    -	    background: none;
    -	    border-left: 0;
    -	}
    -    }
    -    pre .sig_block {
    -	margin-bottom: 0; // see above
    -	border-left: 0;
    -    }
    -	
    -    *, *:before, *:after { 
    -	box-sizing: border-box; 
    -    }
    -    
    -    @include content-frame;
    -
    -    /* Basic markup elements */
    -    
    -    b, strong {
    -	font-weight: 600;
    -    }
    -    i, em {
    -	font-style: italic;
    -    }
    -    sup {
    -	vertical-align: super;
    -    }
    -    sub {
    -	vertical-align: sub;
    -    }
    -    sup, sub {
    -	font-size: 12px;
    -	line-height: 0;
    -	margin-left: 0.2ex;
    -    }
    -    pre {
    -	margin-top: 0.8em;
    -	margin-bottom: 0;
    -    }
    -    p, ul, ol {
    -	margin-top: 0.5em;
    -	margin-bottom: 1em;
    -    }
    -    ul, ol {
    -	list-style-position: outside
    -    }
    -    ul>li {
    -	margin-left: 22px;
    -    }
    -    ol>li {
    -	margin-left: 27.2px;
    -    }
    -    li>*:first-child {
    -	margin-top: 0
    -    }
    -
    -    /* Text alignements, this should be forbidden. */
    -
    -    .left {
    -	text-align: left;
    -    }
    -    .right {
    -	text-align: right;
    -    }
    -    .center {
    -	text-align: center;
    -    }
    -    /* Links and anchors */
    -    a {
    -	text-decoration: none;
    -	color: #92370A;
    -	/* box-shadow: 0 1px 0 0 #d8b68b; */
    -    }
    -    a:hover {
    -	box-shadow: 0 1px 0 0 #92370A;
    -    }
    -    td a:hover {
    -	background: white;
    -    }
    -    /* Linked highlight */
    -    *:target {
    -	/*box-shadow: 0 0px 0 1px rgba(255, 215, 181, 0.8) !important;*/
    -	border-radius: 1px;
    -	/*border-bottom: 4px solid rgb(255, 215, 181);*/
    -	box-shadow: 0 4px 0 0px rgb(255, 215, 181);
    -	z-index: 0;
    -	@if $ocamlorg {
    -	    /* Because of fixed banner in the ocaml.org site, we have to offset the targets. See https://stackoverflow.com/questions/10732690/offsetting-an-html-anchor-to-adjust-for-fixed-header */
    -	    padding-top: 85px;
    -	    margin-top: -85px;
    -	}
    -    }
    -
    -    
    -    h2:target {
    -	/* background: linear-gradient(to bottom, rgb(253, 252, 252) 0%, rgba(255, 215, 181, 0.3) 100%) !important; */
    -	/*	transition: 300ms; this prevents margin-top:-80 to work... */
    -    }
    -
    -    *:hover>a.section-anchor {
    -	visibility: visible;
    -    }
    -
    -    a.section-anchor:before {
    -	content: "#"
    -    }
    -
    -    a.section-anchor:hover {
    -	box-shadow: none;
    -	text-decoration: none;
    -	color: #555;
    -    }
    -
    -    a.section-anchor {
    -	visibility: hidden;
    -	position: absolute;
    -	/* top: 0px; */
    -	/* margin-left: -3ex; */
    -	margin-left: -1.3em;
    -	font-weight: normal;
    -	font-style: normal;
    -	padding-right: 0.4em;
    -	padding-left: 0.4em;
    -	/* To remain selectable */
    -	color: #d5d5d5;
    -    }
    -
    -    .spec > a.section-anchor {
    -	margin-left: -2.3em;
    -	padding-right: 0.9em;
    -    }
    -
    -    .xref-unresolved {
    -	color: #92370A
    -    }
    -    .xref-unresolved:hover {
    -	box-shadow: 0 1px 0 0 #CC6666;
    -    }
    -
    -    /* Section and document divisions.
    -    Until at least 4.03 many of the modules of the stdlib start at .h7,
    -    we restart the sequence there like h2  */
    -
    -       h1, h2, h3, h4, h5, h6, .h7, .h8, .h9, .h10 {
    -	font-family: $font-sans;
    -	font-weight: 400;
    -	margin: 0.5em 0 0.5em 0;
    -	padding-top: 0.1em;
    -	line-height: 1.2;
    -	overflow-wrap: break-word;
    -    }
    -
    -    h1 {
    -	margin-top: 1.214em;
    -	margin-bottom: 19px;
    -	font-weight: 500;
    -	font-size: 1.953em;
    -	box-shadow: 0 1px 0 0 #ddd;
    -    }
    -
    -    h2 {
    -	font-size: 1.563em;
    -	margin: 1em 0 1em 0
    -    }
    -
    -    h3 {
    -	font-size: 1.25em;
    -    }
    -
    -    small, .font_small {
    -	font-size: 0.8em;
    -    }
    -
    -    h1 code, h1 tt {
    -	font-size: inherit;
    -	font-weight: inherit;
    -    }
    -
    -    h2 code, h2 tt {
    -	font-size: inherit;
    -	font-weight: inherit;
    -    }
    -
    -    h3 code, h3 tt {
    -	font-size: inherit;
    -	font-weight: inherit;
    -    }
    -
    -    h3 code, h3 tt {
    -	font-size: inherit;
    -	font-weight: inherit;
    -    }
    -
    -    h4 {
    -	font-size: 1.12em;
    -    }
    -
    -
    -    /* Preformatted and code */
    -
    -    tt, code, pre {
    -	font-family: $font-mono;
    -	font-weight: 400;
    -    }
    -
    -    pre {
    -	border-left: 4px solid #e69c7f;
    -	white-space: pre-wrap;
    -	word-wrap: break-word;
    -	padding-left: 1ex;
    -    }
    -
    -    p code, li code { /* useful ? */
    -	background-color: #ebf2f9;  /*#f6f8fa;*/
    -	color: #0d2b3e;
    -	border-radius: 3px;
    -	padding: 0 0.3ex;
    -	white-space: pre-wrap; // utile seulement dans la table index_values? (attention à bootstrap.css)
    -    }
    -
    -    pre code {
    -	background-color: inherit;
    -    }
    -
    -    p a > code {
    -	color: #92370A;
    -    }
    -
    -    /* Code blocks (e.g. Examples) */
    -
    -    pre code.ocaml {
    -	font-size: 0.893rem;
    -    }
    -
    -    /* Code lexemes */
    -
    -    .keyword {
    -	font-weight: 500;
    -	color: inherit;
    -    }
    -
    -    /* Module member specification */
    -
    -    .spec:not(.include), .spec.include details summary {
    -	background: linear-gradient(to left, rgb(253, 252, 252) 0%, rgb(234, 246, 250) 100%);
    -	border-radius: 3px;
    -	border-left: 4px solid #5c9cf5;
    -	border-right: 5px solid transparent;
    -	padding: 0.35em 0.5em;
    -    }
    -
    -    .spec.include details summary:hover {
    -	background-color: #ebeff2;
    -    }
    -
    -    dl, div.spec, .doc, aside {
    -	margin-bottom: 20px;
    -    }
    -
    -    dl > dd {
    -	padding: 0.5em;
    -    }
    -
    -    dd> :first-child {
    -	margin-top: 0;
    -    }
    -
    -    dd > p:first-child > code:first-child {
    -	color: teal;
    -    }
    -
    -    dl:last-child, dd> :last-child, aside:last-child, article:last-child {
    -	margin-bottom: 0;
    -    }
    -
    -    dt+dt {
    -	margin-top: 15px;
    -    }
    -
    -    section+section, section > header + dl {
    -	margin-top: 25px;
    -    }
    -
    -    .spec.type .variant {
    -	margin-left: 2ch;
    -    }
    -    .spec.type .variant p {
    -	margin: 0;
    -	font-style: italic;
    -    }
    -    .spec.type .record {
    -	margin-left: 2ch;
    -    }
    -    .spec.type .record p {
    -	margin: 0;
    -	font-style: italic;
    -    }
    -
    -    div.def {
    -	margin-top: 0;
    -	text-indent: -2ex;
    -	padding-left: 2ex;
    -    }
    -
    -    div.def+div.doc {
    -	margin-left: 1ex;
    -	margin-top: 2.5px
    -    }
    -
    -    div.doc>*:first-child {
    -	margin-top: 0;
    -    }
    -
    -    /* The elements other than heading should be wrapped in