Handle inheritable page attributes

Add getAttribute for handling inheritable page attributes, and fix
getPageImages and annotation flattening code to use it.
This commit is contained in:
Jay Berkenbilt 2019-01-25 06:55:31 -05:00
parent 2d32f4db8f
commit 009767d97a
17 changed files with 2077 additions and 1812 deletions

View File

@ -1,3 +1,15 @@
2019-01-25 Jay Berkenbilt <ejb@ql.org>
* Add new method QPDFPageObjectHelper::getAttribute() that
properly handles inherited attributes and allows for creation of a
copy of shared attributes. This is very useful if you are getting
an attribute of a page dictionary with the intent to modify it
privately for that page.
* Fix QPDFPageObjectHelper::getPageImages (and the legacy
QPDFObjectHandle::getPageImages()) to properly handle images in
inherited resources dictionaries.
2019-01-20 Jay Berkenbilt <ejb@ql.org>
* Tweak the content code generated for variable text fields to

View File

@ -39,13 +39,22 @@ class QPDFPageObjectHelper: public QPDFObjectHelper
{
}
// Return the effective value of this attribute for the page. If
// the requested attribute is not present on the page but is
// inheritable, look up through the page's ancestors in the page
// tree. If copy_if_shared is true, then this method will replace
// the attribute with a shallow copy if it is in indirect or
// inherited and return the copy. You should do this if you are
// going to modify the returned object and want the modifications
// to apply to the current page only.
QPDF_DLL
QPDFObjectHandle
getAttribute(std::string const& name, bool copy_if_shared);
// Returns an empty map if there are no images or no resources.
// This function does not presently support inherited resources.
// If this is a significant concern, call
// pushInheritedAttributesToPage() on the QPDF object that owns
// this page. See comment in the source for details. Return value
// is a map from XObject name to the image object, which is always
// a stream.
// Prior to qpdf 8.4.0, this function did not support inherited
// resources, but it does now. Return value is a map from XObject
// name to the image object, which is always a stream.
QPDF_DLL
std::map<std::string, QPDFObjectHandle> getPageImages();

View File

