pdfium/testing/resources/jpeg_reduced_size.in
Nico Weber 5cebac774c Reland "Decode JPEGs at reduced size via libjpeg scale_denom"
This is a reland of commit 009b91d9d95d998fa7e8e09c55f716cb42d99546

Original change's description:
> Decode JPEGs at reduced size via libjpeg scale_denom
>
> JPEGs store image data in 8x8 DCT tiles in the frequency domain. To
> restore an 8x8 tile in the image domain, an IDCT is computed, using up
> to 64 coefficients.
>
> If a JPEG with large dimensions is drawn at small scale on screen,
> pdfium used to completely decompress the JPEG to large size, doing a
> full IDCT for each tile, and then scale it down at decode time.
>
> Using scale_denom, pdfium can instead decode the image at 1/8th (or
> 1/4th, 1/2th) its size (in each dimension) by not doing the full IDCT,
> but instead only taking the one DC term (for 1/8th), or 2x2 or 4x4
> coefficents (for 1/4th, 1/2th).
>
> This not just saves work decoding the image, it also outputs a smaller
> image that is faster to downsample when painting it. For most images,
> this shouldn't look perceptively different than downsampling from the
> large bitmap.
>
> This kind of matches what Blink does when decoding JPEGs [1], and
> morally matches what pdfium already does for JPEG2000s after
> https://pdfium-review.googlesource.com/c/pdfium/+/99970.
>
> (Note that CPDF_ImageRenderer::StartLoadDIBBase() in
> cpdf_imagerenderer.cpp passes in the page size as max_size_required,
> which cpdf_dib.cpp uses to compute resolution_levels_to_skip. So image
> decoding currently isn't limited to the size the image is drawn at, but
> by the size of the bitmap the whole page is drawn at. This can be be
> improved later.)
>
> Depending on what data the encoder writes in padding rows / columns for
> images that aren't a multiple of the MCU size, the code might produce
> artifacts in the last row or column. So only do this for images with
> sizes a multiple of the MCU for now, see also https://crbug.com/890745
> and the discussion on
> https://github.com/libjpeg-turbo/libjpeg-turbo/issues/297. This is
> unfortunate, but currently there's no way to do better without hacks.
> (This also matches what Blink does.)
>
> Timing (hyperfine, --render-repeats): a 3072x2304 4:4:4 image drawn onto
> a 64pt page decodes in 40ms at scale_denom 8 vs 84ms at full resolution.
>
> 1:
> https://source.chromium.org/chromium/chromium/src/+/main:third_party/blink/renderer/platform/image-decoders/jpeg/jpeg_image_decoder.cc;l=430
> ...but evidently this is much harder to hit now then when that code was
> initially added, probably because JPEGs in Chrome now go down the
> DecodeYUV path, which doesn't set scale_denom (yet?).
>
> Depends on new baseline in
> https://pdfium-review.googlesource.com/c/pdfium_tests/+/151570
> and updates DEPS to pick it up.
>
> Plumb the existing resolution_levels_to_skip (computed in
> CPDF_DIB::StartLoadDIBBase from the render device size) into the DCT
> path. CreateDCTDecoder maps it to a libjpeg scale_denom of 1/2/4/8
> (capped at 8, the largest power-of-two DCT scaling libjpeg supports) and
> passes it to JpegModule::CreateDecoder. JpegDecoder sets
> cinfo.scale_denom before jpeg_start_decompress and reports the
> scaled-down output dimensions (ceil(dim/scale_denom), matching
> jpeg_core_output_dimensions). The DIB then adopts the decoder's reduced
> dimensions, mirroring the JPX path. libjpeg performs the reduction
> cheaply inside the IDCT (e.g. 1/8 uses a 1x1 IDCT), so far fewer pixels
> are produced for images shown much smaller than native.
>
> The calls to SetWidth()/SetHeight() are a slight behavior change for all
> JPEG data for invalid files: Previously, the code used width/height from
> the PDF dict, now it gets the size from the decoder. These sizes are
> supposed to match, but if they aren't, pdfium now uses the other one.
> This is arguably better, as that size dictates how much data is actually
> present.
>
> Bug: 531782505
> Change-Id: I66409898d028685813b274e063aedf52200be0dd
> Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/151550
> Commit-Queue: Nico Weber <thakis@chromium.org>
> Reviewed-by: Lei Zhang <thestig@chromium.org>
> Reviewed-by: Nico Weber <thakis@google.com>

Bug: 531782505
Change-Id: I42c141839a21c77855b06caded3c79db2e53ed50
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/151930
Commit-Queue: Nico Weber <thakis@chromium.org>
Reviewed-by: Nico Weber <thakis@google.com>
Reviewed-by: Lei Zhang <thestig@chromium.org>
2026-07-13 14:54:20 -07:00

357 lines
24 KiB
Plaintext

