]> git.ipfire.org Git - thirdparty/gettext.git/commitdiff
tests: Check against stack overflow during plural expression evaluation.
authorBruno Haible <bruno@clisp.org>
Sun, 1 Oct 2023 18:18:06 +0000 (20:18 +0200)
committerBruno Haible <bruno@clisp.org>
Fri, 6 Oct 2023 14:25:03 +0000 (16:25 +0200)
* gettext-tools/tests/plural-1: Add comment.
* gettext-tools/tests/plural-2: Add comment.
* gettext-tools/tests/plural-3: New file.
* gettext-tools/tests/Makefile.am (TESTS): Add it.

gettext-tools/tests/Makefile.am
gettext-tools/tests/plural-1
gettext-tools/tests/plural-2
gettext-tools/tests/plural-3 [new file with mode: 0644]

index 86de8b4587c414741f35c6411df6eae999df7efe..3283811016ec11c418b4f5e8dbc21c6c46d11e67 100644 (file)
@@ -200,7 +200,7 @@ TESTS = gettext-1 gettext-2 \
        format-sh-1 format-sh-2 \
        format-tcl-1 format-tcl-2 \
        format-ycp-1 format-ycp-2 \
-       plural-1 plural-2 \
+       plural-1 plural-2 plural-3 \
        gettextpo-1 sentence-1 \
        lang-po \
        lang-c lang-c++ lang-c++20 lang-objc \
index 84ad7d2bda01c9c362ce508491dd14b0c8aca94f..2f6602c5741a4ad6b8c0f2e1dbafbd0216654c09 100755 (executable)
@@ -1,6 +1,8 @@
 #! /bin/sh
 . "${srcdir=.}/init.sh"; path_prepend_ . ../src
 
+# Test that ngettext() does plural form handling, with a default plural rule.
+
 : ${XGETTEXT=xgettext}
 ${XGETTEXT} -o plural-1-cake.tmp --omit-header --no-location "$wabs_srcdir"/plural-1-prg.c || Exit 1
 LC_ALL=C tr -d '\r' < plural-1-cake.tmp > plural-1-cake.pot || Exit 1
index 983f2077288c94483d54ae41ba1b3e170d92b1ae..e9ea320ab22c3ba453cc6aa96f1eec92e80c80fa 100755 (executable)
@@ -1,6 +1,8 @@
 #! /bin/sh
 . "${srcdir=.}/init.sh"; path_prepend_ . ../src
 
+# Test that ngettext() selects the correct plural form, for 0 <= n < 200.
+
 : ${MSGFMT=msgfmt}
 test -d plural-2-dir || mkdir plural-2-dir
 test -d plural-2-dir/ll || mkdir plural-2-dir/ll
diff --git a/gettext-tools/tests/plural-3 b/gettext-tools/tests/plural-3
new file mode 100644 (file)
index 0000000..4a4fd3f
--- /dev/null
@@ -0,0 +1,85 @@
+#! /bin/sh
+. "${srcdir=.}/init.sh"; path_prepend_ . ../src
+
+# Test that ngettext() does not crash when the plural form rule leads to
+# a stack overflow.
+
+# In fact, the stack overflow is caught by the bison parser (plural.c,
+# macro YYMAXDEPTH = 10000). Since the same bison parser is used by
+# glibc, libintl, and 'msgfmt -c', we can observe the behaviour by using
+# the msgfmt option '-c'.
+
+test -d plural-3-dir || mkdir plural-3-dir
+test -d plural-3-dir/ll || mkdir plural-3-dir/ll
+test -d plural-3-dir/ll/LC_MESSAGES || mkdir plural-3-dir/ll/LC_MESSAGES
+
+# This one does not exceed YYMAXDEPTH, i.e. the parser succeeds, and we can
+# test the stack consumption of plural_eval().
+
+cat > plural-3-ll.po <<EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: dummy 0.0\n"
+"PO-Revision-Date: 2023-09-22 12:51:48 CEST\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: lalala\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(n!=1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));\n"
+
+msgid "X"
+msgid_plural "Y"
+msgstr[0] "x"
+msgstr[1] "y"
+EOF
+
+: ${MSGFMT=msgfmt}
+${MSGFMT} -c -o plural-3-dir/ll/LC_MESSAGES/plural.mo plural-3-ll.po || Exit 1
+
+LANGUAGE= TEXTDOMAIN=plural TEXTDOMAINDIR=plural-3-dir \
+$NGETTEXT --env LC_ALL=ll X Y 42 > dataout
+test $? = 0 || Exit 1
+test y = "`cat dataout`" || Exit 1
+
+LANGUAGE= TEXTDOMAIN=plural TEXTDOMAINDIR=plural-3-dir \
+$NGETTEXT --env LC_ALL=ll --thread X Y 42 > thread-dataout
+test $? = 0 || Exit 1
+test y = "`cat thread-dataout`" || Exit 1
+
+# This one is large enough that YYMAXDEPTH is exceeded, i.e. the parser fails.
+
+cat > plural-3-ll.po <<EOF
+msgid ""
+msgstr ""
+"Project-Id-Version: dummy 0.0\n"
+"PO-Revision-Date: 2023-09-22 12:51:48 CEST\n"
+"Last-Translator: \n"
+"Language-Team: \n"
+"Language: lalala\n"
+"MIME-Version: 1.0\n"
+"Content-Type: text/plain; charset=ASCII\n"
+"Content-Transfer-Encoding: 8bit\n"
+"Plural-Forms: nplurals=2; plural=(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(!(1-(n!=1)))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))))));\n"
+
+msgid "X"
+msgid_plural "Y"
+msgstr[0] "x"
+msgstr[1] "y"
+EOF
+
+: ${MSGFMT=msgfmt}
+${MSGFMT} -o plural-3-dir/ll/LC_MESSAGES/plural.mo plural-3-ll.po || Exit 1
+
+LANGUAGE= TEXTDOMAIN=plural TEXTDOMAINDIR=plural-3-dir \
+$NGETTEXT --env LC_ALL=ll X Y 42 > parserfail-dataout
+test $? = 0 || Exit 1
+test y = "`cat parserfail-dataout`" || Exit 1
+
+LANGUAGE= TEXTDOMAIN=plural TEXTDOMAINDIR=plural-3-dir \
+$NGETTEXT --env LC_ALL=ll --thread X Y 42 > thread-parserfail-dataout
+test $? = 0 || Exit 1
+test y = "`cat thread-parserfail-dataout`" || Exit 1
+
+Exit 0