aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorArnold D. Robbins <arnold@skeeve.com>2020-07-08 19:24:12 +0300
committerArnold D. Robbins <arnold@skeeve.com>2020-07-08 19:24:12 +0300
commitc372dc85effd4fa1a5f955ae88a9f0d003c92b5a (patch)
tree49a5f62bcea87fd80f7284c905370a0c2f37c8b3
parentb1400a29ad5776b2e0c867a171b466a05605461e (diff)
parent2a3d876938d39d03cf563d1bd8382c316839c08d (diff)
downloadegawk-c372dc85effd4fa1a5f955ae88a9f0d003c92b5a.tar.gz
egawk-c372dc85effd4fa1a5f955ae88a9f0d003c92b5a.tar.bz2
egawk-c372dc85effd4fa1a5f955ae88a9f0d003c92b5a.zip
Merge branch 'gawk-5.1-stable'
-rw-r--r--ChangeLog13
-rw-r--r--awk.h1
-rw-r--r--mpfr.c20
-rw-r--r--node.c5
-rw-r--r--pc/Makefile.tst31
-rw-r--r--str_array.c4
-rw-r--r--test/ChangeLog7
-rw-r--r--test/Makefile.am11
-rw-r--r--test/Makefile.in28
-rw-r--r--test/Maketests18
-rw-r--r--test/arraytype-mpfr.ok16
-rw-r--r--test/arrdbg-mpfr.ok12
-rw-r--r--test/forcenum-mpfr.ok9
-rw-r--r--test/numrange-mpfr.ok2
14 files changed, 148 insertions, 29 deletions
diff --git a/ChangeLog b/ChangeLog
index e4f980c5..45c2de22 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,16 @@
+2020-07-08 Arnold D. Robbins <arnold@skeeve.com>
+
+ * str_array.c (str_lookup): If a pure number, copy to a string. Fixes
+ at printfchar test for MPFR.
+
+ Fix typeregex2 and typedregex3 tests for MPFR:
+
+ * mpfr.c (mpg_zero): No longer static inline.
+ (force_mpnum): Handle the case of a strongly typed regex.
+ (mpg_interpret): Add tracing for do_itrace.
+ * awk.h (mpg_zero): Add declaration.
+ * node.c (make_typed_regex): Init to zero for MPFR via mpg_zero.
+
2020-07-07 Arnold D. Robbins <arnold@skeeve.com>
* awk.h: Turn all the flag defines into enums. GDB can then show
diff --git a/awk.h b/awk.h
index 0dc3d3e9..4ff1141b 100644
--- a/awk.h
+++ b/awk.h
@@ -1673,6 +1673,7 @@ extern void cleanup_mpfr(void);
extern NODE *mpg_node(unsigned int);
extern const char *mpg_fmt(const char *, ...);
extern int mpg_strtoui(mpz_ptr, char *, size_t, char **, int);
+extern void mpg_zero(NODE *n);
#endif
/* msg.c */
extern void gawk_exit(int status);
diff --git a/mpfr.c b/mpfr.c
index 3b4258cc..3ffcba17 100644
--- a/mpfr.c
+++ b/mpfr.c
@@ -247,7 +247,7 @@ mpg_maybe_float(const char *str, int use_locale)
/* mpg_zero --- initialize with arbitrary-precision integer(GMP) and set value to zero */
-static inline void
+void
mpg_zero(NODE *n)
{
if (is_mpg_float(n)) {
@@ -271,7 +271,7 @@ force_mpnum(NODE *n, int do_nondec, int use_locale)
char save;
int tval, base = 10;
- if (n->stlen == 0) {
+ if (n->stlen == 0 || (n->flags & REGEX) != 0) {
mpg_zero(n);
return false;
}
@@ -1525,7 +1525,13 @@ mpg_interpret(INSTRUCTION **cp)
NODE **lhs;
int tval; /* the ternary value returned by a MPFR function */
- switch ((op = pc->opcode)) {
+ op = pc->opcode;
+ if (do_itrace) {
+ fprintf(stderr, "+ mpg_interpret: %s: ", opcode2str(op));
+ fflush(stderr);
+ }
+
+ switch (op) {
case Op_plus_i:
t2 = force_number(pc->memory);
goto plus;
@@ -1750,10 +1756,18 @@ mod:
break;
default:
+ if (do_itrace) {
+ fprintf(stderr, "unhandled\n", opcode2str(op));
+ fflush(stderr);
+ }
return true; /* unhandled */
}
*cp = pc->nexti; /* next instruction to execute */
+ if (do_itrace) {
+ fprintf(stderr, "handled\n", opcode2str(op));
+ fflush(stderr);
+ }
return false;
}
diff --git a/node.c b/node.c
index 2db6a1ef..ecb9ad0e 100644
--- a/node.c
+++ b/node.c
@@ -479,6 +479,11 @@ make_typed_regex(const char *re, size_t len)
n2 = make_string(re, len);
n2->typed_re = n;
+#if HAVE_MPFR
+ if (do_mpfr)
+ mpg_zero(n2);
+ else
+#endif
n2->numbr = 0;
n2->flags |= NUMCUR|STRCUR|REGEX;
n2->flags &= ~(STRING|NUMBER);
diff --git a/pc/Makefile.tst b/pc/Makefile.tst
index e998e421..6a1d917a 100644
--- a/pc/Makefile.tst
+++ b/pc/Makefile.tst
@@ -258,7 +258,7 @@ NEED_LINT = \
NEED_LINT_OLD = lintold
# List of tests that must be run with -M
-NEED_MPFR = mpfrbigint mpfrbigint2 mpfrcase mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
+NEED_MPFR = mpfrbigint mpfrbigint2 mpfrcase mpfrcase2 mpfrexprange mpfrfield mpfrieee mpfrmemok1 \
mpfrnegzero mpfrnonum mpfrnr mpfrrem mpfrrnd mpfrrndeval mpfrsort mpfrsqrt \
mpfrstrtonum mpgforcenum mpfruplus mpfranswer42
@@ -296,7 +296,7 @@ FAIL_CODE1 = \
# List of files which have .ok versions for MPFR
CHECK_MPFR = \
- rand fnarydel fnparydl
+ arraytype arrdbg fnarydel fnparydl forcenum numrange rand
# Lists of tests that need particular locales
@@ -1177,7 +1177,9 @@ ignrcas3::
arrdbg:
@echo $@
@$(AWK) -v "okfile=./$@.ok" -f "$(srcdir)"/$@.awk | grep array_f >_$@ || echo EXIT CODE: $$? >> _$@
- @-$(CMP) ./$@.ok _$@ && rm -f _$@ ./$@.ok
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
sourcesplit:
@echo $@
@@ -1910,8 +1912,10 @@ numindex:
numrange:
@echo $@ $(ZOS_FAIL)
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
numstr1:
@echo $@
@@ -2550,8 +2554,10 @@ arraysort2:
arraytype:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
backw:
@echo $@
@@ -2643,8 +2649,10 @@ fieldwdth:
forcenum:
@echo $@ $(ZOS_FAIL)
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
fpat1:
@echo $@
@@ -3502,6 +3510,11 @@ mpfrcase:
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
@-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+mpfrcase2:
+ @echo $@
+ @AWKPATH="$(srcdir)" $(AWK) -f $@.awk -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+
mpfrfield:
@echo $@
@AWKPATH="$(srcdir)" $(AWK) -f $@.awk -M < "$(srcdir)"/$@.in >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
diff --git a/str_array.c b/str_array.c
index c90f7861..84bd2f02 100644
--- a/str_array.c
+++ b/str_array.c
@@ -168,9 +168,11 @@ str_lookup(NODE *symbol, NODE *subs)
// Special cases:
// 1. The string was generated using CONVFMT.
// 2. The string was from an unassigned variable.
- // 3. The string was from an unassigned field.
+ // 3. The string was from a straight number, perniciously, from MPFR
+ // 4. The string was from an unassigned field.
if ( subs->stfmt != STFMT_UNUSED
|| subs == Nnull_string
+ || (subs->flags & STRING) == 0
|| (subs->flags & NULL_FIELD) != 0) {
NODE *tmp;
diff --git a/test/ChangeLog b/test/ChangeLog
index b741651e..6e786e8e 100644
--- a/test/ChangeLog
+++ b/test/ChangeLog
@@ -1,3 +1,10 @@
+2020-07-08 Arnold D. Robbins <arnold@skeeve.com>
+
+ * Makefile.am (EXTRADIST): Add additional ok files for MPFR.
+ (CHECK_MPFR): Add arraytype, arrdbg, forcenum and numrange
+ (arrdbg): Update to check -mpfr.ok file also.
+ * arraytype-mpfr.ok, arrdbg-mpfr.ok, forcenum-mpfr.ok, numrange-mpfr.ok: New files.
+
2020-07-07 Arnold D. Robbins <arnold@skeeve.com>
* Makefile.am (EXTRA_DIST): New test, mpfrcase2.
diff --git a/test/Makefile.am b/test/Makefile.am
index 76634925..6d953533 100644
--- a/test/Makefile.am
+++ b/test/Makefile.am
@@ -79,7 +79,9 @@ EXTRA_DIST = \
arraysort2.ok \
arraytype.awk \
arraytype.ok \
+ arraytype-mpfr.ok \
arrdbg.awk \
+ arrdbg-mpfr.ok \
arrymem1.awk \
arrymem1.ok \
arryref2.awk \
@@ -340,6 +342,7 @@ EXTRA_DIST = \
fnparydl.ok \
forcenum.awk \
forcenum.ok \
+ forcenum-mpfr.ok \
fordel.awk \
fordel.ok \
fork.awk \
@@ -843,6 +846,7 @@ EXTRA_DIST = \
numindex.ok \
numrange.awk \
numrange.ok \
+ numrange-mpfr.ok \
numstr1.awk \
numstr1.ok \
numsubstr.awk \
@@ -1505,7 +1509,7 @@ FAIL_CODE1 = \
# List of files which have .ok versions for MPFR
CHECK_MPFR = \
- rand fnarydel fnparydl
+ arraytype arrdbg fnarydel fnparydl forcenum numrange rand
# Lists of tests that need particular locales
NEED_LOCALE_C = \
@@ -2384,7 +2388,10 @@ ignrcas3::
arrdbg:
@echo $@
@$(AWK) -v "okfile=./$@.ok" -f "$(srcdir)"/$@.awk | grep array_f >_$@ || echo EXIT CODE: $$? >> _$@
- @-$(CMP) ./$@.ok _$@ && rm -f _$@ ./$@.ok
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
+
sourcesplit:
@echo $@
diff --git a/test/Makefile.in b/test/Makefile.in
index 4af1a7ba..5a6215db 100644
--- a/test/Makefile.in
+++ b/test/Makefile.in
@@ -342,7 +342,9 @@ EXTRA_DIST = \
arraysort2.ok \
arraytype.awk \
arraytype.ok \
+ arraytype-mpfr.ok \
arrdbg.awk \
+ arrdbg-mpfr.ok \
arrymem1.awk \
arrymem1.ok \
arryref2.awk \
@@ -603,6 +605,7 @@ EXTRA_DIST = \
fnparydl.ok \
forcenum.awk \
forcenum.ok \
+ forcenum-mpfr.ok \
fordel.awk \
fordel.ok \
fork.awk \
@@ -1106,6 +1109,7 @@ EXTRA_DIST = \
numindex.ok \
numrange.awk \
numrange.ok \
+ numrange-mpfr.ok \
numstr1.awk \
numstr1.ok \
numsubstr.awk \
@@ -1769,7 +1773,7 @@ FAIL_CODE1 = \
# List of files which have .ok versions for MPFR
CHECK_MPFR = \
- rand fnarydel fnparydl
+ arraytype arrdbg fnarydel fnparydl forcenum numrange rand
# Lists of tests that need particular locales
@@ -2835,7 +2839,9 @@ ignrcas3::
arrdbg:
@echo $@
@$(AWK) -v "okfile=./$@.ok" -f "$(srcdir)"/$@.awk | grep array_f >_$@ || echo EXIT CODE: $$? >> _$@
- @-$(CMP) ./$@.ok _$@ && rm -f _$@ ./$@.ok
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
sourcesplit:
@echo $@
@@ -3566,8 +3572,10 @@ numindex:
numrange:
@echo $@ $(ZOS_FAIL)
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
numstr1:
@echo $@
@@ -4199,8 +4207,10 @@ arraysort2:
arraytype:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
backw:
@echo $@
@@ -4285,8 +4295,10 @@ fieldwdth:
forcenum:
@echo $@ $(ZOS_FAIL)
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
fpat1:
@echo $@
diff --git a/test/Maketests b/test/Maketests
index 0b98f784..2ef37caf 100644
--- a/test/Maketests
+++ b/test/Maketests
@@ -680,8 +680,10 @@ numindex:
numrange:
@echo $@ $(ZOS_FAIL)
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
numstr1:
@echo $@
@@ -1313,8 +1315,10 @@ arraysort2:
arraytype:
@echo $@
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
backw:
@echo $@
@@ -1399,8 +1403,10 @@ fieldwdth:
forcenum:
@echo $@ $(ZOS_FAIL)
- @AWKPATH="$(srcdir)" $(AWK) -f $@.awk --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
- @-$(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@
+ @AWKPATH="$(srcdir)" $(AWK) $(AWKFLAGS) -f $@.awk --non-decimal-data >_$@ 2>&1 || echo EXIT CODE: $$? >>_$@
+ @-if test -z "$$AWKFLAGS" ; then $(CMP) "$(srcdir)"/$@.ok _$@ && rm -f _$@ ; else \
+ $(CMP) "$(srcdir)"/$@-mpfr.ok _$@ && rm -f _$@ ; \
+ fi
fpat1:
@echo $@
diff --git a/test/arraytype-mpfr.ok b/test/arraytype-mpfr.ok
new file mode 100644
index 00000000..36e8f99b
--- /dev/null
+++ b/test/arraytype-mpfr.ok
@@ -0,0 +1,16 @@
+array
+str
+array
+null
+array
+str
+array
+null
+array
+str
+array
+null
+array
+str
+array
+null
diff --git a/test/arrdbg-mpfr.ok b/test/arrdbg-mpfr.ok
new file mode 100644
index 00000000..010801cb
--- /dev/null
+++ b/test/arrdbg-mpfr.ok
@@ -0,0 +1,12 @@
+array_f subscript [3]
+ array_func: str_array_func
+array_f subscript [-3]
+ array_func: str_array_func
+array_f subscript [3.0]
+ array_func: str_array_func
+array_f subscript [ 3]
+ array_func: str_array_func
+array_f subscript [0]
+ array_func: str_array_func
+array_f subscript [-1]
+ array_func: str_array_func
diff --git a/test/forcenum-mpfr.ok b/test/forcenum-mpfr.ok
new file mode 100644
index 00000000..6e5853fa
--- /dev/null
+++ b/test/forcenum-mpfr.ok
@@ -0,0 +1,9 @@
+[] -> 0 (type string)
+[5apple] -> 5 (type string)
+[NaN] -> nan (type strnum)
+[-NaN] -> nan (type strnum)
+[+NaN] -> nan (type strnum)
+[ 6] -> 6 (type strnum)
+[0x1az] -> 26 (type string)
+[011Q] -> 9 (type string)
+[027] -> 23 (type strnum)
diff --git a/test/numrange-mpfr.ok b/test/numrange-mpfr.ok
new file mode 100644
index 00000000..2f084e39
--- /dev/null
+++ b/test/numrange-mpfr.ok
@@ -0,0 +1,2 @@
+-1.2e+931 -12000000000000000023869272521829212151376224284038826410491631072247223930898697894494751122199611031696331881198430123310788883489723019223000573640259371063714952207062438085168771640470751425809639568206897248922718204650691199569214339149443994838825335479571578957075566316988609963847861723327109992246837205567235607773890309471137488800374383009068687547118036715452301954858700836601124580336340038617883134449214092245802588446405229331386515660677585038235109701545271243902330575714021315127223571588764628179725351186585908351382110051143587405409927546018060172307656019659275511658624125158517807640363832094340920801581446507863850186984663749124902382044782795512644763497122330988233279646807817789403972164002561612114866682762706548477524115596786591512372612296461584970713050884678735893942581035124339179550774662878726741328519231942448856426396556949721845110345583968012206662741485777689522285472492027904 12000000000000000023869272521829212151376224284038826410491631072247223930898697894494751122199611031696331881198430123310788883489723019223000573640259371063714952207062438085168771640470751425809639568206897248922718204650691199569214339149443994838825335479571578957075566316988609963847861723327109992246837205567235607773890309471137488800374383009068687547118036715452301954858700836601124580336340038617883134449214092245802588446405229331386515660677585038235109701545271243902330575714021315127223571588764628179725351186585908351382110051143587405409927546018060172307656019659275511658624125158517807640363832094340920801581446507863850186984663749124902382044782795512644763497122330988233279646807817789403972164002561612114866682762706548477524115596786591512372612296461584970713050884678735893942581035124339179550774662878726741328519231942448856426396556949721845110345583968012206662741485777689522285472492027904
+1.2e+931 12000000000000000023869272521829212151376224284038826410491631072247223930898697894494751122199611031696331881198430123310788883489723019223000573640259371063714952207062438085168771640470751425809639568206897248922718204650691199569214339149443994838825335479571578957075566316988609963847861723327109992246837205567235607773890309471137488800374383009068687547118036715452301954858700836601124580336340038617883134449214092245802588446405229331386515660677585038235109701545271243902330575714021315127223571588764628179725351186585908351382110051143587405409927546018060172307656019659275511658624125158517807640363832094340920801581446507863850186984663749124902382044782795512644763497122330988233279646807817789403972164002561612114866682762706548477524115596786591512372612296461584970713050884678735893942581035124339179550774662878726741328519231942448856426396556949721845110345583968012206662741485777689522285472492027904 -12000000000000000023869272521829212151376224284038826410491631072247223930898697894494751122199611031696331881198430123310788883489723019223000573640259371063714952207062438085168771640470751425809639568206897248922718204650691199569214339149443994838825335479571578957075566316988609963847861723327109992246837205567235607773890309471137488800374383009068687547118036715452301954858700836601124580336340038617883134449214092245802588446405229331386515660677585038235109701545271243902330575714021315127223571588764628179725351186585908351382110051143587405409927546018060172307656019659275511658624125158517807640363832094340920801581446507863850186984663749124902382044782795512644763497122330988233279646807817789403972164002561612114866682762706548477524115596786591512372612296461584970713050884678735893942581035124339179550774662878726741328519231942448856426396556949721845110345583968012206662741485777689522285472492027904