{{header}}
{{object 1 0}} <<
/Type /Catalog
/Pages 2 0 R
>>
endobj
{{object 2 0}} <<
/Type /Pages
/Count 1
/Kids [3 0 R]
>>
endobj
{{object 3 0}} <<
/Type /Page
/Parent 2 0 R
/Contents 4 0 R
/MediaBox [0 0 400 400]
/Resources <<
/XObject <<
/Im0 5 0 R
>>
>>
>>
endobj
{{object 4 0}} <<
{{streamlen}}
>>
stream
q
400 0 0 400 0 0 cm
/Im0 Do
Q
endstream
endobj
{{object 5 0}} <<
/Type /XObject
/Subtype /Image
/Filter [/ASCIIHexDecode /DCTDecode]
/Width 400
/Height 400
/ColorSpace /DeviceRGB
/BitsPerComponent 8
{{streamlen}}
>>
stream
ffd8ffe000104a46494600010100000100010000ffdb00430005030404040305040404050505
06070c08070707070f0b0b090c110f1212110f111113161c1713141a1511111821181a1d1d1f
1f1f13172224221e241c1e1f1effdb0043010505050706070e08080e1e1411141e1e1e1e1e1e
1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e1e
1e1e1e1e1e1effc00011080190019003011100021101031101ffc4001f000001050101010101
0100000000000000000102030405060708090a0bffc400b51000020103030204030505040400
00017d01020300041105122131410613516107227114328191a1082342b1c11552d1f0243362
7282090a161718191a25262728292a3435363738393a434445464748494a535455565758595a
636465666768696a737475767778797a838485868788898a92939495969798999aa2a3a4a5a6
a7a8a9aab2b3b4b5b6b7b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae1e2e3e4e5e6e7
e8e9eaf1f2f3f4f5f6f7f8f9faffc4001f010003010101010101010101000000000000010203
0405060708090a0bffc400b51100020102040403040705040400010277000102031104052131
061241510761711322328108144291a1b1c109233352f0156272d10a162434e125f11718191a
262728292a35363738393a434445464748494a535455565758595a636465666768696a737475
767778797a82838485868788898a92939495969798999aa2a3a4a5a6a7a8a9aab2b3b4b5b6b7
b8b9bac2c3c4c5c6c7c8c9cad2d3d4d5d6d7d8d9dae2e3e4e5e6e7e8e9eaf2f3f4f5f6f7f8f9
faffda000c03010002110311003f00f8d42d0098f0b41a263c2d3344c785a65a63d5699a263c
2d06898e0b4cd131eab4cb4c785a0d131e1699a263c2d32d31e168344c785a66898f55a66898
f0b41a26382d32d31e1699a263c2d06898f0b4cb4c7aad3344c785a0d131e1699a263c2d05a6
3c2d3344c785a66898f0b41a263c2d3344c72ad32d31e1699a263c2d06898f55a65a63c2d334
4c785a0d131e1699a263c2d05a63c2d3344c7aad3344c785a0d131c1699a263d5699698f0b4c
d131e168344c785a65a63c2d3344c785a0d131e1699a263c2d05a6395699a263c2d3344c785a
0d133e760b5f3e7f21a63c2d06898f0b41a263c2d3344c785a65a63d5699a263c2d06898f0b4
cb4c7aad3344c785a0d131c1699a263c2d32d31e168344c785a66898f0b4cd131e1699a263c2
d05a6395699a2648168344c705a65a63d5699a263c2d06898f0b4cd131e1682d31e1699a263c
2d3344c785a0d131e1699a263d5699698f0b4cd131c168344c7aad32d31e1699a263c2d06898
f0b4cd131e1682d31e1699a263d5699a263c2d06898e0b4cd131e1699698f0b4cd131e168344
c7aad32d31e1699a263c2d06898f55a66898f0b41698f0b4cd131eab4cd133e750b5f3c7f21a
63c2d06898f0b4cd131e168344c785a66898f0b4cb4c785a66898f0b41a263c2d32d31e1699a
263c2d06898f0b4cd131eab41698e0b4cd131e1699a263c2d06898f0b546898f0b41698f0b4c
d131e168344c785a65a6382d3344c902d06898e0b4cd131e1682d31e1699a263c2d3344c7aad
06898f0b4cd131eab4cb4c785a66898f0b41a263c2d32d31e1699a26382d06898f0b4cd131e1
682d31e1699a263d5699a263c2d06898f0b4cd131c1699699205a66898e0b41a263c2d32d31e
1699a263c2d06898f55a66898f0b4cb4c785a0d133e760b5f3c7f22263c2d32d31e168344c70
5a66898f0b4cd131e168344c785a65a63d5699a263c2d06898f0b4cd131e1699698f0b41a263
c2d3344c785a65a6382d06898f0b4cd131eab4cd131e1699a263c2d05a63d5699a263c2d0689
8f0b4cb4c785a66a98f0b41698e0b4cd131e1682d31e1699a263d5699a263c2d3344c785a0d1
31e1699698f0b4cd131e168344c785a65a63c2d3344c705a0d131eab4cd131e1682d31e1699a
263d5699a263c2d06898f0b4cd131e1699698f0b4cd131c168344c785a65a63c2d3344c785a0
d131e1699a263c2d32d33e7655af9d3f91131e1699a263c2d32d31e1699a263c2d06898e0b41
a26481699a26382d32d31eab4cd131e168344c785a66898f55a65a63c2d06898f0b4cd131e16
99698f0b4cd131c168344c7aad3344c785a66898f0b41698f0b4cd131e168344c785a65a63d5
699a263c2d06898f0b4cd131eab41698e0b4cd131e1699a263c2d3344c785a0d131e1699698f
0b4cd131e168344c7aad32d31e1699a263c2d06898f55a66898e0b41698f0b4cd131e1699a26
3c2d06898f0b4cd131eab4cb4c785a66898f0b41a263d5699698f0b4cd131c168344c7aad334
4cf9d82d7cf1fc8698f55a0d131e1699a263c2d32d31e1699a263c2d06898f0b41a263c2d334
4c705a65a63d5699a263c2d06898f0b4cd131eab4cb4c785a0d131e1699a263c2d05a63c2d51
a263c2d06898e55a66899205a66898e0b41698f0b4cd131e168344c785a65a63d5699a263c2d
06898f0b4cd131eab41698f0b4cd131c1699a2648168344c705a66898f0b4cb4c785a66898f0
b41a263d5699698f0b4cd131e168344c7aad3344c785a0b4c705a66898f55a66898f0b41a263
c2d3344c785a65a63c2d3344c785a0d131eab4cb4c785a66898e0b41a267cee16be78fe434c7
05a66898f0b41a263c2d3344c785a65a63c2d06898f0b4cd131eab4cd131e168344c785a65a6
3c2d3344c785a0d131c1699a263c2d32d31e168344c785a66898f0b4cb4c785a0d131e1699a2
63d5699a263c2d06898e0b4cb4c785a66898f0b41a263c2d32d31e1699a263c2d06898f0b4cd
131e1682d31e1699a263c2d3344c785a0d131e1699a26382d32d31e1699a263c2d06898f0b4c
b4c785a66898f0b41a263c2d3344c785a0d131e1699698f55a66898f0b41a26382d3344c785a
65a63c2d3344c785a0d131e1699698f0b4cd133e760b5f3a7f22263c2d3344c705a65a63c2d0
6898f0b4cd131e1699698f0b4cd131e168344c7aad3344c785a0d131e1699698f55a66898f0b
41a26382d3344c785a65a63c2d06898f0b4cd131eab4cb4c785a0d131e1699a263c2d3344c78
5a0d131e1699698e55a66898f0b41a263c2d3344c785a65a63c2d06898f0b4cd131e1699698f
0b41a263c2d3344c785a66898f0b41a26382d32d31e1699a263c2d06898f55a65a63c2d3344c
785a0d131e1699a263c2d06898f0b4cb4c7aad3344c785a0d131c1699a263d5699698f0b4cd1
31e168344c7aad32d33e760b5f3c7f22263c2d06898f0b4cd131e1699698f0b41a263c2d3344
c705a65a63d5699a263c2d06898f55a0d131e17da99a263c2d32d31e1699a263c2d06898f0be
d4cd131eab4cb4c785a0d131c1699a263c2d32d31e17da99a263c2fb506898f0b4cd131e1699
a263c2fb505a63c2d3344c785f6a0d131c1699a263d5699698f0bed41a263c2d3344c7aad32d
31e168344c785a66898f0b4cd131e168344c7aad32d31e1699a26382d06898f55a65a63c2d33
44c785f6a0d131e1699a263c2fb506898f0b4cb4c785a66898f0bed41a263c2fb53344c72ad3
2d31e1699a263c2d06899f3b05af9e3f90d31e1699a263c2d06898f0b4cb4c785a66898f0b41
a263c2d3344c705a65a63d568344c785a66898f0b4cd131e168344c785a65a63c2d3344c785a
0d131e1699a263d5699698f0b41a263c2d3344c7aad32d31c168344c785a66898f55a66898f0
b4cb4c785a0d131e1699a263c2d06898f0b4cb4c72ad3344c902d06898e0b4cd131e1699698f
0b41a263c2d3344c785a0d131e1699a263c2d32d31e1699a263c2d06898f0b4cb4c785a66898
e0b41a263c2d3344c785a0b4c785a66898f0b4cd131e168344c785a66898e0b4cb4c902d3344
cf9d42d7cf1fc8898f0b41698f0b4cd131e168344c785a65a63c2d3344c7aad06898f0b4cd13
1e1699698f0b4cd131e168344c705a0d13240b4cd131c1699698f55a66898f0b41a263c2d334
4c7aad32d31e168344c785a66898f0b4cb4c785a0d131c1699a263d5699a263c2d06898f0b4c
b4c785a66898f0b41a263c2d32d31eab4cd131e168344c785a66898f0b41698e0b4cd131e169
9a263c2d06898f0b4cd131eab4cb4c785a66898f0b41a263d5699698f0b4cd131e168344c785
a66898e0b41698f0b4cd131eab4cd131e168344c785a66898f55a65a67cec16be74fe444c785
a66898f0b4cb4c705a66898f55a0d131e1699698f0b4cd131eab41a263c2d3344c785a65a63c
2d3344c785a0d131e168344c785a66898e0b4cb4c7aad3344c785a0d131e1699698f55a66898
f0b41a263c2d3344c785a65a63c2d06898f0b4cd131c1699a26481699a26382d05a63d5699a2
63c2d06898f0b4cb4c7aad3344c785a0d131e1699a263c2d05a63c2d3344c705a66899205a0d
131c1699a263d5699698f0b4cd131e168344c7aad32d31e1699a263c2d06898f0b4cd131e168
2d31c1699a263d5699a263c2d06898f0b4cd133e760b5f3c7f21a63c2d3344c785a0d131e169
9698f0b4cd131c168344c902d32d31c1699a263d568344c785a66898f0b4cb4c785a0d131e16
99a263c2d06898f0b4cd131e1699698f0b4cd131e168344c705a65a63c2d3344c785a0d131e1
699a263d5682d31e1699a263c2d3344c785a0d131e16a8d131c1682d31e1699a263c2d06898f
0b4cb4c785a66898f0b41a263c2d3344c785a0b4c785a66898f0b4cd131eab41a26382d3344c
7aad32d31e1699a263c2d06898f0b4cb4c785a66898f0b41a263c2d3344c785a0b4c785a6689
8f55a66898f0b41a267cea16be78fe434c785a66898f0b4cd131e168344c785a65a63c2d3344
c785a0d131e1699698e0b4cd131e168344c785a66898f0b4cb4c785a0d131e1699a263c2d334
4c785a0d131e1699698f55a66898f0b41a26382d3344c785a65a63c2d06898f0b4cd131e1699
698f0b41a263c2d3344c7aad3344c785a66898e0b41698f55a66898f0b41a263c2d32d31e169
9aa63c2d05a63c2d3344c785a0b4c785a66898f55a66898f0b4cd131e168344c705a65a63c2d
3344c785a0d131e1699698f0b4cd131e168344c7aad3344c785a0b4c785a66898f55a66899f3
a85af9d3f9113240b4cb4c705a66898f0b41a263c2d3344c785a65a63c2d3344c7aad06898f0
b4cb4c785a66898f55a0d131c1699a263c2d32d31e1699a263c2d06898f0b41a263c2d3344c7
85a65a63d5699a263c2d06898f0b4cd131eab4cb4c785a0d131c1699a263c2d32d31e1699a26
3c2d06898f55a66898f0b4cd131e1682d31e1699a263c2d06898e0b4cb4c7aad3344c785a0d1
31e1699a263d5682d31e1699a263c2d3344c785a66898f0b41a263c2d32d31e1699a26382d06
898f55a65a63c2d3344c785a0d131eab4cd131e1682d31e1699a267cec16be78fe444c785a66
898f55a0b4c785a66898e0b4cd131e168344c785a65a63c2d3344c7aad06898f0b4cb4c785a6
6898f55a0d131e1699a26382d32d3240b4cd131c168344c785a0d131e1699a263c2d32d31eab
4cd131e168344c785a66898f55a65a63c2d06898f0b4cd131e1682d31c16a8d131e168344c7a
ad3344c785a66898f0b41698f0b4cd131e168344c785a65a63d5699a26382d06898f0b4cd131
eab41698f0b4cd131e1699a263c2d06898f0b4cd131e1699698f0b4cd131e168344c7aad32d3
1e1699a26382d06898f55a66898f0b41699f3b05af9e3f91131e1699a263c2d06898f55a65a6
3c2d3344c785a66898e0b41a263c2d32d31e1699a263d568344c785a65a63c2d3344c785a0d1
31e1699a263c2d32d31e168344c785a66898e55a66898f0b41a263c2d32d31e1699a263c2d06
898f0b4cd131e1699698f0b41a263c2d3344c785a65a63c2d06898e0b4cd131eab4cd131e168
344c785a65a63c2d3344c785a0d131e1699698f0b4cd131e168344c705a66898f0b41698f0b4
cd131e1699a263c2d06898f0b4cd131e1699698f0b4cd131e168344c785a65a63c2d3344c785
a0d131e1699a267cea16be78fe434c785a0d131e1699a263c2d06898f0b4cb4c785a66898f0b
4cd131cab41a263c2d32d31e1699a263c2d06898f0b4cd131e1699698f0b41a263c2d3344c78
5a65a63c2d3344c785a0d131cab4cd13240b41a26382d32d31eab4cd131e168344c785a66898
f0b4cb4c785a0d131e1699a263d5699698f0b41a26382d3344c785a66898f0b41a263c2d32d3
1eab4cd131e168344c785a66898f0b4cb4c785a0d131e1699a263c2d32d31c168344c785a668
98f0b4cd131e168344c785a65a63c2d3344c785a0d131eab4cb4c785a66898f0b41a267cec16
be78fe444c705f6a65a63d568344c785f6a66898f0b4cb4c785a0d131e17da99a263c2fb5334
4c785a0d131e1699698e0b4cd131e168344c785a66898f0b4cb4c785a0d131e1699a263c2d32
d31eab4cd131e168344c7aad06898f0bed4cd131e1699698e0b4cd131e168344c785f6a66898
f55a65a63c2d06898f0b4cd131e1699698f0bed4cd131e17da8344c705a66899205a66898e0b
ed41698f0b4cd131e17da8344c785a66898f55a65a63c2fb506898f0b4cd131eab4cb4c785a0
d131c1699a26481699a26382d06898f55a65a63c2d3344c785a0d131eab4cb4c785a66899f3b
05af9d3f91131e1699a263c2d32d31e168344c785a66898e0b4cb4c7aad06898f0b4cd131e16
99a263c2d06898f0b4cb4c785a66898f0b41a263c2d32d31c1699a263c2d06898f0b4cd131e1
699698f55a0d131e1699a263c2d3344c785a0d131e1699698f0b4cd131e168344c705a66898f
55a65a63c2d06898f0b4cd131eab4cb4c785a0d131e1699a263d5699a263c2d32d31c168344c
785a66898f0b41a263c2d32d31eab4cd131e168344c785a66898f0b4cb4c785a0d131e1699a2
63c2d06898f0b4cd131c1699698f0b4cd131e168344c785a65a67cec16be78fe444c7aad0689
8f0b4cd131e1699698f0b41a263c2d3344c705a0b4c7aad3344c785a66898f0b41a263c2d51a
263c2d05a63c2d3344c785a0d131e1699698f0b4cd131eab41a26382d3344c785a65a63c2d33
44c785a0d131e168344c785a66898f0b4cb4c7aad3344c785a0d131e1699a263d5699698f0b4
1a26382d3344c785a65a63c2d06898f0b4cd131eab4cd131e168344c785a65a63c2d3344c785
a0d131c1699698f55a66898f0b41a263c2d3344c785a0b4c785a66898f0b4cd131e168344c78
5a66898f55a65a63c2d3344c705a0d133e760b5f3c7f21a63c2d3344c7aad06898f0b4cd131e
1699698f0b41a263c2d3344c785a0b4c7aad3344c785a66898e0b41a263c2d3344c785a65a63
c2d3344c7aad06898f0b4cb4c785a66898f55a0d131e1699a26382d32d3240b4cd131c168344
c785a0d131e1699a263c2d32d31eab4cd131e168344c785a65a63d5699a263c2d06898e0b4cd
13240b4cb4c705a0d131e1699a263c2d3344c785a66898f0b41698f55a66898f0b41a263c2d3
2d31eab4cd131e168344c705a66898f0b41698f0b4cd131e1699a263c2d06898f0b4cd131eab
4cb4c785a66899f3b05af9d3f91131e1699698e0b4cd131e168344c785a66898f0b4cb4c7aad
06898f0b4cd131e1699698f55a0d131e1699a263c2d3344c705a0d131e1699698f0b4cd131e1
68344c785a65a63c2d3344c7aad06898f0b4cd131e1699698f0b41a263c2d3344c705a0d131e
1699a263c2d32d31e1699a263c2d06898f0b4cb4c785a66898f0b41a263c2d3344c7aad05a63
c2d3344c705a66898f0b41a263c2d51a263c2d05a63c2d3344c785a0d131e1699698f0b4cd13
1e168344c705a66898f0b41698f0b4cd131e1699a263d568344c785a66898f55a65a67cec16b
e78fe444c785a66898f0b41698e0b4cd131e168344c785a66898f0b4cb4c7aad06898f0b4cd1
31e1682d31e1699a263c2d3344c785a66898e0b41a263c2d32d31e1699a263c2d06898f0b4cb
4c785a66898f0b41a263c2d3344c785a65a63c2d06898f0b4cd131e1699a263c2d06898e0b4c
b4c7aad3344c785a0d131e1699a263c2d32d31e168344c785a66898f0b4cb4c785a0d131c169
9a263d5699a263c2d3344c785a0b4c7aad3344c785a0d131e1699698f0b4cd531e1682d31e16
99a263c2d05a6382d3344c7aad3344c785a66898f0b41a267cec16be78fe434c785a66898f0b
4cd131e1682d31e1699a263d568344c785a66898e0b4cb4c7aad06898f0b4cd131e168344c78
5a65a63c2d3344c785a0d131e1699a263c2d32d31c1699a263d568344c785a65a63c2d3344c7
aad06898f0b4cd131e1699698f0b4cd131e168344c785a0d131e1699a26382d32d31eab4cd13
1e168344c785a66898f55a65a63c2d06898f0b4cd131e1699698f0b4cd131e168344c72ad334
4c902d3344c705a0b4c785a66898f0b41a263c2d32d31eab4cd131e168344c785a66898f55a0
b4c785a66898e0b4cd13240b4cd133e750b5f3a7f21a63c2d3344c785a66898f0b41a263c2d3
2d31e1699a263d568344c785a65a63c2d3344c7aad06898f0b4cd131c1699a263d5682d31e16
99a263c2d3344c785a0d131e1699698f0b4cd131eab41a263c2d32d31c1699a263d568344c78
5a66898f0b4cb4c785a66898f0b41a263c2d06898f0b4cd131e1699698f55a66898f0b41a263
82d3344c7aad32d31e168344c785a66898f0b41698f0b546898f0b41a263d5699a263c2d3344
c705a0b4c785a66898f0b41a263c2d32d31eab4cd131e168344c785a66898f55a0b4c785a668
98f0b4cd133e760b5f3c7f21a63c2d06898f55a66898e0b4cd131e168344c785a65a63c2d334
4c785a0d131e1699698f0b4cd131e168344c785a66898e0b41a263d5699698f0b4cd131e1699
a263c2d06898f0b4cb4c785a66898f55a0d131e1699698f0b4cd131e168344c705a66898f0b4
cb4c785a0d131e1699a263d5699a263c2d06898f0b4cb4c785a66898f0b41a263c2d3344c785
a65a63c2d06898e0b4cd131e1699698f0b41a263c2d3344c7aad3344c785a0d131e1699698f0
b4cd131e168344c705a65a63c2d3344c785a0d131e1699a263c2d05a63c2d3344cf9d82d7cf1
fc8898f0b4cb4c785a0d131e1699a26382d3344c785a0d131e1699698f0b4cd131eab41a263c
2d3344c785a65a63c2d06898f0b4cd131c168344c902d32d31c1699a263c2d3344c7aad06898
f0b4cb4c785a66898f0b41a263c2d3344c785a65a63c2d06898f0b4cd131c1699698f0b4cd13
1e168344c7aad3344c785a0d131e1699698f55a66898f0b41a263c2d3344c785a65a63c2d068
98e0b4cd131eab4cb4c785a0d131e1699a263c2d3344c785a0d131e1699698f55a66898f0b41
a26382d3344c785a65a63c2d06898f0b4cd131e1699699f3b05f6af9d3f91131e1699a263c2f
b532d31e168344c785a66898f0bed4cd131cab41a263c2d32d31e1699a263d568344c785a668
98f0bed4cb4c7aad06898f0bed4cd131e1699698f0b41a263c2fb53344c705f6a66898f0b41a
263c2d32d31e1699a263c2d06898f0b4cd131e1699698f0b41a263c2d3344c785a65a63d5699
a26382d06898f55a0d131e17da99a263c2d32d31e1699a263c2d06898f0bed4cd131eab4cb4c
785a0d131e1699a263c2d32d31c17da99a263c2fb506898f0b4cd131e1699a263c2fb505a63c
2d3344c785f6a0d131e1699a263d5699698f0bed41a26382d3344cf9d82d7cf1fc8698f0b41a
263c2d3344c785a65a63c2d3344c785a0d131e1699a263c2d3344c785a0b4c705a66898f0b41
a263c2d3344c785a65a63c2d06898f0b4cd131e1699698f55a0d131e1699a263c2d3344c705a
0d131e1699698f0b4cd131e168344c785a65a63c2d3344c785a0d131e1699a263c2d32d31eab
41a263c2d3344c785a66898f0b41a26382d32d31e1699a263c2d06898f0b4cd131eab4cb4c78
5a0d131e1699a263d5699698f0b41a26382d3344c7aad3344c785a65a63c2d06898f0b4cd131
e168344c785a65a63d5699a263c2d06899f3b2ad7cf1fc8898f0b4cb4c705a0d131e1699a263
c2d05a63c2d51a263c2d06898f0b4cd131eab4cd131e1682d31e1699a263d568344c785a6689
8e0b4cb4c785a0d131e1699a263c2d05a63d5699a263c2d3344c785a0d131e16a8d131e1682d
31c1699a263c2d06898f0b4cb4c785a66898f55a0d131e1699a263c2d32d31e1699a263c2d06
898f0b41a263c2d3344c705a65a63d5699a263c2d06898f0b4cd131eab4cb4c785a0d131e169
9a263c2d32d31e168344c785a66898e55a66899205a0d131c1699698f0b4cd131e168344c785
a65a63d5699a267cec16be74fe444c7aad3344c785a65a6382d06899205a66898e0b4cb4c785
a0d131e1699a263c2d3344c7aad3344c785a0b4c785a66898f55a0d131e1699a263c2d32d31e
168344c785a66898e0b41698f55a66898f0b4cd131e168344c785a66898f0b4cb4c785a66898
f55a0d131e1699698e0b4cd131eab41a263c2d3344c785a65a63c2d3344c785a0d131e168344
c785a66898f0b4cb4c7aad3344c785a0d131c1699698f55a66898f0b41a263c2d3344c785a65
a63c2d06898f0b4cd131e1699a263c2d3344c705a0b4c7aad3344c785a0d131e1699699f3b05
af9e3f91131e168344c785a66898f0b4cb4c785a0d131e1699a263c2d32d31cab4cd131e1683
44c785a66898f0b41a263c2d32d31e1699a263c2d06898f0b4cd131e1699698f55a0d131e169
9a26382d32d32455a0d131c1699a263c2d3344c785a0d131e1699698f0b4cd131e168344c785
a65a63c2d3344c7aad06898e0b4cd131e1699698f0b41a263c2d3344c785a0d131e1699a263c
2d32d31e1699a263c2d06898f0b4cb4c785a66898f0b41a26382d3344c7aad05a63c2d3344c7
85a66898f0b41a263c2d51a263c2d05a6382d3344c902d06899f3a85af9e3f90d31e1699a263
c2d06898f0b4cd131e1699698f0b41a263d5699a263c2d32d31e1699a263c2d06898e0b4cd13
1e1699a263c2d05a63c2d3344c785a0d131e1699a263c2d32d31eab41a263c2d3344c705a0b4
c902d3344c705a66898f0b4cd131e168344c785a65a63c2d3344c785a0d131e1699698f0b4cd
131e168344c785a66898e0b4cb4c785a0d131e1699a263c2d3344c785a0d131e1699698f55a6
6898f0b41a263c2d3344c785a65a63c2d06898e0b4cd131e1699698f0b41a263c2d3344c7aad
3344c785a66898f0b41698f55a66899f3a85af9e3f91131e1682d3240b4cd131c168344c7aad
3344c785a65a63c2d06898f55a66898f0b4cb4c785a0d131e1699a263c2d3344c705a6689920
5a0b4c705a66898f55a0d131e1699a263c2d32d31eab41a263c2d3344c785a0d131e1699698f
0b4cd131c168344c785a66898f0b4cb4c785a66898f55a0d131e1699698f0b4cd131eab41a26
3c2d3344c705a65a6481699a26382d06898f0b41a263c2d3344c785a65a63d5699a263c2d068
98f0b4cd131eab4cb4c785a0d131c1699a26481699698f0b4cd131c168344c7aad3344c785a6
6898f0b41699f3b05af9e3f91131e1699a263c2d05a63c2d3344c705a0d131eab4cd131e1699
698f0b41a263d5699a263c2d32d31e168344c785a66898f0b4cd131e168344c785a65a63c2d3
344c72ad06898f0b4cb4c785a66898f55a0d131e1699a263c2d3344c7aad05a63c2d3344c785
a66898e0b41a26481699698e0b4cd131eab41a263c2d32d31e1699a263d568344c785a66898f
0b4cb4c785a66898f0b41a26382d06899205a66898e0b4cb4c7aad3344c785a0d131e1699a26
3d5699698f0b41a263c2d3344c785a0b4c785aa344c705a0d131eab4cd131e1699a267cec16b
e74fe434c785a66898f0b4cd131e1682d31e1699a263c2d06898f0b4cd131e1699698e0b41a2
63c2d3344c785a65a63c2d06898f55a66898f0b4cd131e168344c785a65a63c2d3344c785a0d
131e1699698e0b4cd131e168344c785a66898f0b41a263d5699698f0b4cd131e1699a263c2d0
6898f0b4cb4c705a66898f55a0d131e1699698f0b4cd131e168344c785a66898f0b4cb4c785a
0d131e1699a263d5699a263c2d06898e0b4cb4c785a66898f0b41a263c2d3344c785a65a63c2
d06898f0b4cd131e1699698f0b41a263c2d3344c72ad3344cf9d82d7cf1fc8698f0b41a263c2
d3344c785a65a63c2d06898f0b4cd131e168344c7aad3344c785a65a6382d06898f0b4cd131e
1699698f0b41a263c2d3344c785a66898f0b41a263c2d32d31e1699a263d568344c785a66898
e0b4cb4c902d06898e0b4cd131e168344c785a65a63c2d3344c785a66898f55a0d131e169969
8e0b4cd131e168344c785a66898f0b4cb4c785a0d131e1699a263c2d32d31e1699a263c2d068
98f55a66898f0b41a263c2d32d31eab4cd131e168344c705a66898f0b4cb4c785a0d131e1699
a263d5699698f0b41a263c2d3344cf9d82fb57cf1fc8698e0b4cd131eab41a263c2d3344c785
a65a63d568344c785a66898f0b41a263d5699a263c2d32d31e17da8344c785a66898f0bed4cb
4c705a0d131e1699a263c2fb53344c7aad06898f0b4cb4c785a66898f55a0d131e1699a263c2
fb532d31eab41a263c2fb53344c705a65a63c2d06898f0bed4cd131e17da99a263c2d06898f0
b4cb4c785a66898f0b41a263c2d3344c705a65a63c2d06898f0b4cd131e1699698f55a66898f
0b41a263d568344c785f6a66898f0b4cb4c785a66898f0b41a26382fb53344c7aad32d31e168
344c785a66898f0b4cb4c785f6a66899f3b05af9d3f91131e1699698f0b4cd131eab41a263c2
d3344c705a65a63c2d06898f0b4cd131e168344c785a66898f0b4cb4c785a0d131e1699a263c
2d32d31e1699a263c2d06898e0b4cd131e1699a263c2d05a63c2d3344c785a0d131e1699a263
c2d32d31e168344c785a66898e0b4cb4c91568344c705a66898f0b4cd131e168344c785a65a6
3c2d3344c785a0d131e1699698f0b4cd131e168344c785a66898e0b4cb4c7aad06898f0b4cd1
31e1699a263c2d06898f0b4cb4c785a66898f0b41a263c2d3344c7aad32d31e168344c705a66
898f55a65a67cec16be74fe444c785a66898f0b4cb4c785a66898f55a0d131e1699a263c2d33
44c72ad05a63c2d3344c785a0d131eab4cd131e1699698f0b41a263c2d3344c785a0b4c785aa
344c785a0d131e1699a26395699a26481682d31c1699a263d568344c785a66898f0b4cb4c785
a0d131e1699a263c2d05a63d5699a263c2d3344c705a0d131e16a8d131e1682d31e1699a263c
2d06898f0b4cb4c785a66898f55a0d131e1699a26382d32d3240b4cd131c168344c785a0d131
e1699a263c2d32d31eab4cd131e168344c785a66898f55a65a63c2d06898f0b4cd133e760b5f
3c7f21a6382d06898f55a66898f0b4cb4c785a66898f0b41a263c2d3344c785a65a63d568344
c785a66898e0b41a263d5699a263c2d32d31e168344c785a66898f0b4cb4c785a0d131e1699a
263c2d3344c7aad3344c785a0b4c785a66898e55a0d131e1699a263c2d32d31e168344c785a6
6898f0b41698f55a66898f0b4cd131e168344c705a66899205a65a6382d3344c7aad06898f0b
4cb4c785a66898f55a0d131e1699a263c2d32d31e1699a263c2d06898e0b41a26481699a2638
2d32d31eab4cd131e168344c785a65a63d5699a263c2d06899f3b05af9e3f91131e1699698f0
b41a263c2d3344c705a65a63c2d3344c7aad06898f0b4cd131e1699698f55a0d131e1699a263
c2d06898f0b4cd131e1699698e0b41a263c2d3344c785a65a63d5699a263c2d06898f0b4cd13
1e168344c785a65a63c2d3344c785a0d131e1699a26382d32d31eab41a263c2d3344c785a65a
63d568344c785a66898f0b4cd131e168344c785a65a6382d3344c785a0d131e1699698f0b4cd
131eab41a263c2d3344c785a65a63c2d06898f0b4cd131e168344c785a66898e0b4cb4c785a6
6898f0b41a263c2d32d31e1699a267cec16be74fe444c785a66898f0b4cb4c785a0d131e1699
a263c2d32d31c1699a263d568344c785a66898f0b4cd131e1682d31e1699a263c2d06898f0b4
cd131e1699698e0b41a263d5699a263c2d32d31e1699a263c2d06898f0b4cd131e1699a263c2
d05a63c2d3344c785a0d131e1699a26382d32d32455a0d131c1699a263c2d05a63c2d3344c78
5a66898f0b4cd131e168344c785a65a6382d3344c785a0d131e1699698f0b4cd131e168344c7
85a66898f0b4cb4c785a0d131e1699a263c2d3344c785a0d131e1699698e55a66898f0b41a26
3c2d3344cf9d82d7cf1fc8698f0b41a263d5699a263c2d32d31e168344c785a66898f0b4cb4c
705a66898f55a0d131e1699a263c2d3344c785a0b4c785a66898f0b41a263d5699a263c2d32d
31e168344c7aad3344c705a65a63c2d06898f0b4cd131e1699a263c2d3344c785a0b4c785a66
898f55a0d131e1699a263c2d32d31eab41a263c2d3344c705a0d131e1699698f0b4cd131e168
344c785a66898f0b4cb4c785a66898f55a0d131e1699698e0b4cd131eab41a263c2d3344c785
a65a63c2d3344c785a0d131e168344c785a66898f0b4cb4c7aad3344c785a0d133e750b5f3c7
f21a6481699a26382d06898f0b4cd131e1699698f0b41a263d5699a263c2d32d31e1699a263d
568344c785a66898e0b4cd131e1682d31e1699a263c2d06898f55a66898f0b4cb4c785a0d131
eab4cd131e1699698e0b41a26481699a26382d3344c785a0d131e1699698f0b4cd131eab41a2
63c2d32d31e1699a263d568344c785a66898e0b4cd132455a0b4c705a66898f0b4cd131e1683
44c785a65a63c2d3344c7aad06898f0b4cb4c785a66898f55a0d131e1699a26382d32d31e169
9a263c2d06898f0b41a263c2d3344c785a65a63d5699a267cec16be74fe444c785a65a63c2d3
344c705a0d131e1699a263c2d32d31e168344c785a66898f0b4cb4c785a66898f0b41a263c2d
3344c785a66898e0b41698f0b4cd131e168344c785a66898f0b4cb4c785a0d131e1699a263c2
d32d31e168344c7aad3344c785a66898f0b41a26382d32d31e1699a263c2d06898f0b4cb4c78
5a66898f0b41a263c2d3344c785a0d131eab4cb4c785a66898e0b4cd131e168344c785a65a63
c2d3344c7aad06898f0b4cb4c785a66898f0b41a263c2d3344c785a65a6382d06898f0b4cd13
1eab4cd131e168344c785a65a67cec16be78fe444c785a0d131eab4cb4c785a66898e0b41a26
481699a26382d32d31e168344c785a66898f0b4cb4c785a66898f0b41a263c2d3344c785a65a
63c2d06898e0b4cd131e168344c7aad3344c785a65a63c2d06898f0b4cd131e1699698f0b41a
263c2d3344c785a66898f0b41a263c2d32d31c1699a263d568344c785a66898f0b4cb4c785a0
d131e1699a263c2d06898f0b4cb4c785a66898e0b4cd131eab41a263c2d32d31e1699a263c2d
06898f0b4cd131e1699698f0b41a263c2d3344c785a65a63c2d3344c705a0d131eab4cd131e1
68344cf9d82d7cf1fc8698f0b4cd131e1699a263c2d05a63c2d3344c785f6a0d131eab4cd131
e1699698e0b41a263d5699a263c2fb532d31e1699a263d568344c785a66898f0b4cb4c7aad06
898f0b4cd131c168344c7aad3344c785a65a63c2fb506898f0b4cd131e17da99698f0b41a263
c2d3344c785f6a66898f55a0d131e1699698f0b4cd131cab41a263c2d3344c785f6a65a63d56
8344c785f6a66898f0b4cb4c785a0d131e17da99a263c2fb53344c705a0d13240b4cb4c705a6
6898f0b41a263c2d3344c785a65a63c2d06898f0b4cd131e1699698f55a66898f0b41a263956
8344cf9d82d7cf9fc8698f0b41a263d5699a263c2d06898f0b4cb4c785a66898f0b41a263d56
99a263c2d32d31e168344c785a66898f0b4cb4c705a66898f55a0d131e1699a263c2d32d31e1
68344c785a66898f0b41a263c2d3344c785a65a6382d06898f0b4cd131e1699698f0b4cd131e
168344c785a66898f0b4cd131e1682d31e1699a263c2d06898f0b4cd131c1699698f0b41a263
c2d3344c785a65a63d568344c785a66898f0b4cd131e168344c785a65a6382d3344c785a0d13
1e1699698f0b4cd131e168344c785a66898f0b4cb4c7aad06898f0b4cd133fffd9>
endstream
endobj
{{xref}}
{{trailer}}
{{startxref}}
%%EOF