-----BEGIN PGP SIGNED MESSAGE-----
Hash: SHA1
Hi,
I composed unit test cases for JBIG2:
1) test stream from ISO/IEC 14492 draft annex H with Huffman & MMR
coding: this fails because of missing halftone support from jbig2dec
2) test stream from ISO/IEC 14492 draft annex H with arithmetic coding
(equal to torture/testdata/TD0000{1,2,3}): fails too (same reason)
Because the above test cases with halftones will fail as long as
jbig2dec (library we use) is unable to handle halftones, further tests
are separated as different test cases. So the additional test cases
are sensitive while first two are failing:
3) same as 2) but without halftone segment: checks ok
4) invalid streams (exchanged global and page segments): at the moment
they fail because of a NULL-pointer dereference from jbig2dec. I
reported a bug (http://bugs.ghostscript.com/show_bug.cgi?id=692743)
and hope my patch is merged soon.
A patch for the JBIG2 unit test cases is attached. Please comment or
merge it.
Regards,
Georg
-----BEGIN PGP SIGNATURE-----
Version: GnuPG v2.0.17 (GNU/Linux)
Comment: Using GnuPG with Mozilla - http://enigmail.mozdev.org/
iEYEARECAAYFAk7o6OEACgkQ5sLITM1qIaKGtACcCmQAfGuCJdPoz/xAgLvcmRCK
h0QAn2obmyLEk2eD71LbCmnKCBv+J/R7
=SaPN
-----END PGP SIGNATURE-----
# Bazaar merge directive format 2 (Bazaar 0.90)
# revision_id: [email protected]\
# 1vk44n5efr9b39rq
# target_branch: bzr://bzr.sv.gnu.org/pdf/libgnupdf/trunk/
# testament_sha1: f0f86d87054a9ca1ff4b0c5482bb95aa9734123c
# timestamp: 2011-12-14 18:56:50 +0100
# base_revision_id: [email protected]
#
# Begin patch
=== modified file 'AUTHORS'
--- AUTHORS 2011-08-04 13:49:13 +0000
+++ AUTHORS 2011-12-14 17:56:25 +0000
@@ -34,6 +34,7 @@
Franck Lesage: changed pdf-hash-helper.c pdf-hash-helper.h gnupdf.texi
Georg Gottleuber: changed pdf-filter.c pdf-stm-f-pred.c pdf-stm-f-pred.h
+ torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c
Gerardo E. Gidoni: changed gnupdf.texi pdf-stm-read.c gnupdf-tsd.texi
pdf-stm-write.c configure.ac pdf-filter.c pdf-stm-f-flate.h
=== modified file 'ChangeLog'
--- ChangeLog 2011-10-11 21:17:52 +0000
+++ ChangeLog 2011-12-14 17:56:25 +0000
@@ -1,3 +1,10 @@
+2011-12-14 Georg Gottleuber <[email protected]>
+
+ torture: JBIG2 unit tests added
+ * torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c: new file
+ * torture/unit/base/stm/tsuite-stm.c: added JBIG2 unit tests
+ * torture/unit/Makefile.am: added JBIG2 unit tests
+
2011-10-11 Jose E. Marchesi <[email protected]>
prmgt: converters to html reverted to a previous revision.
=== modified file 'torture/unit/Makefile.am'
--- torture/unit/Makefile.am 2011-08-29 15:17:29 +0000
+++ torture/unit/Makefile.am 2011-12-14 17:56:25 +0000
@@ -76,7 +76,8 @@
base/stm/pdf-stm-rw-filter-a85.c \
base/stm/pdf-stm-rw-filter-flate.c \
base/stm/pdf-stm-rw-filter-v2.c \
- base/stm/pdf-stm-rw-filter-aesv2.c
+ base/stm/pdf-stm-rw-filter-aesv2.c \
+ base/stm/pdf-stm-rw-filter-jbig2.c
TEST_SUITE_HASH = base/hash/pdf-hash-new.c \
base/hash/pdf-hash-add.c \
=== added file 'torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c'
--- torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c 1970-01-01 00:00:00 +0000
+++ torture/unit/base/stm/pdf-stm-rw-filter-jbig2.c 2011-12-14 17:56:25 +0000
@@ -0,0 +1,473 @@
+/* -*- mode: C -*-
+ *
+ * File: pdf-stm-rw-filter-jbig2.c
+ * Date: Fr Dec 9 09:50:09 2011
+ *
+ * GNU PDF Library - Unit tests for JBIG2 decoder filter.
+ *
+ */
+
+/* Copyright (C) 2011 Free Software Foundation, Inc. */
+
+/* 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 Free Software Foundation, either version 3 of the License, or
+ * (at your option) any later version.
+ *
+ * This program is distributed in the hope that it will be useful,
+ * but WITHOUT ANY WARRANTY; without even the implied warranty of
+ * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+ * GNU General Public License for more details.
+ *
+ * You should have received a copy of the GNU General Public License
+ * along with this program. If not, see <http://www.gnu.org/licenses/>.
+ */
+
+#include <config.h>
+
+#include <string.h>
+#include <check.h>
+#include <pdf.h>
+#include <pdf-test-common.h>
+#include <tortutils.h>
+#include "pdf-stm-test-common.h"
+
+#define JBIG2_PARAM_GLOBAL_STREAMS_BUFFER "GlobalStreamsBuffer"
+#define JBIG2_PARAM_GLOBAL_STREAMS_SIZE "GlobalStreamsSize"
+
+struct test_strings_s {
+ pdf_size_t pageseg_size;
+ const pdf_char_t *pageseg;
+
+ pdf_size_t globalseg_size;
+ const pdf_char_t *globalseg;
+
+ pdf_size_t bitmap_size;
+ const pdf_char_t *bitmap;
+};
+
+static const struct test_strings_s test_strings_with_halftones[] = {
+ {
+ /* from ISO/IEC 14492 draft annex H */
+ 341,
+ /* segments 2 to 7 from ISO/IEC 14492 (Huffman & MMR coding) */
+ "\x00\x00\x00\x01\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x02\x00\x01\x01\x00\x00\x00\x1c\x00\x01\x00\x00\x00\x02\x00"
+ "\x00\x00\x02\xe5\xcd\xf8\x00\x79\xe0\x84\x10\x81\xf0\x82\x10\x86"
+ "\x10\x79\xf0\x00\x80\x00\x00\x00\x03\x07\x42\x00\x02\x01\x00\x00"
+ "\x00\x31\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00"
+ "\x00\x01\x00\x0c\x09\x00\x10\x00\x00\x00\x05\x01\x10\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x0c\x40\x07\x08"
+ "\x70\x41\xd0\x00\x00\x00\x04\x27\x00\x01\x00\x00\x00\x2c\x00\x00"
+ "\x00\x36\x00\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x01"
+ "\x26\xa0\x71\xce\xa7\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff\xff"
+ "\xff\xff\xff\xff\xff\xff\xff\xff\xf8\xf0\x00\x00\x00\x05\x10\x01"
+ "\x01\x00\x00\x00\x2d\x01\x04\x04\x00\x00\x00\x0f\x20\xd1\x84\x61"
+ "\x18\x45\xf2\xf9\x7c\x8f\x11\xc3\x9e\x45\xf2\xf9\x7d\x42\x85\x0a"
+ "\xaa\x84\x62\x2f\xee\xec\x44\x62\x22\x35\x2a\x0a\x83\xb9\xdc\xee"
+ "\x77\x80\x00\x00\x00\x06\x17\x20\x05\x01\x00\x00\x00\x57\x00\x00"
+ "\x00\x20\x00\x00\x00\x24\x00\x00\x00\x10\x00\x00\x00\x0f\x00\x01"
+ "\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x04\x00\x00\x00\xaa\xaa\xaa\xaa\x80\x08\x00\x80\x36\xd5\x55\x6b"
+ "\x5a\xd4\x00\x40\x04\x2e\xe9\x52\xd2\xd2\xd2\x8a\xa5\x4a\x00\x20"
+ "\x02\x23\xe0\x95\x24\xb4\x92\x8a\x4a\x92\x54\x92\xd2\x4a\x29\x2a"
+ "\x49\x40\x04\x00\x40",
+ 68,
+ /* segments 1 an 17 from ISO/IEC 14492 */
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 448,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00"
+ "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00"
+ "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00"
+ "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x02\x22\x00\xc0"
+ "\x0c\x00\x02\x66\x66\xee\x00\xc0\x0c\x00\x00\x02\x66\x66\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x04\x00\xc0\x0c\x00\x00\x00\x22\x22\x00\xc0"
+ "\x0c\x00\x26\x66\x6e\xee\x00\xc0\x0c\x00\x00\x26\x66\x67\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x44\x00\xc0\x0c\x00\x00\x02\x22\x26\x00\xc0"
+ "\x0c\x00\x66\x66\xee\xee\x00\xc0\x0c\x00\x02\x66\x66\x7f\x00\xc0"
+ "\x0c\x00\x00\x00\x04\x44\x00\xc0\x0c\x00\x00\x22\x22\x66\x00\xc0"
+ "\x0c\x00\x66\x6e\xee\xee\x00\xc0\x0c\x00\x26\x66\x67\xff\x00\xc0"
+ "\x0c\x00\x00\x00\x44\x46\x00\xc0\x0c\x00\x02\x22\x26\x66\x00\xc0"
+ "\x0c\x00\x66\xee\xee\xef\x00\xc0\x0c\x00\x66\x66\x7f\xff\x00\xc0"
+ "\x0c\x00\x00\x04\x44\x66\x00\xc0\x0c\x00\x22\x22\x66\x6e\x00\xc0"
+ "\x0c\x00\x6e\xee\xee\xff\x00\xc0\x0c\x00\x66\x67\xff\xff\x00\xc0"
+ "\x0c\x00\x00\x44\x46\x66\x00\xc0\x0c\x00\x22\x26\x66\xef\x00\xc0"
+ "\x0c\x00\xee\xee\xef\xff\x00\xc0\x0c\x00\x66\x7f\xff\xff\x00\xc0"
+ "\x0c\x00\x04\x44\x66\x66\x00\xc0\x0c\x00\x22\x66\x6e\xff\x00\xc0"
+ "\x0c\x00\xee\xee\xff\xff\x00\xc0\x0c\x00\x67\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x46\x66\x67\x00\xc0\x0c\x00\x26\x66\xef\xff\x00\xc0"
+ "\x0c\x00\xee\xef\xff\xff\x00\xc0\x0c\x00\x7f\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x66\x66\x7f\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
+ },
+ {
+ 271,
+ /* segments 8 to 14 from ISO/IEC 14492 (arithmetic coding) */
+ "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00"
+ "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4"
+ "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00"
+ "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00"
+ "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac"
+ "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00"
+ "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd"
+ "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00"
+ "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f"
+ "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc"
+ "\x6e\x40\xbb\xff\xac\x00\x00\x00\x0d\x17\x20\x0c\x01\x00\x00\x00"
+ "\x3e\x00\x00\x00\x20\x00\x00\x00\x24\x00\x00\x00\x10\x00\x00\x00"
+ "\x0f\x00\x02\x00\x00\x00\x08\x00\x00\x00\x09\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x04\x00\x00\x00\x87\xcb\x82\x1e\x66\xa4\x14\xeb\x3c"
+ "\x4a\x15\xfa\xcc\xd6\xf3\xb1\x6f\x4c\xed\xbf\xa7\xbf\xff\xac",
+ 68,
+ /* segments 1 an 17 from ISO/IEC 14492 */
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 448,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00"
+ "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00"
+ "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00"
+ "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x02\x22\x00\xc0"
+ "\x0c\x00\x02\x66\x66\xee\x00\xc0\x0c\x00\x00\x02\x66\x66\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x04\x00\xc0\x0c\x00\x00\x00\x22\x22\x00\xc0"
+ "\x0c\x00\x26\x66\x6e\xee\x00\xc0\x0c\x00\x00\x26\x66\x67\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x44\x00\xc0\x0c\x00\x00\x02\x22\x26\x00\xc0"
+ "\x0c\x00\x66\x66\xee\xee\x00\xc0\x0c\x00\x02\x66\x66\x7f\x00\xc0"
+ "\x0c\x00\x00\x00\x04\x44\x00\xc0\x0c\x00\x00\x22\x22\x66\x00\xc0"
+ "\x0c\x00\x66\x6e\xee\xee\x00\xc0\x0c\x00\x26\x66\x67\xff\x00\xc0"
+ "\x0c\x00\x00\x00\x44\x46\x00\xc0\x0c\x00\x02\x22\x26\x66\x00\xc0"
+ "\x0c\x00\x66\xee\xee\xef\x00\xc0\x0c\x00\x66\x66\x7f\xff\x00\xc0"
+ "\x0c\x00\x00\x04\x44\x66\x00\xc0\x0c\x00\x22\x22\x66\x6e\x00\xc0"
+ "\x0c\x00\x6e\xee\xee\xff\x00\xc0\x0c\x00\x66\x67\xff\xff\x00\xc0"
+ "\x0c\x00\x00\x44\x46\x66\x00\xc0\x0c\x00\x22\x26\x66\xef\x00\xc0"
+ "\x0c\x00\xee\xee\xef\xff\x00\xc0\x0c\x00\x66\x7f\xff\xff\x00\xc0"
+ "\x0c\x00\x04\x44\x66\x66\x00\xc0\x0c\x00\x22\x66\x6e\xff\x00\xc0"
+ "\x0c\x00\xee\xee\xff\xff\x00\xc0\x0c\x00\x67\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x46\x66\x67\x00\xc0\x0c\x00\x26\x66\xef\xff\x00\xc0"
+ "\x0c\x00\xee\xef\xff\xff\x00\xc0\x0c\x00\x7f\xff\xff\xff\x00\xc0"
+ "\x0c\x00\x44\x66\x66\x7f\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
+ },
+ { 0, NULL, 0, NULL, 0, NULL }
+};
+
+static const struct test_strings_s test_strings_without_halftones[] = {
+ /* from ISO/IEC 14492 draft annex H (but without halftone region) */
+ {
+ 197,
+ /* segments 8 to 14 from ISO/IEC 14492 (arithmetic coding)
+ * but without halftone segment */
+ "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00"
+ "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4"
+ "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00"
+ "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00"
+ "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac"
+ "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00"
+ "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd"
+ "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00"
+ "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f"
+ "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc"
+ "\x6e\x40\xbb\xff\xac",
+ 68,
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 448,
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x07\x87\x8f\x0f\x0f\x00\x00\x00"
+ "\x08\x40\x48\x80\x90\x80\x00\x00\x08\x07\xc8\x8f\x90\x00\x00\x00"
+ "\x08\x08\x48\x90\x90\x00\x00\x00\x08\x48\x4f\x10\x90\x80\x00\x00"
+ "\x07\x87\xc8\x0f\x8f\x00\x00\x00\x00\x00\x08\x00\x00\x00\x00\x00"
+ "\x00\x00\x08\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00"
+ "\x00\x00\x00\x00\x00\x00\x00\x00\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0c\x00\x00\x00\x00\x00\x00\xc0"
+ "\x0c\x00\x00\x00\x00\x00\x00\xc0\x0f\xff\xff\xff\xff\xff\xff\xc0"
+ "\x0f\xff\xff\xff\xff\xff\xff\xc0\x00\x00\x00\x00\x00\x00\x00\x00"
+ },
+ /* same as above but with global and page segments exchanged;
+ * this should fail because of exchanged global and page streams */
+ {
+ 68,
+ "\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\x18\x00\x01\x00\x00\x00"
+ "\x01\x00\x00\x00\x01\xe9\xcb\xf4\x00\x26\xaf\x04\xbf\xf0\x78\x2f"
+ "\xe0\x00\x40\x00\x00\x00\x10\x00\x01\x00\x00\x00\x00\x16\x08\x00"
+ "\x02\xff\x00\x00\x00\x01\x00\x00\x00\x01\x4f\xe7\x8d\x68\x1b\x14"
+ "\x2f\x3f\xff\xac",
+ 197,
+ "\x00\x00\x00\x08\x30\x00\x01\x00\x00\x00\x13\x00\x00\x00\x40\x00"
+ "\x00\x00\x38\x00\x00\x00\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00"
+ "\x00\x09\x00\x01\x01\x00\x00\x00\x1b\x08\x00\x02\xff\x00\x00\x00"
+ "\x02\x00\x00\x00\x02\x4f\xe7\x8c\x20\x0e\x1d\xc7\xcf\x01\x11\xc4"
+ "\xb2\x6f\xff\xac\x00\x00\x00\x0a\x07\x40\x00\x09\x01\x00\x00\x00"
+ "\x1f\x00\x00\x00\x25\x00\x00\x00\x08\x00\x00\x00\x04\x00\x00\x00"
+ "\x01\x00\x0c\x08\x00\x00\x00\x05\x8d\x6e\x5a\x12\x40\x85\xff\xac"
+ "\x00\x00\x00\x0b\x27\x00\x01\x00\x00\x00\x23\x00\x00\x00\x36\x00"
+ "\x00\x00\x2c\x00\x00\x00\x04\x00\x00\x00\x0b\x00\x08\x03\xff\xfd"
+ "\xff\x02\xfe\xfe\xfe\x04\xee\xed\x87\xfb\xcb\x2b\xff\xac\x00\x00"
+ "\x00\x0c\x10\x01\x01\x00\x00\x00\x1c\x06\x04\x04\x00\x00\x00\x0f"
+ "\x90\x71\x6b\x6d\x99\xa7\xaa\x49\x7d\xf2\xe5\x48\x1f\xdc\x68\xbc"
+ "\x6e\x40\xbb\xff\xac",
+ 0,
+ NULL
+ },
+ { 0, NULL, 0, NULL, 0, NULL }
+};
+
+
+static const struct test_params_s tests_params[] = {
+ /* No Test type Test operation Loop read size Cache size */
+ { 1, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 },
+ { 2, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 },
+ { 3, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 },
+ { 4, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 },
+ { 5, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 },
+
+ { 6, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_ONE, 0 },
+ { 7, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_TWO, 0 },
+ { 8, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_HALF, 0 },
+ { 9, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_EXACT, 0 },
+ { 10, TEST_TYPE_DECODER, TEST_OP_READ, LOOP_RW_SIZE_DOUBLE, 0 },
+
+ { 11, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 },
+ { 12, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 },
+ { 13, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 },
+ { 14, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 },
+ { 15, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 },
+
+ { 16, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_ONE, 0 },
+ { 17, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_TWO, 0 },
+ { 18, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_HALF, 0 },
+ { 19, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_EXACT, 0 },
+ { 20, TEST_TYPE_DECODER, TEST_OP_WRITE, LOOP_RW_SIZE_DOUBLE, 0 },
+};
+
+static void
+common_test_jbig2 (const pdf_char_t *function_name,
+ int test_index,
+ const struct test_strings_s *test_strings)
+{
+ int i;
+ const struct test_params_s *params = &tests_params[test_index - 1];
+ pdf_size_t globalseg_size, pageseg_size, bitmap_size;
+ pdf_char_t *globalseg, *pageseg, *bitmap;
+ pdf_hash_t *filter_params = NULL;
+ pdf_error_t *error = NULL;
+
+ /* Sanity check */
+ fail_if (test_index != params->idx);
+
+ for (i = 0; test_strings[i].pageseg; i++)
+ {
+ /* fill pdf_hash_t with global segment as parameter */
+ filter_params = pdf_hash_new (&error);
+ fail_if (!filter_params);
+ fail_if (error != NULL);
+
+ fail_if (!pdf_hash_add_size (filter_params,
+ JBIG2_PARAM_GLOBAL_STREAMS_SIZE,
+ test_strings[i].globalseg_size,
+ &error));
+
+ fail_if (!pdf_hash_add_static_string (filter_params,
+ JBIG2_PARAM_GLOBAL_STREAMS_BUFFER,
+ test_strings[i].globalseg,
+ &error));
+
+ pdf_stm_test_common (function_name,
+ params->type,
+ params->operation,
+ (params->type == TEST_TYPE_ENCODER ?
+ PDF_STM_FILTER_JBIG2_ENC :
+ PDF_STM_FILTER_JBIG2_DEC),
+ filter_params,
+ params->stm_cache_size,
+ params->loop_size,
+ test_strings[i].bitmap,
+ test_strings[i].bitmap_size,
+ test_strings[i].pageseg,
+ test_strings[i].pageseg_size);
+
+ pdf_hash_destroy (filter_params);
+ }
+}
+
+/*
+ * Test: pdf_stm_read_filter_jbig2_dec_001-005
+ * Description:
+ * Test JBIG2 decoder filter with different read loop sizes
+ * Success condition:
+ * The read data should be ok.
+ */
+START_TEST (pdf_stm_read_filter_jbig2_dec_001)
+{
+ common_test_jbig2 (__FUNCTION__, 1, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_002)
+{
+ common_test_jbig2 (__FUNCTION__, 2, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_003)
+{
+ common_test_jbig2 (__FUNCTION__, 3, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_004)
+{
+ common_test_jbig2 (__FUNCTION__, 4, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_005)
+{
+ common_test_jbig2 (__FUNCTION__, 5, test_strings_without_halftones);
+} END_TEST
+
+START_TEST (pdf_stm_read_filter_jbig2_dec_006)
+{
+ common_test_jbig2 (__FUNCTION__, 6, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_007)
+{
+ common_test_jbig2 (__FUNCTION__, 7, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_008)
+{
+ common_test_jbig2 (__FUNCTION__, 8, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_009)
+{
+ common_test_jbig2 (__FUNCTION__, 9, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_read_filter_jbig2_dec_010)
+{
+ common_test_jbig2 (__FUNCTION__, 10, test_strings_with_halftones);
+} END_TEST
+
+/*
+ * Test: pdf_stm_write_filter_jbig2_dec_001-005
+ * Description:
+ * Test JBIG2 decoder filter with different write loop sizes
+ * Success condition:
+ * The written data should be ok.
+ */
+START_TEST (pdf_stm_write_filter_jbig2_dec_001)
+{
+ common_test_jbig2 (__FUNCTION__, 11, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_002)
+{
+ common_test_jbig2 (__FUNCTION__, 12, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_003)
+{
+ common_test_jbig2 (__FUNCTION__, 13, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_004)
+{
+ common_test_jbig2 (__FUNCTION__, 14, test_strings_without_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_005)
+{
+ common_test_jbig2 (__FUNCTION__, 15, test_strings_without_halftones);
+} END_TEST
+
+START_TEST (pdf_stm_write_filter_jbig2_dec_006)
+{
+ common_test_jbig2 (__FUNCTION__, 16, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_007)
+{
+ common_test_jbig2 (__FUNCTION__, 17, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_008)
+{
+ common_test_jbig2 (__FUNCTION__, 18, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_009)
+{
+ common_test_jbig2 (__FUNCTION__, 19, test_strings_with_halftones);
+} END_TEST
+START_TEST (pdf_stm_write_filter_jbig2_dec_010)
+{
+ common_test_jbig2 (__FUNCTION__, 20, test_strings_with_halftones);
+} END_TEST
+
+/*
+ * Test case creation functions
+ */
+TCase *
+test_pdf_stm_rw_filter_jbig2 (void)
+{
+ TCase *tc = tcase_create ("pdf_stm_rw_filter_jbig2");
+
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_001);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_002);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_003);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_004);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_005);
+
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_006);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_007);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_008);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_009);
+ tcase_add_test (tc, pdf_stm_read_filter_jbig2_dec_010);
+
+
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_001);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_002);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_003);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_004);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_005);
+
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_006);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_007);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_008);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_009);
+ tcase_add_test (tc, pdf_stm_write_filter_jbig2_dec_010);
+
+
+ tcase_add_checked_fixture (tc,
+ pdf_test_setup,
+ pdf_test_teardown);
+ return tc;
+}
+
+/* End of pdf-stm-read-filter-jbig2.c */
=== modified file 'torture/unit/base/stm/tsuite-stm.c'
--- torture/unit/base/stm/tsuite-stm.c 2011-05-17 22:17:31 +0000
+++ torture/unit/base/stm/tsuite-stm.c 2011-12-14 17:56:25 +0000
@@ -45,6 +45,7 @@
extern TCase *test_pdf_stm_rw_filter_flate (void);
extern TCase *test_pdf_stm_rw_filter_v2 (void);
extern TCase *test_pdf_stm_rw_filter_aesv2 (void);
+extern TCase *test_pdf_stm_rw_filter_jbig2 (void);
Suite *
tsuite_stm ()
@@ -70,6 +71,7 @@
suite_add_tcase (s, test_pdf_stm_rw_filter_v2 ());
suite_add_tcase (s, test_pdf_stm_rw_filter_aesv2 ());
suite_add_tcase (s, test_pdf_stm_flush ());
+ suite_add_tcase (s, test_pdf_stm_rw_filter_jbig2 ());
return s;
}
# Begin bundle
IyBCYXphYXIgcmV2aXNpb24gYnVuZGxlIHY0CiMKQlpoOTFBWSZTWf8OTPQAIGV/gH96guD5f///
//fe/r////pgJh6h749Mq9rjsm29E6d9zus83TfbAqvCj0aptgO2Dp3YKABZSvYNAEUpLrs0ABcc
M3vbo7l3a3vdu3LI9dGXC5qyp2MVUpQt4tyRVKora2kCSQhPSaNGjJpMKntT9SnsmVNNpqPUPUek
A000Hqepo9IBppoAkhACBCEymqfoap6m1PU8UAPKAAAAaAAABFU/VN/qoAn6gBNMAAAExMmAAAAA
AEYCU/VUmhJG1D1G0mT0jQ0PUAeoADTQAAAAAACJIhNAEmnqaaaaU3oNKn5T1PIaNDJip+SgyeUH
omT1AY1NAVJCJoAQE000xBGUp/pqFP0MkE9lANJo9TNCB6gxtJyICvfVIq+BUnhVIB4lSAdap41Q
5L/QRjF6H+jzQPCeAllcCgyGZbRbN5MeM/4YLFECibPROTsajQ6Y/jrKCQlbL/Lh/1/Q/eek/jJz
5FqhsrnIb+e195vTiboqRjDlaKooAAqAEIKThF529NRqegxMMKyJjRbbt/HNU9X2SUJmZOghaCll
zLlizViqtRoLNBIRRRRRRWmu3VsWiozZt000aZXqc6LUVRvP6q+xo+1PS+w4E9jwT2O97EzJdveB
sYZWSuPDxLKKVQ5+Vk3ernEvfwt6/048VvHVjHd7DSi1FUVRai1FUVYk2UXb+8ZAWM3ZqM2Xerm0
j5qs02eRZVLOrNJ5F5jRaHS4Ce54pFKV2vZJIRx7PDGrKIJGtIiXCgoipJ6WxPAs/0YSqSr29+ab
7Mz+JlcFnKs25bcpqAgF4AIiIiI4+Tq23MyW602xEpVSFFRUmlJeCHs/B+zHFv+975dj8Hr6VbNm
gAAAAABnb3xabN/Lwfu2uD2e8RkbxGjft2q5ozUJMUdTvWyNEWxasPpMZRLrdOlnnAZoEAa0rPKZ
irUwG8Rky62J02mYJEWJhw2bcqZbku65eofyCM9UZ1fTjGUdTGDA92zhF8JHXM97h0z30XDpIOyp
NEP0zw/YaIcd3w0Q8faduNUY6raT4PYt9R7tjFmMHO/4WPAx38VsxJa+vZoiw86MQSsRJjN2pUpV
/KtmIPsLVhbF2dHgrZjsSnoct6Uqxk3n6HgecVDe5r2bH/uMnxPi/4PNpUnyEUs/yagzDCgecVRt
Rynb6koFxylHApKB8qESBQ9el05lFMTED6763shi/A7TDjLD1CkJy+DhONxfQi0km1QYUpNtksfJ
+50ruXU9TRWHocGo+TjamiYl+GplWT97J9Td0VyI+ZHBLSXh/yRkwvCx+R/qzNM94qkHJSiY+X7q
Y2PuMiO9/mEzQdITTNOXjpyqBv5xiglqKp2nBxA6h44eqDYF2jJuZzE5eKj86PHqamepZzflYTY1
u15raLXy6jWJqLpvhLz9EHLbBJEkSQSRJBoN01T96zrVqbYnRoxsvFvBNnm4sNqU9tXbxub1Ijiy
ZZRvbO1dLovSKt6qizkRqOLoTcdLuY/O8rcqm044NjQ82GTGEs8zgUl3mKNIDv7DVUUg+AE+10An
pW5FZAIxSP7XkNV1Hm3tCNR6oDxiCHz8cHhP9AeUfC//f3Or6t+LpWIUStbFQZN7ZD2zBfE7M99j
CO05z0b06zD6X52qNL4/gSTgUcdnHRvx4cZty/TWXLSbJ0r8VSA7dW6z0ETARUiDR0FC9aSf5oDk
kB2jJCR3GDWU46tVurPetsjGMYxjGMfeet/aDRIxHOc5wAAAAAAA6JcSQlBPn7gykkkMxjES8kdU
y/Jzzzz5eXl5VrWsRERERWta1rWsREXBHbhmpSlMYxita1rWtfQP3AGBJkMJhhhhgYAhB/upogx9
wfQFKh+EU6D3nuAz0pq5LS3CDZxEOK0zGccFuhy6W0szetuID5fHI7rqQg6hiqU+MkhJJJJ+QJ8E
LInf+Tq7Xf59Pf7nygfmIaejVbN84zm5e5e6vcvcvYrScvBsB6o2Ej5C4HkgR6QMvUBH3nqUNa23
iIjudddu8REbfpnxBhgzk0kn2dj4vw5Ywvh1NW/jxSYNR0Ol9kOsxFHMLRRKj+xZJyNpu6o2xii1
jaT+XjxANofUHghJI5tnAeYGD63lewj6nsm4+pVkUg44JJFBjL55T5RTFxxFpg1WZKUvISqwZmnc
SoFJKiqWWx0KpvIb6o5DcW+CBk/IAH2A9UIMPvp+1PgUJrPMve90DbWzp5WqoqrRzWx5upLasZyY
ti8fpeXx7+6/qc4PYpB1UqBIxJJJXz2Zb8sreszq1mYgwbTLR1vegZQrOrSZgSsrW+hRbV5hXAD5
LEvN+Lk/SlExQpKKklGqJIQ4ccLZ4NaGZlEGDSVvcNUIXxqJUGZYLzCCzFEoiixotEvGTKfffMhk
hj3yVywnoZYo+VsFzNKTXJLwcmy0wctUtJKSHImJJHiwbzHI3N+Pq6daO90ugVKG+TJlNwwUkk0l
JMqJpaoUOwxREvDVfTe44svHIIByEFSZSkgYKG8qIMpSSHoKk0qQmEUCMES8ZByg1FcoOmC1BKBZ
iwvVpUXlA30iMUbKR1UjVOVoJLvkIyxJMyZ41VRKadXU8TaicBJU1v43mLPMYHDVjjFCaVzI4gAp
ihCmUWiFNXB1wMAo5Kh4QjsioyFhl1V0QyJDE5F2cDl0KU9+IIGaQmM/eoCXoykAf5vQPR6y7P5M
9M7Ij7Ex0odPznLgaFNCpJJsvYuENSfmHOFlZF5+L6DxsoBGySLj92Jdajfinp5v17rtNdI5OUWQ
3mWGv6I9BXuHfBcgGDIBgSsQlZfevNfWrB4PBUKrnp8kq03Y3YaQewLDKi2AqJnkarAvCTXizROF
tuYph4LyTkYag0lPbcXPqI7gkOyShg8+7i389LrtqGvmHBrylcNcGuTyNbEJd3NEIclI2koKErlp
nv6ggTfP+WHqJVY3rrj6LsCGGTEpN2Oqf6KhZw8TlTB1nWTXtpSqYMJ9dMcqO7hqmzZEbmZ8l5JJ
kU0lcDRzcJsAYKfGqyc7USUYSVkkXGahPQ8yZtskyqSNCaHjyyxrjNfw8OtubAKqlygl0T5HHwVD
Rc29pIRZbbkpI7h5AHheJKhtznileSx8L9kBgXHYHaMEEDBZwdhaXudItcire2uUgJglU0Z5olLn
FtmZX53DhGgnWiOjmpqaNq8cVJtcmF0YJVqMuN1xZPf3DhJbWr3q2DzPFvHXusCpZhkzC4TPPz+N
A6DJtABauHd6TuEzZJUBP2Jla0AWySO5ByYB8UBS9qpIzIGQe6mylbo8zRLRP5Y5IFcnfohepeg4
bm52Ox28b9i4umt5CU04cP37db32dud6c16xlZOsEx+NGjAZJYOHyYdB8gVTaBLqmx3bsbnAw7sJ
91u9QVZsMM0AutqRIAhJG5FUpzEpqODR8kjrepYkx6o5EkalTE7TkuQhoPK9Qu7cYM1NKZHB2AE5
ufvkz5Mipy5sRNd4bcpMRiTdEpgm1T0DcsVBg7U9oPL2cVDzZE6uzCrbN/SWsBEOrHu3A7u9iRFp
OVJDsQpnAYIjQ6QyA9ke2yQu24vEMZkNuM+5KLIqCiTDDNQAm4+/B5LZSNqXbk8E+AmJ+5aRUYnq
XLHcHSR0Mkj2SRcmrCTGO2qnbg7FTIeQT5MkGSnR1NJXW117WCuUGJqL4WPGaTBTarI5GfljFWvs
ySWTSupcrxVGDyRkbk0xuUGHktoHI+oScztg+ILZJHqb79vXYYpOcnFw9SQUmwwzPJwVdYGom9Y8
BeUsGJpKbGdGpU7kVPaqWFXji0js09ReHf389zDqa3XPTOSTM4vQoyUnTOoN4lP2eOnvYoQOOOMD
iGBgFa8QwSzES3n2eYj2vzyNAyJOPKR1AXGALFsEBEFjx2Bf+h654SRz2169++zJjl5FTa/kEpVH
HGagB4mKzC7Tz5YuerBt4sLBK/zjjsWedSiqbT+HY6I2yu0Bc0OJYOUl8A3mSK7HYnNJEi3Y3Ykj
5yRn6d+1wwdbr3Yl2DZg28CeibQxgcB27btPopAax3jXZxX9UvNN3lUJJ0z1UoW4pTXF7l5tLqeD
YMmLlEvtNi5xMwcVEYALBwAr1KxC7nJpssEPJSCCBml0oIhP2HSTsgUkS0kngFzGTx1Q7FaEGOW7
TBRvk9/vpfcpwPSk1UOjk5LDxNLgcfJJ564IEUSRtexZSSR/Ukihbe5zIspei6EYBkEAyoyRwr9w
3Bq+AouvOsLnLiutorCllOp8eVra2WcYjfc2OVsrtsQhVG4ybwI94fkgEppIz10OR5T6JG3NKzCv
bj5YIGaElkM0CeTcERwWniyLVifsTA1sUC0FrksCa7yg0pIodyVGaEkWbtyMOkiv4UkVRkyX81pC
ZOgvtzTjhuZp115UvyGL0YMbETbAzG8FT6BK1ypx1YPRdzPEhzaNm5m3qz89EnTF/OOx7ibBw7qq
vFLvc6nN22nfxpORjxY3eXKyYPbcEa0BirSODQBHJl0ckDLJjhc9p7SB6fXR5SA3SB0G+OxWfPTN
B0qI1Y124v7WRHafjRUlSpH+8P7yigOZ2ockiRNI0HO1CRI2YBCBgUeg8j9IlIQs+MHA8JgBIEVS
j3H5j+Uj/CHzLH3l1M3e/2P5lNYjjwnZVRBgQZGPtD+SP4n4ge86d/27il/M/Ao5CzTFGGGQUYRn
Oq0qy/q4L1Lis4rsmojdA4yI6JLDYI0Zj9641xHWP8HETr4yf3QLzak2CP7sKqEfvbDaohGY4SSb
xRKhOmUPHY1zjDa7WsyKEZHNc/Wo5RMiyYUPvnYtJiH97lO6ntk8pJwLiNQ7IjxYc3dIjKRtVpn7
Zgj2DUB0IchZH9YfdlGMhGJAgQKlKpTBSNjMsjwVHhc5lHU6e9JuEUI9YzZm8b9h+2pMMxFp09Yq
ToO2RHMdAi8I7ZcjSEVEdr3eLE8Bdkbo//n5JEa12pCKTqlnJ6Loixks0I65OiItOxm0pEXhGZ0t
MmJEdAyQj6BFxYiNpuPfR9yk2BG5snYPewI2szdEdpvCLkRrw4NYjQuo9U1C7YtIjEIzEVIjQfuV
IZDcPFsXiekR6WTq1PoRR2jfELGxBOIGkwVTE3KJyA9lQt1p7I+1iD7Agj7IH1vt9NWASgu/c2CM
sEEgRfdk0iVFaeimgpqMFMgBgUEcWCSXUjMWWElzGIYbJlmXMryyl5F94YYBZuYOYXb2s1IwgZBA
IvluU2JmzXPitzAtkWAQsRhopWiA0xACyoUpaUUULKkJq/q2FwxRwM+E2XE0XtYMSJAmTECiImhi
mDEdIU0pogD/bLQMRikHUFDaMgVAJBsVQaUtakTe3Nw3KUounBZMpClNC6lMKUlM2SMpolTjpY3T
Fg2lJsWBWMaA+u2hteIRiEglMaCbGAbA0MtlZwKBsnFhMZ3XPElgNKUnyExFmG9gGTGMcHdpsmMd
k397hZ2xV0gsISSkpKUqSUkkkkkmETaGFymk6fKYUCs6VbqXV7Lrl7qeVvkOAxmVKUCOWcKb864m
pAwT3XFIU1NQaXG/RYMVgQiRKqjTAo0QoYQzgZ5O7PLbN1t861zhaQzY25JsG2wczC9JK0rRelqA
zcjImTrSu4UQcrh73VVpbTarXg0MKtoCDmVpKYwbtHKxRWTLfnCpG2tpz4y0FpXUWWwZaOOZxXeX
D2oaXF84zbmds/NrljrDM19OWGJjA44wxuOMQJhxxxxxOb2gIGBMOFtLi3O8XOFPhc6N1pOGwxXd
Tkp9PneU5A03NiuHWcgTFyy5uPVMUk+z9sYrQJ3E+k/VWYvCsacOFrdQuNlC0uAYUK+N+VKecdbv
yscZvy3D0reucz1K+0t9lxPHGlarGp0qgOMg+/BdcRTjMuHlQpp2WVxzbAcUBJbIKM4gYYQh99bb
BjRlYFe1aKV0XlrEw4cvybsZvly/JVrUjVOE+0uAjnVcunaVkrtLemQfO7uwbFBxVmoIGNhxhgYY
HGGGC2KBefKwPwDxlqc76YlSSmtKrOLaLcoSxCEHe4udgkjGRHezEg4qCyiSZ0t+Efzk4PWI3JEe
58eHrkhVrEfEzEUWh5FDxhGZ7iLyoRo0hHvPI+oRoI1CpEaoj2iPrqy471ZZZe7dGrkvXtbtr6oE
kgSBIEgVlv0sy3K3bQAAAAACaU0AAAAAACZrbrFKUbbNM1zsMSkhD0DB90RIilkCUiRVLhjS+QLi
alEq9AUJYHP4zQfcVLMooq4tqYoE77ojZGyjRLZsKEbG1EaDsKBIgkI75MLFe5d7YfpZ+AQnnA5i
QfwHlL0xMf6LPcZKuR3JSUp2Uh/sVqyv3+u8tb3032TzCe99m9pwH8Oxlhh9Tqsjg1rDhPmw9O+R
zdFpCeQVOwagtym7zHw2hr7psOhpApf+dC9B5jpCZpzj754ifj6GEyP2JTkFuHqSY3Tn1XiKUOGx
0LyxnpN4/GwyU1J55DqSS5PXtfQmIk+lZrazp4PBKdUlEjcm6mtabk3PkZONxBVAYCQYkCqf5Pao
Pb491hrNxxchcVBMbZpeQ+n6YF8qSa4lFSD5DJeCjfUb5ueZQkUOSr4mQZJFghLydMr29zY5db0l
2jhbzBiE2uvpSP+PczMxkKJQqZUEY0kDYBSN3AhYlAVJ2AkG3uJkZAaO2HkfEfuMXxSwQ86ua+8A
N/iMRvEbZ19UxHbiTNEXHydSB2+fkuQW9L9s+naXS3GE1j3lJiHlwyryz4jOSkpdOTkpowmQlmCZ
ptaGJNTHXOxtnjtSJRSxQZ1BKlR48jxvfXL7Atwyz3F7bMdVrvakhISBCMkhJGBEYERgmGWXS53R
4bi59zXHyHcYYEjFEG13MHwF31Q4Kep2HVe5k6EOLmyKeb0dU+JNWb2vi7RyOx+C7gxTSU2RKESI
huzpZuuatlZd+rIs511tMJ/nExJkQ749kTSOs18IHmGG5qiEacAhZOny65oYZTN07+3sZurjPJlk
nc8Wp68bnh613icpy5+AkWOhKZfHABzfc18VQurlCWYqOUDZJHzbc9RDAU8oy6XnK60pxec91JU0
+TpIRQtRUiOE83LvT8Sxmy4u52tbEblbSJueqDl4BEmspMekACvHNw6nEOJFrd/QsvA2x06Ch61D
9TFVdLEbjkOZRiPOD1Fjoc96zAeza835m5qfFfDUpZRg3qkzZGpN6mR89T3UzbUWVmbYv5peZtb8
92xazauza8Tfj28LuCmiyyblcMkRwmyDKTEdyayWn89F2Y47jkhXpGNvLhJFyktdGS6lzYmg9zRw
DIpao2qWG5Zou97vWTLHa2Ot2HoDmi8Zz00wwqpk/mb+hAElv7l1NN0zrj8Hd7WinzxjdlcYUUk1
JZY73FSIqRHSjlB4OlOt1pEvUzVJfW/48vDwynEDu0bE0wTvXbd/RZkp5LPSp1/S1Xm8+ax5K4Ox
SfnZ992V0G91Zdaycel60mCsnEPMSVBnEpUlhYC5euRNawYOeha8ux671Wn9FAWgKAXQC4lacwkc
PYYyh9gqxHMZ5DSFksGI3SSNj6Y9UPoXHdUkv8PCLNnFVKRB7o+UKMhxoX0cn8Xl4BodY6QTMh5R
8rvXlHldoCewCECBBgiNMDkiWi+Sxd0nE5wR5ilDYevIKIXc1T5jN4Hym8Z8SAfJ1PoDoyPDNihD
0HmAyqYH6LF19LY+C/xfBtlzR+VrUvVacLXLWngo4sTDO63W6cNlBIgFoYHHHAumXvCaquEz4wjX
H21oqrjCAmwLdUS1igTRuMBuDBoJaVhcCBgQWiCJrBg70FZc3l8eb8gg5xWibBsQmJndblaoVBEh
0nwMACO/V/NH54M7ht+kScF7glCHqRh1iqf1dnyfu/xoxP+SbGjq3xlE/RPq9ZqSYR4J2PgJ7Uya
Tm4NHY3T4RU0VND6C5hJJkyWWgfSFSCYoa0wIgQfWfUEdiwphSQoYlc6yk1NXm844T6+arMh/CSX
dZUkj2nQnJEOClz5HUHGylgfM4KSoC6zuCnuLi0OBc52hfO4FFNHGDoLnjwCkyIXQivi7X2GReE9
8A0Hucwhd4oMySRQGhbEQPICd0fOODQmpFxZfSeCfKd8kVP42bSYT1RHxflJDY9El4k/pUj5Ku0t
IDIsnOP1RO+Dambs1TcUSPuaO3unsmqbnip4ULCiVEocx0B0Lyn6lDYFztrAi4vzJFEgdkU6SxSu
I8w2fO5OJym1PfEA2Qe+E7SDmd0aETso0Di+J7wxOwLsLK+C50rzGlA6Sc5gbHzq3YwTlJPzKVlP
1EwTZGponczQpT9MEM9MlA4voB7oI0A8ncH5TMovxmk8Z9s3oTjP1KTmaOafBcmuYSpAbJxRz4gO
ic6dASgU5wMxOUEhFzVSSWCqpBOl+Z5XTgTZJwNUfbSOY8ZiX9y0zPbOEhOZYJTOfkJpEtqbzel4
1kUcyQwoosbGixYuXLvhIPnVgPbFkkH3Os4I/kaJG2bIn9Nx3JZgxBV0qWTWlKjJKSNNPJd9xnFl
RqFIjSKncYn3kAuQ6qMzI1CRXQUQgLIKw7oLws6/udk2euRZ6XihSju3yPkfQ+toZJ8kzToklxpI
Ti2KQooFIiybXXKSLNbJaSbFxq6UeTa9zEs1PsWX6VWWj3qXN0HB2x9skqSRTKTa55od7thu60pV
Oo/A0IfSFilfL5zfmB3uk5HmBgKkgSDKtZOsYcnFyTjxC6Rh4HBQEMAdaWcddPX63UzTm0kXo1rl
di9jTK4UAAAQAQBz83Ma2usAAAQAQB/1cG1LoZZyV0JMzrBbkdISLXpSV2rALMpzmFAgbzgSBeQo
9Ac6tY8AdwPSaDyZpBnXGRpYmw8FkbP0BSB0lDWkqSIZGVHwWgunsTCSbpwUwXkn2htWNSws6Rzn
lIj4T5yYOZxai0HQi0cz6mkdaIHqTHSGrvFgsqmse0KmojcdC9sKDeZdA7gNVPKN+6r7RdZmm1Ul
IyJtdSNg7k1M4ZtSfkWyzlosZ2epK8VSmGLJSspO/DQip73FYnzmHlLls6olmyKWKUJtnd7Zv89I
cVxSlO1ClBxNNzDXIRkhLgcqd3QcDMbHLCRlJdHS1Q6FpSgsvSoFJunnSqiqjRkGpFdKsH4hFBb9
5dHhTJAwCeJf5fmZgninKDZxMWfJZEbLjctE4y6jVfLi73cIteHVdO1ub2eeSmSyyy7NhilswDHq
Eg0QMcIYOJ0mBiF2k6ywmDGcjJFiSfSRRIwm5Yn5HmiObcoUxMzUNGbSKYFrkDg93VYpEsxUHaKT
W1tBFnoLNr734fwwiM47eVrWuq/1xVaf52vVEmToLQ/W5WI4zuDJIuhSpTqVJOmdPUsPZMu9Ln4l
JSak703ETuiAWGDqcDoAbIH87pM+nuoZmPsIoNopgqWipVJwr8dw9z3SnCTpInU6nm2CyuZSkTGX
BEHoCYELsFlMYtt8RnQt32+etBiNiEetVPyobBwPvVSJxO0nzbTvdBr6jSWBhE4EAZMkMDyEx3wC
wjcdBG8eQ1jaTUgwjyvIfrSXfiPW4Mv0iUpzRSP0KJFh2B0FDEeypAim8+ss2USORzH4AGldav4R
JESfAoET9FQS9QRKUgR/zjuC8J2tQbHk8HLm+jpWncs7GhhKnTF8gB61eIZDkalencKnEOD403AC
ZgP5ET6AGADAooKkhBIBAIqMX/8XckU4UJD/Dkz0