@ -18,6 +18,7 @@
#include <qpdf/Pl_QPDFTokenizer.hh>
#include <qpdf/BufferInputSource.hh>
#include <qpdf/QPDFExc.hh>
#include <qpdf/QPDFPageObjectHelper.hh>
#include <qpdf/QTC.hh>
#include <qpdf/QUtil.hh>
@ -1109,24 +1110,11 @@ QPDFObjectHandle::getGeneration() const
std::map<std::string, QPDFObjectHandle>
QPDFObjectHandle::getPageImages()
{
// Note: this code doesn't handle inherited resources. If this
// page dictionary doesn't have a /Resources key or has one whose
// value is null or an empty dictionary, you are supposed to walk
// up the page tree until you find a /Resources dictionary. As of
// this writing, I don't have any test files that use inherited
// resources, and hand-generating one won't be a good test because
// any mistakes in my understanding would be present in both the
// code and the test file.
// NOTE: If support of inherited resources (see above comment) is
// implemented, edit comment in QPDFObjectHandle.hh for this
// function. Also remove call to pushInheritedAttributesToPage
// from qpdf.cc when show_page_images is true.
std::map<std::string, QPDFObjectHandle> result;
if (this->hasKey("/Resources"))
QPDFObjectHandle resources =
QPDFPageObjectHelper(*this).getAttribute("/Resources", false);
if (resources.isDictionary())
{
QPDFObjectHandle resources = this->getKey("/Resources");
if (resources.hasKey("/XObject"))
{
QPDFObjectHandle xobject = resources.getKey("/XObject");

View File

@ -79,20 +79,12 @@ QPDFPageDocumentHelper::flattenAnnotations(
"document does not have updated appearance streams,"
" so form fields will not be flattened");
}
pushInheritedAttributesToPage();
std::vector<QPDFPageObjectHelper> pages = getAllPages();
for (std::vector<QPDFPageObjectHelper>::iterator iter = pages.begin();
iter != pages.end(); ++iter)
{
QPDFPageObjectHelper ph(*iter);
QPDFObjectHandle page_oh = ph.getObjectHandle();
if (page_oh.getKey("/Resources").isIndirect())
{
QTC::TC("qpdf", "QPDFPageDocumentHelper indirect resources");
page_oh.replaceKey("/Resources",
page_oh.getKey("/Resources").shallowCopy());
}
QPDFObjectHandle resources = ph.getObjectHandle().getKey("/Resources");
QPDFObjectHandle resources = ph.getAttribute("/Resources", true);
if (! resources.isDictionary())
{
// This should never happen and is not exercised in the

View File

@ -15,6 +15,42 @@ QPDFPageObjectHelper::QPDFPageObjectHelper(QPDFObjectHandle oh) :
{
}
QPDFObjectHandle
QPDFPageObjectHelper::getAttribute(std::string const& name,
bool copy_if_shared)
{
bool inheritable = ((name == "/MediaBox") || (name == "/CropBox") ||
(name == "/Resources") || (name == "/Rotate"));
QPDFObjectHandle node = this->oh;
QPDFObjectHandle result(node.getKey(name));
std::set<QPDFObjGen> seen;
bool inherited = false;
while (inheritable && result.isNull() && node.hasKey("/Parent"))
{
seen.insert(node.getObjGen());
node = node.getKey("/Parent");
if (seen.count(node.getObjGen()))
{
break;
}
result = node.getKey(name);
if (! result.isNull())
{
QTC::TC("qpdf", "QPDFPageObjectHelper non-trivial inheritance");
inherited = true;
}
}
if (copy_if_shared && (inherited || result.isIndirect()))
{
QTC::TC("qpdf", "QPDFPageObjectHelper copy shared attribute");
result = result.shallowCopy();
this->oh.replaceKey(name, result);
}
return result;
}
std::map<std::string, QPDFObjectHandle>
QPDFPageObjectHelper::getPageImages()
{
@ -159,12 +195,7 @@ QPDFPageObjectHelper::removeUnreferencedResources()
std::vector<std::string> to_filter;
to_filter.push_back("/Font");
to_filter.push_back("/XObject");
QPDFObjectHandle resources = this->oh.getKey("/Resources");
if (resources.isDictionary())
{
resources = resources.shallowCopy();
this->oh.replaceKey("/Resources", resources);
}
QPDFObjectHandle resources = getAttribute("/Resources", true);
for (std::vector<std::string>::iterator d_iter = to_filter.begin();
d_iter != to_filter.end(); ++d_iter)
{

View File

@ -208,10 +208,10 @@ QPDF::pushInheritedAttributesToPageInternal2(
if (type == "/Pages")
{
// Make a list of inheritable keys. Any key other than /Type,
// /Parent, Kids, or /Count is an inheritable attribute. Push
// this object onto the stack of pages nodes that have values
// for this attribute.
// Make a list of inheritable keys. Only the keys /MediaBox,
// /CropBox, /Resources, and /Rotate are inheritable
// attributes. Push this object onto the stack of pages nodes
// that have values for this attribute.
std::set<std::string> inheritable_keys;
std::set<std::string> keys = cur_pages.getKeys();

View File

@ -3070,10 +3070,6 @@ static void do_show_obj(QPDF& pdf, Options& o, int& exit_code)
static void do_show_pages(QPDF& pdf, Options& o)
{
QPDFPageDocumentHelper dh(pdf);
if (o.show_page_images)
{
dh.pushInheritedAttributesToPage();
}
std::vector<QPDFPageObjectHelper> pages = dh.getAllPages();
int pageno = 0;
for (std::vector<QPDFPageObjectHelper>::iterator iter = pages.begin();
@ -3862,7 +3858,6 @@ static void handle_transformations(QPDF& pdf, Options& o)
QPDFPageDocumentHelper dh(pdf);
if (o.optimize_images)
{
dh.pushInheritedAttributesToPage();
int pageno = 0;
std::vector<QPDFPageObjectHelper> pages = dh.getAllPages();
for (std::vector<QPDFPageObjectHelper>::iterator iter = pages.begin();
@ -3891,8 +3886,9 @@ static void handle_transformations(QPDF& pdf, Options& o)
sdp,
QPDFObjectHandle::newName("/DCTDecode"),
QPDFObjectHandle::newNull());
page.getKey("/Resources").getKey("/XObject").replaceKey(
name, new_image);
ph.getAttribute("/Resources", true).
getKey("/XObject").replaceKey(
name, new_image);
}
}
}
@ -4054,7 +4050,6 @@ static void handle_page_specs(QPDF& pdf, Options& o)
cis->stayOpen(true);
}
QPDFPageDocumentHelper dh(*((*iter).second));
dh.pushInheritedAttributesToPage();
dh.removeUnreferencedResources();
if (cis)
{
@ -4532,7 +4527,6 @@ static void write_outfile(QPDF& pdf, Options& o)
if (! o.preserve_unreferenced_page_resources)
{
QPDFPageDocumentHelper dh(pdf);
dh.pushInheritedAttributesToPage();
dh.removeUnreferencedResources();
}
QPDFPageLabelDocumentHelper pldh(pdf);

View File

@ -378,7 +378,6 @@ QPDFAnnotationObjectHelper default matrix 0
QPDFAnnotationObjectHelper rotate 90 0
QPDFAnnotationObjectHelper rotate 180 0
QPDFAnnotationObjectHelper rotate 270 0
QPDFPageDocumentHelper indirect resources 0
QPDFPageDocumentHelper skip widget need appearances 0
QPDFPageDocumentHelper merge DR 0
QPDFPageDocumentHelper non-widget annotation 0
@ -426,3 +425,5 @@ QPDFFormFieldObjectHelper create AS from scratch 0
QPDFFormFieldObjectHelper create AP from scratch 0
QPDFFormFieldObjectHelper replaced BMC at EOF 0
QPDFFormFieldObjectHelper fallback Tf 0
QPDFPageObjectHelper non-trivial inheritance 0
QPDFPageObjectHelper copy shared attribute 0

View File

@ -2409,7 +2409,7 @@ $td->runtest("stream detected",
show_ntests();
# ----------
$td->notify("--- Extraction Tests ---");
$n_tests += 12;
$n_tests += 13;
$td->runtest("show xref",
{$td->COMMAND => "qpdf encrypted-with-images.pdf" .
@ -2432,6 +2432,13 @@ $td->runtest("show-pages-images",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
$td->runtest("show-pages-images",
{$td->COMMAND => "qpdf shared-images.pdf" .
" --show-pages --with-images"},
{$td->FILE => "shared-images-show.out",
$td->EXIT_STATUS => 0},
$td->NORMALIZE_NEWLINES);
$td->runtest("show-page-1",
{$td->COMMAND => "qpdf encrypted-with-images.pdf" .
" --show-object=5,0"},

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because it is too large Load Diff

File diff suppressed because one or more lines are too long

View File

@ -414,6 +414,13 @@ endobj
/Kids [
15 0 R
]
/MediaBox [
0
0
612
792
]
/Resources 3 0 R
/Type /Pages
>>
endobj
@ -3529,189 +3536,189 @@ xref
0000004062 00000 n
0000004533 00000 n
0000004913 00000 n
0000004987 00000 n
0000005137 00000 n
0000005227 00000 n
0000005404 00000 n
0000005423 00000 n
0000005787 00000 n
0000006153 00000 n
0000006519 00000 n
0000006757 00000 n
0000006777 00000 n
0000006858 00000 n
0000007026 00000 n
0000007046 00000 n
0000007284 00000 n
0000007304 00000 n
0000007472 00000 n
0000007492 00000 n
0000007730 00000 n
0000007750 00000 n
0000008116 00000 n
0000008480 00000 n
0000008846 00000 n
0000009047 00000 n
0000009067 00000 n
0000009268 00000 n
0000009288 00000 n
0000009491 00000 n
0000009511 00000 n
0000009710 00000 n
0000009730 00000 n
0000009905 00000 n
0000009964 00000 n
0000010006 00000 n
0000014832 00000 n
0000014877 00000 n
0000015005 00000 n
0000015025 00000 n
0000016248 00000 n
0000016269 00000 n
0000017056 00000 n
0000017457 00000 n
0000017908 00000 n
0000019825 00000 n
0000020195 00000 n
0000022109 00000 n
0000022485 00000 n
0000022506 00000 n
0000022674 00000 n
0000022694 00000 n
0000023070 00000 n
0000023091 00000 n
0000023259 00000 n
0000023279 00000 n
0000023655 00000 n
0000023676 00000 n
0000023844 00000 n
0000023864 00000 n
0000024240 00000 n
0000024261 00000 n
0000024429 00000 n
0000024449 00000 n
0000024825 00000 n
0000024846 00000 n
0000025014 00000 n
0000025034 00000 n
0000025410 00000 n
0000025431 00000 n
0000025599 00000 n
0000025619 00000 n
0000025732 00000 n
0000025828 00000 n
0000025941 00000 n
0000026037 00000 n
0000026150 00000 n
0000026246 00000 n
0000026342 00000 n
0000026438 00000 n
0000026534 00000 n
0000026630 00000 n
0000026726 00000 n
0000026839 00000 n
0000026935 00000 n
0000027031 00000 n
0000027127 00000 n
0000027224 00000 n
0000027321 00000 n
0000027418 00000 n
0000027515 00000 n
0000027612 00000 n
0000027709 00000 n
0000027806 00000 n
0000027920 00000 n
0000028017 00000 n
0000028114 00000 n
0000028211 00000 n
0000028308 00000 n
0000028405 00000 n
0000028502 00000 n
0000028599 00000 n
0000028696 00000 n
0000028793 00000 n
0000028890 00000 n
0000029004 00000 n
0000029101 00000 n
0000029198 00000 n
0000029295 00000 n
0000029415 00000 n
0000029512 00000 n
0000029609 00000 n
0000029706 00000 n
0000029803 00000 n
0000029900 00000 n
0000030020 00000 n
0000030118 00000 n
0000030216 00000 n
0000030314 00000 n
0000030412 00000 n
0000030510 00000 n
0000030608 00000 n
0000030706 00000 n
0000030804 00000 n
0000030902 00000 n
0000031000 00000 n
0000031098 00000 n
0000031196 00000 n
0000031294 00000 n
0000031392 00000 n
0000031490 00000 n
0000031735 00000 n
0000032496 00000 n
0000032518 00000 n
0000032734 00000 n
0000032978 00000 n
0000033619 00000 n
0000033641 00000 n
0000033856 00000 n
0000033913 00000 n
0000033970 00000 n
0000034027 00000 n
0000034084 00000 n
0000034141 00000 n
0000034198 00000 n
0000034255 00000 n
0000034312 00000 n
0000034369 00000 n
0000034426 00000 n
0000034483 00000 n
0000034540 00000 n
0000034597 00000 n
0000034654 00000 n
0000034711 00000 n
0000034768 00000 n
0000034825 00000 n
0000034882 00000 n
0000034939 00000 n
0000034996 00000 n
0000035053 00000 n
0000035110 00000 n
0000035167 00000 n
0000035224 00000 n
0000035281 00000 n
0000035338 00000 n
0000035395 00000 n
0000035452 00000 n
0000035509 00000 n
0000035566 00000 n
0000035623 00000 n
0000035680 00000 n
0000035737 00000 n
0000035794 00000 n
0000035851 00000 n
0000035908 00000 n
0000035965 00000 n
0000036022 00000 n
0000036079 00000 n
0000036136 00000 n
0000036193 00000 n
0000036250 00000 n
0000036307 00000 n
0000036364 00000 n
0000052646 00000 n
0000052670 00000 n
0000063856 00000 n
0000005052 00000 n
0000005202 00000 n
0000005292 00000 n
0000005469 00000 n
0000005488 00000 n
0000005852 00000 n
0000006218 00000 n
0000006584 00000 n
0000006822 00000 n
0000006842 00000 n
0000006923 00000 n
0000007091 00000 n
0000007111 00000 n
0000007349 00000 n
0000007369 00000 n
0000007537 00000 n
0000007557 00000 n
0000007795 00000 n
0000007815 00000 n
0000008181 00000 n
0000008545 00000 n
0000008911 00000 n
0000009112 00000 n
0000009132 00000 n
0000009333 00000 n
0000009353 00000 n
0000009556 00000 n
0000009576 00000 n
0000009775 00000 n
0000009795 00000 n
0000009970 00000 n
0000010029 00000 n
0000010071 00000 n
0000014897 00000 n
0000014942 00000 n
0000015070 00000 n
0000015090 00000 n
0000016313 00000 n
0000016334 00000 n
0000017121 00000 n
0000017522 00000 n
0000017973 00000 n
0000019890 00000 n
0000020260 00000 n
0000022174 00000 n
0000022550 00000 n
0000022571 00000 n
0000022739 00000 n
0000022759 00000 n
0000023135 00000 n
0000023156 00000 n
0000023324 00000 n
0000023344 00000 n
0000023720 00000 n
0000023741 00000 n
0000023909 00000 n
0000023929 00000 n
0000024305 00000 n
0000024326 00000 n
0000024494 00000 n
0000024514 00000 n
0000024890 00000 n
0000024911 00000 n
0000025079 00000 n
0000025099 00000 n
0000025475 00000 n
0000025496 00000 n
0000025664 00000 n
0000025684 00000 n
0000025797 00000 n
0000025893 00000 n
0000026006 00000 n
0000026102 00000 n
0000026215 00000 n
0000026311 00000 n
0000026407 00000 n
0000026503 00000 n
0000026599 00000 n
0000026695 00000 n
0000026791 00000 n
0000026904 00000 n
0000027000 00000 n
0000027096 00000 n
0000027192 00000 n
0000027289 00000 n
0000027386 00000 n
0000027483 00000 n
0000027580 00000 n
0000027677 00000 n
0000027774 00000 n
0000027871 00000 n
0000027985 00000 n
0000028082 00000 n
0000028179 00000 n
0000028276 00000 n
0000028373 00000 n
0000028470 00000 n
0000028567 00000 n
0000028664 00000 n
0000028761 00000 n
0000028858 00000 n
0000028955 00000 n
0000029069 00000 n
0000029166 00000 n
0000029263 00000 n
0000029360 00000 n
0000029480 00000 n
0000029577 00000 n
0000029674 00000 n
0000029771 00000 n
0000029868 00000 n
0000029965 00000 n
0000030085 00000 n
0000030183 00000 n
0000030281 00000 n
0000030379 00000 n
0000030477 00000 n
0000030575 00000 n
0000030673 00000 n
0000030771 00000 n
0000030869 00000 n
0000030967 00000 n
0000031065 00000 n
0000031163 00000 n
0000031261 00000 n
0000031359 00000 n
0000031457 00000 n
0000031555 00000 n
0000031800 00000 n
0000032561 00000 n
0000032583 00000 n
0000032799 00000 n
0000033043 00000 n
0000033684 00000 n
0000033706 00000 n
0000033921 00000 n
0000033978 00000 n
0000034035 00000 n
0000034092 00000 n
0000034149 00000 n
0000034206 00000 n
0000034263 00000 n
0000034320 00000 n
0000034377 00000 n
0000034434 00000 n
0000034491 00000 n
0000034548 00000 n
0000034605 00000 n
0000034662 00000 n
0000034719 00000 n
0000034776 00000 n
0000034833 00000 n
0000034890 00000 n
0000034947 00000 n
0000035004 00000 n
0000035061 00000 n
0000035118 00000 n
0000035175 00000 n
0000035232 00000 n
0000035289 00000 n
0000035346 00000 n
0000035403 00000 n
0000035460 00000 n
0000035517 00000 n
0000035574 00000 n
0000035631 00000 n
0000035688 00000 n
0000035745 00000 n
0000035802 00000 n
0000035859 00000 n
0000035916 00000 n
0000035973 00000 n
0000036030 00000 n
0000036087 00000 n
0000036144 00000 n
0000036201 00000 n
0000036258 00000 n
0000036315 00000 n
0000036372 00000 n
0000036429 00000 n
0000052711 00000 n
0000052735 00000 n
0000063921 00000 n
trailer <<
/DocChecksum /CC322E136FE95DECF8BC297B1A9B2C2E
/Info 2 0 R
@ -3720,5 +3727,5 @@ trailer <<
/ID [<f8abc47bb1df544a0df9c15a75ef0046><31415926535897932384626433832795>]
>>
startxref
63880
63945
%%EOF

View File

@ -434,6 +434,13 @@ endobj
/Kids [
15 0 R
]
/MediaBox [
0
0
612
792
]
/Resources 3 0 R
/Type /Pages
>>
endobj
@ -3575,192 +3582,192 @@ xref
0000004108 00000 n
0000004579 00000 n
0000005119 00000 n
0000005193 00000 n
0000005343 00000 n
0000005433 00000 n
0000005600 00000 n
0000005620 00000 n
0000005984 00000 n
0000006350 00000 n
0000006716 00000 n
0000006884 00000 n
0000006904 00000 n
0000007142 00000 n
0000007162 00000 n
0000007243 00000 n
0000007411 00000 n
0000007431 00000 n
0000007669 00000 n
0000007689 00000 n
0000007857 00000 n
0000007877 00000 n
0000008115 00000 n
0000008135 00000 n
0000008501 00000 n
0000008865 00000 n
0000009231 00000 n
0000009400 00000 n
0000009420 00000 n
0000009621 00000 n
0000009641 00000 n
0000009842 00000 n
0000009862 00000 n
0000010065 00000 n
0000010085 00000 n
0000010284 00000 n
0000010327 00000 n
0000010386 00000 n
0000010428 00000 n
0000015254 00000 n
0000015299 00000 n
0000015427 00000 n
0000015447 00000 n
0000016670 00000 n
0000016691 00000 n
0000017481 00000 n
0000017882 00000 n
0000018333 00000 n
0000020250 00000 n
0000020620 00000 n
0000022534 00000 n
0000022910 00000 n
0000022931 00000 n
0000023099 00000 n
0000023119 00000 n
0000023495 00000 n
0000023516 00000 n
0000023684 00000 n
0000023704 00000 n
0000024080 00000 n
0000024101 00000 n
0000024269 00000 n
0000024289 00000 n
0000024665 00000 n
0000024686 00000 n
0000024854 00000 n
0000024874 00000 n
0000025250 00000 n
0000025271 00000 n
0000025439 00000 n
0000025459 00000 n
0000025835 00000 n
0000025856 00000 n
0000026024 00000 n
0000026044 00000 n
0000026157 00000 n
0000026253 00000 n
0000026366 00000 n
0000026462 00000 n
0000026575 00000 n
0000026671 00000 n
0000026767 00000 n
0000026863 00000 n
0000026959 00000 n
0000027055 00000 n
0000027151 00000 n
0000027264 00000 n
0000027361 00000 n
0000027458 00000 n
0000027555 00000 n
0000027652 00000 n
0000027749 00000 n
0000027846 00000 n
0000027943 00000 n
0000028040 00000 n
0000028137 00000 n
0000028234 00000 n
0000028348 00000 n
0000028445 00000 n
0000028542 00000 n
0000028639 00000 n
0000028736 00000 n
0000028833 00000 n
0000028930 00000 n
0000029027 00000 n
0000029124 00000 n
0000029221 00000 n
0000029318 00000 n
0000029432 00000 n
0000029529 00000 n
0000029626 00000 n
0000029723 00000 n
0000029843 00000 n
0000029940 00000 n
0000030037 00000 n
0000030134 00000 n
0000030231 00000 n
0000030328 00000 n
0000030448 00000 n
0000030546 00000 n
0000030644 00000 n
0000030742 00000 n
0000030840 00000 n
0000030938 00000 n
0000031036 00000 n
0000031134 00000 n
0000031232 00000 n
0000031330 00000 n
0000031428 00000 n
0000031526 00000 n
0000031624 00000 n
0000031722 00000 n
0000031820 00000 n
0000031918 00000 n
0000032163 00000 n
0000032924 00000 n
0000032946 00000 n
0000033162 00000 n
0000033406 00000 n
0000034047 00000 n
0000034069 00000 n
0000034284 00000 n
0000034341 00000 n
0000034398 00000 n
0000034455 00000 n
0000034512 00000 n
0000034569 00000 n
0000034626 00000 n
0000034683 00000 n
0000034740 00000 n
0000034797 00000 n
0000034854 00000 n
0000034911 00000 n
0000034968 00000 n
0000035025 00000 n
0000035082 00000 n
0000035139 00000 n
0000035196 00000 n
0000035253 00000 n
0000035310 00000 n
0000035367 00000 n
0000035424 00000 n
0000035481 00000 n
0000035538 00000 n
0000035595 00000 n
0000035652 00000 n
0000035709 00000 n
0000035766 00000 n
0000035823 00000 n
0000035880 00000 n
0000035937 00000 n
0000035994 00000 n
0000036051 00000 n
0000036108 00000 n
0000036165 00000 n
0000036222 00000 n
0000036279 00000 n
0000036336 00000 n
0000036393 00000 n
0000036450 00000 n
0000036507 00000 n
0000036564 00000 n
0000036621 00000 n
0000036678 00000 n
0000036735 00000 n
0000036792 00000 n
0000053074 00000 n
0000053098 00000 n
0000064284 00000 n
0000005258 00000 n
0000005408 00000 n
0000005498 00000 n
0000005665 00000 n
0000005685 00000 n
0000006049 00000 n
0000006415 00000 n
0000006781 00000 n
0000006949 00000 n
0000006969 00000 n
0000007207 00000 n
0000007227 00000 n
0000007308 00000 n
0000007476 00000 n
0000007496 00000 n
0000007734 00000 n
0000007754 00000 n
0000007922 00000 n
0000007942 00000 n
0000008180 00000 n
0000008200 00000 n
0000008566 00000 n
0000008930 00000 n
0000009296 00000 n
0000009465 00000 n
0000009485 00000 n
0000009686 00000 n
0000009706 00000 n
0000009907 00000 n
0000009927 00000 n
0000010130 00000 n
0000010150 00000 n
0000010349 00000 n
0000010392 00000 n
0000010451 00000 n
0000010493 00000 n
0000015319 00000 n
0000015364 00000 n
0000015492 00000 n
0000015512 00000 n
0000016735 00000 n
0000016756 00000 n
0000017546 00000 n
0000017947 00000 n
0000018398 00000 n
0000020315 00000 n
0000020685 00000 n
0000022599 00000 n
0000022975 00000 n
0000022996 00000 n
0000023164 00000 n
0000023184 00000 n
0000023560 00000 n
0000023581 00000 n
0000023749 00000 n
0000023769 00000 n
0000024145 00000 n
0000024166 00000 n
0000024334 00000 n
0000024354 00000 n
0000024730 00000 n
0000024751 00000 n
0000024919 00000 n
0000024939 00000 n
0000025315 00000 n
0000025336 00000 n
0000025504 00000 n
0000025524 00000 n
0000025900 00000 n
0000025921 00000 n
0000026089 00000 n
0000026109 00000 n
0000026222 00000 n
0000026318 00000 n
0000026431 00000 n
0000026527 00000 n
0000026640 00000 n
0000026736 00000 n
0000026832 00000 n
0000026928 00000 n
0000027024 00000 n
0000027120 00000 n
0000027216 00000 n
0000027329 00000 n
0000027426 00000 n
0000027523 00000 n
0000027620 00000 n
0000027717 00000 n
0000027814 00000 n
0000027911 00000 n
0000028008 00000 n
0000028105 00000 n
0000028202 00000 n
0000028299 00000 n
0000028413 00000 n
0000028510 00000 n
0000028607 00000 n
0000028704 00000 n
0000028801 00000 n
0000028898 00000 n
0000028995 00000 n
0000029092 00000 n
0000029189 00000 n
0000029286 00000 n
0000029383 00000 n
0000029497 00000 n
0000029594 00000 n
0000029691 00000 n
0000029788 00000 n
0000029908 00000 n
0000030005 00000 n
0000030102 00000 n
0000030199 00000 n
0000030296 00000 n
0000030393 00000 n
0000030513 00000 n
0000030611 00000 n
0000030709 00000 n
0000030807 00000 n
0000030905 00000 n
0000031003 00000 n
0000031101 00000 n
0000031199 00000 n
0000031297 00000 n
0000031395 00000 n
0000031493 00000 n
0000031591 00000 n
0000031689 00000 n
0000031787 00000 n
0000031885 00000 n
0000031983 00000 n
0000032228 00000 n
0000032989 00000 n
0000033011 00000 n
0000033227 00000 n
0000033471 00000 n
0000034112 00000 n
0000034134 00000 n
0000034349 00000 n
0000034406 00000 n
0000034463 00000 n
0000034520 00000 n
0000034577 00000 n
0000034634 00000 n
0000034691 00000 n
0000034748 00000 n
0000034805 00000 n
0000034862 00000 n
0000034919 00000 n
0000034976 00000 n
0000035033 00000 n
0000035090 00000 n
0000035147 00000 n
0000035204 00000 n
0000035261 00000 n
0000035318 00000 n
0000035375 00000 n
0000035432 00000 n
0000035489 00000 n
0000035546 00000 n
0000035603 00000 n
0000035660 00000 n
0000035717 00000 n
0000035774 00000 n
0000035831 00000 n
0000035888 00000 n
0000035945 00000 n
0000036002 00000 n
0000036059 00000 n
0000036116 00000 n
0000036173 00000 n
0000036230 00000 n
0000036287 00000 n
0000036344 00000 n
0000036401 00000 n
0000036458 00000 n
0000036515 00000 n
0000036572 00000 n
0000036629 00000 n
0000036686 00000 n
0000036743 00000 n
0000036800 00000 n
0000036857 00000 n
0000053139 00000 n
0000053163 00000 n
0000064349 00000 n
trailer <<
/DocChecksum /CC322E136FE95DECF8BC297B1A9B2C2E
/Info 2 0 R
@ -3769,5 +3776,5 @@ trailer <<
/ID [<f8abc47bb1df544a0df9c15a75ef0046><31415926535897932384626433832795>]
>>
startxref
64308
64373
%%EOF

View File

@ -24,7 +24,7 @@ endobj
2 0 obj
<<
/Type /ObjStm
/Length 16721
/Length 16787
/N 40
/First 359
>>
@ -49,26 +49,26 @@ stream
20 7733
21 8208
22 8514
23 8609
24 8867
25 9473
26 9704
27 11634
28 11868
29 12095
30 12227
31 12423
32 12619
33 12815
34 13011
35 13207
36 13403
37 13599
38 13795
39 13991
40 14187
41 14383
42 16298
23 8675
24 8933
25 9539
26 9770
27 11700
28 11934
29 12161
30 12293
31 12489
32 12685
33 12881
34 13077
35 13273
36 13469
37 13665
38 13861
39 14057
40 14253
41 14449
42 16364
%% Object stream: object 3, index 0
<<
/AP <<
@ -638,6 +638,13 @@ stream
/Kids [
45 0 R
]
/MediaBox [
0
0
595
842
]
/Resources 27 0 R
/Type /Pages
>>
%% Object stream: object 23, index 20
@ -2745,12 +2752,10 @@ endobj
>>
stream
ê 
    !"#$%&'B—P P@S2UpU„_ a<>cf;fOl/lCn,n?ÿcÿzIu°Úþ*
Þ
ó ˆ œ J ^
    !"#$%&'PbPStXXZZe e f}fh jj1lql…nnn<>ÿ¥ÿ¼·ò@l  5 Ê Þ Œ  
endstream
endobj
startxref
68702
68768
%%EOF

View File

@ -0,0 +1,140 @@
page 1: 3 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
13 0 R
page 2: 4 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
19 0 R
page 3: 5 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
23 0 R
page 4: 6 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
27 0 R
page 5: 7 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
31 0 R
page 6: 8 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
35 0 R
page 7: 9 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
39 0 R
page 8: 10 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
43 0 R
page 9: 11 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
47 0 R
page 10: 12 0 R
images:
/Im1: 17 0 R, 50 x 50
/Im10: 53 0 R, 50 x 50
/Im2: 21 0 R, 50 x 50
/Im3: 25 0 R, 50 x 50
/Im4: 29 0 R, 50 x 50
/Im5: 33 0 R, 50 x 50
/Im6: 37 0 R, 50 x 50
/Im7: 41 0 R, 50 x 50
/Im8: 45 0 R, 50 x 50
/Im9: 49 0 R, 50 x 50
content:
51 0 R