diff --git a/api.php b/api.php index e4b5698..9ef76c4 100644 --- a/api.php +++ b/api.php @@ -55,6 +55,12 @@ switch ($action) { case 'image': handleImage(); break; + case 'remediate': + handleRemediate(); + break; + case 'download': + handleDownload(); + break; default: error('Invalid action'); } @@ -389,6 +395,115 @@ function handleImage() { exit; } +/** + * Auto-remediate PDF accessibility issues + */ +function handleRemediate() { + $job_id = $_POST['job_id'] ?? ''; + + if (empty($job_id)) { + error('Job ID required'); + } + + $meta_file = RESULTS_DIR . '/' . $job_id . '.meta.json'; + $result_file = RESULTS_DIR . '/' . $job_id . '.result.json'; + + if (!file_exists($meta_file) || !file_exists($result_file)) { + error('Job not found'); + } + + $job_data = json_decode(file_get_contents($meta_file), true); + $result_data = json_decode(file_get_contents($result_file), true); + + // Check if there are fixable issues + if (!isset($result_data['auto_fixable_count']) || $result_data['auto_fixable_count'] == 0) { + error('No auto-fixable issues found'); + } + + $original_pdf = $job_data['filepath']; + $remediated_pdf = UPLOAD_DIR . '/' . $job_id . '_remediated.pdf'; + + // Use absolute venv path + $venv_python = '/Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/venv/bin/python3'; + $python_bin = file_exists($venv_python) ? $venv_python : 'python3'; + $remediation_script = __DIR__ . '/pdf_remediation.py'; + + // Build command - apply all safe fixes + $cmd = escapeshellcmd($python_bin . ' ' . $remediation_script) . ' ' . + escapeshellarg($original_pdf) . ' ' . + '--output ' . escapeshellarg($remediated_pdf) . ' ' . + '--all'; + + // Set PATH for poppler + $env_path = getenv('PATH'); + $poppler_paths = '/opt/homebrew/bin:/usr/local/bin'; + putenv("PATH={$poppler_paths}:{$env_path}"); + + // Run remediation + $error_log = RESULTS_DIR . '/' . $job_id . '.remediation.log'; + $cmd .= ' > ' . escapeshellarg($error_log) . ' 2>&1'; + + exec($cmd, $output, $return_code); + + // Check if remediation succeeded + if ($return_code !== 0 || !file_exists($remediated_pdf)) { + $log_content = file_exists($error_log) ? file_get_contents($error_log) : 'Unknown error'; + error('Remediation failed: ' . substr($log_content, -500)); + } + + // Store remediated file info + $job_data['remediated_pdf'] = $remediated_pdf; + $job_data['remediated_at'] = date('Y-m-d H:i:s'); + file_put_contents($meta_file, json_encode($job_data, JSON_PRETTY_PRINT)); + + success([ + 'job_id' => $job_id, + 'remediated_pdf' => basename($remediated_pdf), + 'original_filename' => $job_data['original_filename'], + 'fixes_applied' => $result_data['auto_fixable_count'], + 'download_url' => 'api.php?action=download&job_id=' . $job_id . '&type=remediated', + 'message' => 'PDF remediated successfully' + ]); +} + +/** + * Download original or remediated PDF + */ +function handleDownload() { + $job_id = $_GET['job_id'] ?? ''; + $type = $_GET['type'] ?? 'original'; // 'original' or 'remediated' + + if (empty($job_id)) { + error('Job ID required'); + } + + $meta_file = RESULTS_DIR . '/' . $job_id . '.meta.json'; + + if (!file_exists($meta_file)) { + error('Job not found'); + } + + $job_data = json_decode(file_get_contents($meta_file), true); + + if ($type === 'remediated') { + if (!isset($job_data['remediated_pdf']) || !file_exists($job_data['remediated_pdf'])) { + error('Remediated PDF not found'); + } + $file_path = $job_data['remediated_pdf']; + $filename = pathinfo($job_data['original_filename'], PATHINFO_FILENAME) . '_fixed.pdf'; + } else { + $file_path = $job_data['filepath']; + $filename = $job_data['original_filename']; + } + + // Serve the file + header('Content-Type: application/pdf'); + header('Content-Disposition: attachment; filename="' . $filename . '"'); + header('Content-Length: ' . filesize($file_path)); + readfile($file_path); + exit; +} + /** * Send success response */ diff --git a/index.html b/index.html index ae6c679..da15854 100644 --- a/index.html +++ b/index.html @@ -1084,12 +1084,74 @@ fixesList.innerHTML = fixesHTML; } - function applyFixes() { - // This would call the API to remediate the PDF - alert('Auto-remediation feature coming soon! This will:\n\nβ€’ Add missing metadata\nβ€’ Set document language\nβ€’ Add bookmarks\nβ€’ Generate a fixed PDF for download'); + async function applyFixes() { + const btn = document.getElementById('applyFixesBtn'); + const resultDiv = document.getElementById('fixResult'); - // TODO: Implement API call to remediation endpoint - // const response = await fetch('api.php?action=remediate&job_id=' + currentJobId); + // Disable button + btn.disabled = true; + btn.innerHTML = ' Applying fixes...'; + + resultDiv.style.display = 'block'; + resultDiv.innerHTML = '
πŸ”§ Applying automatic fixes to PDF...
'; + + try { + const formData = new FormData(); + formData.append('action', 'remediate'); + formData.append('job_id', currentJobId); + + const response = await fetch('api.php', { + method: 'POST', + body: formData + }); + + const result = await response.json(); + + if (result.success) { + resultDiv.innerHTML = ` +
+
+ βœ… ${result.data.fixes_applied} issue(s) automatically fixed! +
+
+ Your remediated PDF is ready for download. +
+ + πŸ“₯ Download Fixed PDF + +
+ Filename: ${result.data.original_filename.replace('.pdf', '_fixed.pdf')} +
+
+ `; + + // Hide the apply button (already applied) + btn.style.display = 'none'; + + } else { + resultDiv.innerHTML = ` +
+
❌ Remediation failed
+
${result.error}
+
+ `; + btn.disabled = false; + btn.innerHTML = '⚑Retry Auto-Fix'; + } + + } catch (error) { + resultDiv.innerHTML = ` +
+
❌ Error
+
${error.message}
+
+ `; + btn.disabled = false; + btn.innerHTML = '⚑Retry Auto-Fix'; + } } function displayIssues(issues) { diff --git a/pdf_remediation.py b/pdf_remediation.py index bd0f8d2..653451e 100755 --- a/pdf_remediation.py +++ b/pdf_remediation.py @@ -102,26 +102,33 @@ class PDFRemediator: return suggestions - def apply_fixes(self, fixes_to_apply: List[str], output_path: str = None) -> Dict[str, Any]: + def apply_fixes(self, fixes_to_apply: List[str], output_path: str = None, custom_values: Dict[str, str] = None) -> Dict[str, Any]: """Apply selected fixes and save to new PDF""" if not output_path: output_path = str(self.pdf_path.parent / f"{self.pdf_path.stem}_remediated.pdf") + if custom_values is None: + custom_values = {} + # Clone the PDF for page in self.reader.pages: self.writer.add_page(page) + # Copy existing metadata first + if self.reader.metadata: + self.writer.add_metadata(self.reader.metadata) + # Apply each fix for fix in fixes_to_apply: if fix == 'add_title': - self._fix_add_title() + self._fix_add_title(custom_values.get('title')) elif fix == 'add_author': - self._fix_add_author() + self._fix_add_author(custom_values.get('author')) elif fix == 'add_subject': - self._fix_add_subject() + self._fix_add_subject(custom_values.get('subject')) elif fix == 'set_language': - self._fix_set_language() + self._fix_set_language(custom_values.get('language', 'en-US')) elif fix == 'mark_tagged': self._fix_mark_tagged() elif fix == 'add_bookmarks': @@ -361,18 +368,37 @@ def main(): # Determine which fixes to apply fixes_to_apply = [] + custom_values = {} if args.all: - fixes_to_apply = [f['id'] for cat, fixes in suggestions.items() for f in fixes if f['auto_fixable']] + # Apply all auto-fixable issues + for category, fixes in suggestions.items(): + for fix in fixes: + if fix['auto_fixable']: + fixes_to_apply.append(fix['id']) + # Use CLI values if provided, otherwise use suggestions + if fix['id'] == 'add_title' and args.title: + custom_values['title'] = args.title + elif fix['id'] == 'add_author' and args.author: + custom_values['author'] = args.author + elif fix['id'] == 'add_subject' and args.subject: + custom_values['subject'] = args.subject + elif fix['id'] == 'set_language': + custom_values['language'] = args.language else: + # Apply only what was explicitly requested if args.title: fixes_to_apply.append('add_title') + custom_values['title'] = args.title if args.author: fixes_to_apply.append('add_author') + custom_values['author'] = args.author if args.subject: fixes_to_apply.append('add_subject') - if args.language: + custom_values['subject'] = args.subject + if args.language != 'en-US': # If custom language specified fixes_to_apply.append('set_language') + custom_values['language'] = args.language if args.add_bookmarks: fixes_to_apply.append('add_bookmarks') if args.mark_tagged: @@ -388,7 +414,7 @@ def main(): print("πŸ”§ Applying Fixes...") print(f"{'='*60}\n") - result = remediator.apply_fixes(fixes_to_apply, args.output) + result = remediator.apply_fixes(fixes_to_apply, args.output, custom_values) if result['success']: print("βœ… Remediation Complete!") @@ -397,26 +423,27 @@ def main(): for fix in result['fixes_applied']: print(f" βœ“ {fix}") - # Run veraPDF validation on result - print(f"\n{'='*60}") - print("πŸ” Validating Remediated PDF with veraPDF...") - print(f"{'='*60}\n") + # Optionally run veraPDF validation on result + if os.isatty(sys.stdout.fileno()): # Only if running interactively (not from web) + print(f"\n{'='*60}") + print("πŸ” Validating Remediated PDF with veraPDF...") + print(f"{'='*60}\n") - validator = VeraPDFValidator() - validation = validator.validate(result['output_path']) + validator = VeraPDFValidator() + validation = validator.validate(result['output_path']) - if 'error' not in validation: - print(f"PDF/UA Compliance: {'βœ… PASS' if validation['compliant'] else '❌ FAIL'}") - print(f"Passed Rules: {validation['passed_rules']}") - print(f"Failed Rules: {validation['failed_rules']}") + if 'error' not in validation: + print(f"PDF/UA Compliance: {'βœ… PASS' if validation['compliant'] else '❌ FAIL'}") + print(f"Passed Rules: {validation['passed_rules']}") + print(f"Failed Rules: {validation['failed_rules']}") - if validation['errors']: - print(f"\nRemaining Issues ({len(validation['errors'])}):") - for i, error in enumerate(validation['errors'][:10], 1): - print(f" {i}. Clause {error['clause']}: {error['description'][:80]}...") + if validation['errors']: + print(f"\nRemaining Issues ({len(validation['errors'])}):") + for i, error in enumerate(validation['errors'][:10], 1): + print(f" {i}. Clause {error['clause']}: {error['description'][:80]}...") - if len(validation['errors']) > 10: - print(f" ... and {len(validation['errors']) - 10} more") + if len(validation['errors']) > 10: + print(f" ... and {len(validation['errors']) - 10} more") else: print("❌ Remediation failed") diff --git a/results/pdf_68f7946b8c7544.64378350.error.log b/results/pdf_68f7946b8c7544.64378350.error.log new file mode 100644 index 0000000..454318d --- /dev/null +++ b/results/pdf_68f7946b8c7544.64378350.error.log @@ -0,0 +1,64 @@ + ℹ️ Using Google API key: AIzaSyDWVxBWiDTeECqa... + βœ… Anthropic Claude initialized +πŸ” Enterprise PDF Accessibility Check +πŸ“„ File: pdf_68f7946b8c7544.64378350.pdf +============================================================ + +⏳ Running: Document Structure... ❌ (0.00s) +⏳ Running: Metadata... ❌ (0.00s) +⏳ Running: Language Declaration... ❌ (0.00s) +⏳ Running: Text Extractability... ❌ (1.26s) +⏳ Running: OCR Quality... πŸ” Running OCR analysis... + ⚠️ OCR check skipped: (1, 'Error in fopenReadStream: failed to open locally with tail tess_90drwcxh_input.PPM for filename /tmp/tess_90drwcxh_input.PPM Leptonica Error in findFileFormat: image file not found: /tmp/tess_90drwcxh_input.PPM Error in fopenReadStream: failed to open locally with tail P6 for filename P6 Leptonica Error in pixRead: image file not found: P6 Image file P6 cannot be read! Error during processing.') +❌ (0.65s) +⏳ Running: Image Accessibility... πŸ–ΌοΈ Analyzing images with AI... + πŸ“Š Found 3 images to analyze... + πŸ“· Analyzed image 1/3 (Page 6) (cached) + πŸ“· Analyzed image 2/3 (Page 6) (cached) + πŸ“· Analyzed image 3/3 (Page 9) (cached) + βœ… Completed analysis of 3/3 images +❌ (0.12s) +⏳ Running: Color Contrast... 🎨 Checking color contrast... +❌ (0.19s) +⏳ Running: Content Readability... ❌ (0.01s) +⏳ Running: Link Quality... ❌ (0.00s) +⏳ Running: Heading Structure... ❌ (0.00s) +⏳ Running: Form Accessibility... ❌ (0.00s) +⏳ Running: Table Structure... ❌ (0.00s) +⏳ Running: Reading Order... ❌ (0.00s) +⏳ Running: Font Accessibility... ❌ (0.00s) +⏳ Running: Security Settings... ❌ (0.00s) +⏳ Running: Navigation Aids... ❌ (0.00s) +⏳ Running: PDF/UA Structure (veraPDF)... + πŸ“‹ Running veraPDF PDF/UA validation... + ⚠️ veraPDF validation error: veraPDF failed: +❌ (1.28s) + +πŸ”§ Analyzing auto-remediation options... + βœ… 5 issues can be auto-fixed + +πŸ“Έ Generating page images for visual display... + βœ… Page 1/20 + βœ… Page 2/20 + βœ… Page 3/20 + βœ… Page 4/20 + βœ… Page 5/20 + βœ… Page 6/20 + βœ… Page 7/20 + βœ… Page 8/20 + βœ… Page 9/20 + βœ… Page 10/20 + βœ… Page 11/20 + βœ… Page 12/20 + βœ… Page 13/20 + βœ… Page 14/20 + βœ… Page 15/20 + βœ… Page 16/20 + βœ… Page 17/20 + βœ… Page 18/20 + βœ… Page 19/20 + βœ… Page 20/20 + βœ… Generated 20 page images at 150 DPI + +πŸ“„ Report saved: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f7946b8c7544.64378350.result.json +πŸ“Έ Page images saved to: /Users/daveporter/Desktop/CODING-2024/PDF-Accessibility-checker/results/pdf_68f7946b8c7544.64378350.result_images diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_1.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_1.png new file mode 100644 index 0000000..cbeab4c Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_1.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_10.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_10.png new file mode 100644 index 0000000..3b62c46 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_10.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_11.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_11.png new file mode 100644 index 0000000..30a8de6 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_11.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_12.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_12.png new file mode 100644 index 0000000..8b418fa Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_12.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_13.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_13.png new file mode 100644 index 0000000..7b8c9eb Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_13.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_14.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_14.png new file mode 100644 index 0000000..62aaddf Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_14.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_15.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_15.png new file mode 100644 index 0000000..9ecd048 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_15.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_16.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_16.png new file mode 100644 index 0000000..e04e6ec Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_16.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_17.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_17.png new file mode 100644 index 0000000..9086973 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_17.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_18.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_18.png new file mode 100644 index 0000000..20946b2 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_18.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_19.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_19.png new file mode 100644 index 0000000..ad324d1 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_19.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_2.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_2.png new file mode 100644 index 0000000..e9f0a78 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_2.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_20.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_20.png new file mode 100644 index 0000000..080711c Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_20.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_3.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_3.png new file mode 100644 index 0000000..a7df08d Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_3.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_4.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_4.png new file mode 100644 index 0000000..fdeb67d Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_4.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_5.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_5.png new file mode 100644 index 0000000..958007d Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_5.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_6.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_6.png new file mode 100644 index 0000000..eaa909b Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_6.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_7.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_7.png new file mode 100644 index 0000000..a4f39dc Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_7.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_8.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_8.png new file mode 100644 index 0000000..38b2ad6 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_8.png differ diff --git a/results/pdf_68f7946b8c7544.64378350.result_images/page_9.png b/results/pdf_68f7946b8c7544.64378350.result_images/page_9.png new file mode 100644 index 0000000..46fbe80 Binary files /dev/null and b/results/pdf_68f7946b8c7544.64378350.result_images/page_9.png differ diff --git a/test_auto_fixed.pdf b/test_auto_fixed.pdf new file mode 100644 index 0000000..8d31ced --- /dev/null +++ b/test_auto_fixed.pdf @@ -0,0 +1,275 @@ +%PDF-1.3 +%βγΟΣ +1 0 obj +<< +/Producer (ReportLab PDF Library \055 www\056reportlab\056com) +/Author (anonymous) +/CreationDate (D\07220251020161349\05504\04700\047) +/Creator (ReportLab PDF Library \055 www\056reportlab\056com) +/Keywords () +/ModDate (D\07220251020161349\05504\04700\047) +/Subject (unspecified) +/Title (untitled) +/Trapped (\057False) +>> +endobj +2 0 obj +<< +/Type /Pages +/Count 3 +/Kids [ 4 0 R 14 0 R 19 0 R ] +>> +endobj +3 0 obj +<< +/Type /Catalog +/Pages 2 0 R +/Lang (en\055US) +>> +endobj +4 0 obj +<< +/Contents 5 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.2c2d8c1a59ccd390014a13df1823520c 11 0 R +/FormXob.4239313bbffe37482d3f1e78247febb9 12 0 R +/FormXob.c61c5faae8c5519bf83811c2a31afbe3 13 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 2 0 R +>> +endobj +5 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 341 +>> +stream +GarWr9i&Y\$jPX:ItbE6&maiL1uX6udNf;FjhN`n',IsXJsHT`hpOU*nK9/qZ*Zp?=GnqpB^3Zg\lWZTo68Cf!.WaZc`5in9GDZ%R(!@*)"BsDt +endstream +endobj +6 0 obj +<< +/F1 7 0 R +/F2 8 0 R +/F3 9 0 R +/F4 10 0 R +>> +endobj +7 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +8 0 obj +<< +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding +/Name /F2 +/Subtype /Type1 +/Type /Font +>> +endobj +9 0 obj +<< +/BaseFont /ZapfDingbats +/Name /F3 +/Subtype /Type1 +/Type /Font +>> +endobj +10 0 obj +<< +/BaseFont /Symbol +/Name /F4 +/Subtype /Type1 +/Type /Font +>> +endobj +11 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 90 +/Subtype /Image +/Type /XObject +/Width 280 +/Length 2549 +>> +stream +Gb"0U$#g>t*!btg,d%GnKncJs5U@_PXUpaH)Ti3CWhW1eN^;K$ALJRAheM.!lABp.UPPpALo-1h8DKGcOG&E.+qjGBSbsfr41jtKHS9[,2rHrJ#asCm5A2"&B_B^UJ.5Pg)(W4tUjAf'D)"GAH+82g'Isrrd%Tku'ZgpDf*>*^&'j%Alo!_-k#Hm)R^:BuZ,#j5QMuHrS=0cl.$r(S`p^gCfHs!XaaZN9thnJDf_ha+TerJNh*iU_n0Nr1o`'5C=/bZ0)s,@upTEO@Flpm!P1EX/;nPE.^HpU/o>TODT3(;.]Cu2M]Akd,/Jj7EPmL@Y>H0!&eZ;jq+fa8Jn[CBSc,Q1K).J#A=+m2,O;58\$0Bi`mN;puBJ":)t<-J#>J6bcQhH*h^0%lD(/=]OH'\&."82dmjZ.`C>7g6kJ)pX?"an$5N;#3QFZB?@PQPGYrS.`bI^aWkASU`QnaS=_3k4rq,H=Y^H*,7oG8e96PJmMg]%oL[t94a2mP93T"<=b*@2CHaK)/-0:/YckY)m*Xs:n(?88?f*-*]dE_ec'g:C2nME;OZiZ53qY[;QRs0Anp`U3,gOOW-/dn,mD=RPe8p"]pDftG9"K3%J^k&?An!bFUU'am7l`)\PUY%:&W9?e;eG^SPk'ORW`@!%u6m4UX>FWL`\./VOOH?EZ6pGbl]+#V>8\%%a!W+Y859!RoWM=`LZ_-IFQ<;tIiH*8;165`ZcH7A1_%^V<[dFu,8P&XP,q?=noK,(DQ6tW+BP`'Gl.0^`]"RWT#)jC1X0AhA;IVB[4ZoCIdI:%'pUJ'VX&1>O].]/`'7l!M*8b!Z\Ge$!ZlINXb/pOWe()f(nX)9V0hH8f#d_,B`o=6g"F_H;XO]@>0%imb"5p<*Z(h=CCO,WrR3,k]SrrISN>0-sjTF?%48&^T(o158niPLMfCY/:31m$<.AA3-bIMMP:aNZ:q275KfLCO,`hm:OrEcTsc0B(R-UMJK<;NEE3`BQa[L8)>1s0Y;;,D1HX^!l'<$)W^5NY\8,R59hi8&^]+o10b'M-dk>1_!Kg*2qBTgt>,%eZ%#8'L$m+ThK+KW`Hg"S*Qph$JN_!ZY(5GTjDdJYj1?`AuU64U9-^Mn7;[l;Dh_?jHMCBq8Of;`G,\%Yo^SY&OrrUXqrJ$d%;VStd;`$I^3`%91R7HfWl.ii0ACVh%6!fijL!CoqI`du$P.])`/%K-.T]"`FClZ-3O&&B/*a@`&:Rq3AGuRHPrI&TAjgRd#ED?)5Ln*YS91]4RUJd+\O5+V,`N[q"nk0>OeJap&,i=&W\F?Z60lA!2Pq"r4:p]A2A??rhTN&'b(9LpAQ&!C9gsDHZ`K>65-m0X=)Io"@YsE2B&8L[iX/_a2N?((kL$@jPXSj]qPlEREI^q7Meot#$1QUVk9n;Jna]A>Wd%SX?Sk%B.;1sZn7RZl@9(L6P/tJEpKf$hh[s@T*;MuPMO,/UJLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCM!1,r+3k=+Zi~> +endstream +endobj +12 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 120 +/Subtype /Image +/Type /XObject +/Width 350 +/Length 2263 +>> +stream +Gb"0UH#+0p*5M)GH>j0WTFrdu!g24eE`>HpUC[t>'p3IV%>':aW)s+$0lf["&PF]GM:%uQ_8O8"9oPfDs6tg_K/`R\)@sIqlL4BTh4<6Ph)?@cgR@Tlo>g:bRsjmWn$g'"g"f[MV^>/De,dTs"dW/n=tYn@@IYt^3f"@Ih/A?Y]VGp81uG[peeoHYgio'hm`&MIoP`;r/kknsZL?SBHJbh\e9?tPU-dD(Q"lPcpYA$^kFD>#2DouOmZWj2:RsH:=3!s=*D5MZ=-M86YuE:mV>CthWtA3qhm*"QghM7'CW;XWP?[gWX45f0n*F)8;h#fa%np!ZoCPH3Q"LM'-[/"j,p(#\L5AEgdbd,So\Dp[JeN2#Cgn571;7rG8S;JH,"St`=Y5Ok\=5D^p%B+lkYTMR>AL_IXTH)G$ZXci_^=fL)L:EjRV!Bd(V9fbeeftOCIac\j;'chH1e#Ue[9@cd2K4Fr!a)n!p&bgn@MDEqV5'I;66tYGhqu%9.4dp!e$T9:>X"[ltDF?F"F:k&gK8LOO6r-MLF\CfGoP=!tGV'kThlUJEQ1tSlM_cum"<&&$L_map'IJT$]MO\$'cR$?=G@b$[Gl5d5M?TNRN7Z)Ht[4f51-X?2?jF-N;'7m:-%G"'$G=S)fXD\;g6SI%Z'E-]4)q2K%gSWVb$[#_V_Wo9:71.LN+(/W?pBQ7YsKqZbNc&1Y&8e?_p2CK".>4mb870k=6Ts1\a+T)-8">6[k_?&G^QL>.-J)dU\*a=a%Q&;B]^fF:M'%>Y-N4#K?Yg9aq-`r@@#4pL.NnJr@A#h$E6uDQ!sV*T7K&4d=43g9"hrF5A6/;o1ceAU%q+Q[<;=[TZYWn]l'7b8,_Is=io3?<#NOX-d;-a`\;+o&MFro02?daHuAcFurlMY0"e+^;[Oa$th&[f6h:l[r_;VqG\?L#H,SbB-5$eQ,.nbJRX=4Wf>/_Q0J,`:+RHcg[dKd:X-(S`a.OdR.48CG.DcR:[K[Mfa?n(G=fI2Sk"[.T(Sp8KF^h;Qd7jM2W%\Ac6?)dO@loX).`'#X++Y1kCljHohQdV6O0JW2?-+5R^$r32OZ](SrA7C$/D)7*C.tX"bNQSJCZ;,PaW7K48VY08N^RL6(qH1#:[Zn7US:L06WbDRKs)OL"1.Y3O2_eCKeaM2O-2O^p3(MRHGp$`VC&G)8MOe2W2sU\IlE0Yn(%I$QMZNK!=U<$e)(ckSi0 +endstream +endobj +13 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 100 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 1451 +>> +stream +Gb"0U:P__`(r5Yt,l\28,"<@I,_]>K;\UNM/2/TUKS@F<@6n$%)pH;'AY[?(A8K7P(5Ke+`K+F5HMYqn-F1kFQb_3ELetzzzzzzzzzzzzz!!!!-Pbh%7gc9ZY>2%[UT9kiZ\T1,>XXXaK2c%;%cCBBH/t-eFec]6>'O%iZi'(MUc*'J&[3496qX)6O+hJ>\EHSBoUnR_+Kbqs:Y#oqn6ih=9Bg/T8Il`+05Eg?K6mr9bhg$:!;X9d+($j:okI^Hj2U>`:CfL^$[VL(Ue1.BQ#4Sp(A"+/NA#QqU9RQF/%nh'A&=\6X\H'Y:CfL^Me84R5>\JbQA6"DkHA7c_jS6O6N>j`9\Y3W^<+BS?7Csjc^sB.3T3oZhL'Xr+^Hq"Bu!H4FC`rRq=RBNU)u'9)"?iWF7QkXR6?\XkOm?S3<_2#k"RFXqYI"T>g=+(u9T'rLcIIk`HASr$aF7QC(.0oUoX<7Er,d]6alq9P(&K4RBk7pje5/H2:JBbTSMWn``>pF@#G0eRm.Yo/a3?IOp*V-V^@`H8'`VDU0Bu'ZclPB=.rfjd!Aal+Qc2&`)0kV2m]m,G*5]V+haO5-nO!CH!7tS2?5rl+ukHps:2Y'Z_>:b1G.=ARLNpF`k!'OcGA?.8,uJ[;33mUPCGI*_`%U8F/W`7bZLnRlWWBn`$:l.%_Oh5LDW6_EA&X.@7BuAa$gLF;.bToM.^=daI\F3;0sWWR:sH^-?;f$GnUIQS8#9;6dlD^OCCKS-aD[QgDPC"q>6`Q8)kh;]r-bL"NtZEoVmTO_KL;hrXZT/]\ec$7#Lr0NG]W<"BoEpY15IVrIm%V[(P +endstream +endobj +14 0 obj +<< +/Contents 15 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.1310210de56a359f75cadd6058093d5c 16 0 R +/FormXob.85598c76e5387c61e079109a4090d1fe 17 0 R +/FormXob.fe6121c1aa08a49ce6c0bd2422036546 18 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 2 0 R +>> +endobj +15 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 344 +>> +stream +GarWs9hPRC&-h(ireg6C@b[=(,b'$WZqsRqaMDY\bhC3WKAA-SoA/g1NJ)uDKfj9?JA\,A)-_W,%uV_71&)YXbn^"8\FmfqB4*UZD!1LRV[l*=<,/qp_WaF4(>qiqc[,[GDuFLaS#tC!?$4sh\hih/i6T1!ru6I11s&fn"1a/8,Fq*/abM4Z=s1c_&/sbfWXIJ@*k#Q]GOhNl[:$otBErSq[H$5h`F>80m8I?;W?c#k,hdoL]=QEFUh!;+FCil4DK>8,14!Eb`$k;JWPoEIU_(lWjeA,ulbnYu9;@dJA4iG\d24hBH&gG/fiT->V6-I8_9*A$T[7,A=saK3GDm#MXT~> +endstream +endobj +16 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 80 +/Subtype /Image +/Type /XObject +/Width 200 +/Length 1760 +>> +stream +Gb"0SHUnlS*!btK%spT278X2APSBr^+VdBXo_M3)&dk?LrDb",77$mGWO]17lYB4#;)>3%bSOEbO!W"Th-+sQopKFU[<0sbgT0/2GJACT__fZh74r[f^;G_nF3\\DS,%*ebc(-al%k.OLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLknUFdH%':2/+Xj/L0D?U!H(`SMcPE7;i!2gZ1uM`-+3?['^uUfj9Mei0%Kqg_[`OU:&rJNJ>IBZLB_;CQsT)lOP9^Z?DP)0frt"_5)_7b2US(1s\@2S)Soc1GHj^:4,LCk+stsS%W0TX6OPe/%N%u[QB1'ahsD:d;Pe^S].eR:GZ(oIjUp<[kUr@RB*OQc7aB\1Qa2([\Q]!WE`n%$X:JH`.Hf-pkQ$@Cla,]7W#ls#_nR4E*JhDk=_^$67ImA%Q*jsPZo%EU?hs^V7pj9XrAn9mOn#o+Z#1X./oD1%_XGSa;L)/*tl3eRO)Igg9(c=9P?3YHHNu1Rbk[:LU).nsp'X5g\g>O2iZ`T[-Ao;[,a`4UkR4:jq[I$]Y7)^CfqeLZtcQ_h8fh8A(4_>Ucb8<]_R"h+hVM<<=RG29o?af>BD\P6mk=aqRaJ4RZAnBI\?g0C2j3+JBOMi:anWH&.SAJ&V82n>#m!BWl&,fq4lb!+ci9\`S:HDRo.BQZsTMri-ss5GA_qi3e;l504J.+=N^E]A3E0HK76j^T!CH)c0nj.>1hAlV?$:.#M7PTM3=/,P"?esj*,QAN@/4RI=sXK:J,?`0/>^^Hh!HrBo2g!.~> +endstream +endobj +17 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 100 +/Subtype /Image +/Type /XObject +/Width 320 +/Length 2098 +>> +stream +Gb"0UBiEMR(l%"a5&LXl$S!>%iiZ9`.U&YaY./u`/g0/6Q90sJ14UL"F.VBnPD\TMe!!(WkM4Z:dW?k)VOqsC&dedBzzzzzzzzzzzzzz!!!AhcCHJPbE!]-qU6h_PKfRUQ^@*q]/Q_7]6E^CTs(Zg2kCib%eoDIe(Ap=m+JSpq:`5lD/a6SregYUF^4Kqs.96dIe/EoU))hacQ^-&KpuFRB54fT=gR8-KaSP-';\T@AnGY"G^.]7:#WO'F`l<=?2O9YP:A+7/81DnGB^*QrV$'YkN/==RSKD7V4[53\PljB5;4da4[4Ak<968+4Y"3rs*j#;X^(P:L"j(TfD-,=`MKE-l07H+TqQ>X[\Y')G5^4KfQd;emA['6qi%;FUMXjbiIbd15JIF6*n6:0m/6bTml(+Ao=Jqu5.,DqJjNOUDtnEFXN^LjQ06>W09KcCq!g^!*7RRFCC'@t2Fm`mj]D'j&(_d=),[*mgSP1T2Dmn?Fj?L;'<[O^hoO_/Gir/O?#==ILF4s5>"_n]/($r/NTBibX]sM,oB&bXEpW8`=8Bmt+04Z9cOOpuq5l'8hp\K!X(6*cDSq2=j()&k#J/QGIOk`QgCc'fWOpdNr2Pmn*&tKUo',R?+OlO)&X>2$;V3h1GbJJ>$>*]-7Sb5T31pM=$t7[Lm2h2P)^L,n,E:_p%,Y2hdW)09PRM=B5`$M\gNVA=%BG='&IirH:X#X)T*>pX#U$qK[(#1&XI>bcgE3==hHMf4nI'4aQa6[CoGB6X1N"X+bu@!8?EU[]B@r,QDN&Da4]XcH]0(Bq!XSY?kL:U&5B2%gVpd]mI6UYeIh8j[3%lDgQiC--ORi9Zp*+DHY$&g`&g*il[?ih4.Z4MG*ToY4cdor*-/uRYHP$)uLJAWq*3)WuUk_o&n>kKD]KNg&;L%3"W'd>L?j,XI.mQ5Ak3G+$Qds;Q43QG&-=O[mOERSf^[$9pJX!9:;TYp2#cebEcM;'(tk_ltg39Z-fK^CYoM"Q!Z&ncjJ[bl:0"k&3N/q)]Nj.hU^7ia0g,cI%DG5pXN'24GfTJj2[5(b7B=*Hc*Tc>hS[`pCo*=[.(Q4p/j6N<&A;c=TmgJc't011du.7e]Q@ted1j$dEuCQH@("(QS0\<6^Wfs<'91?d*Yrl3mSTZ+%D\[e`snF)HpD#)TdT:;<=OC/NZda^P+Oajdos0fAEWg`(adP<,I^V;uQ,2'A>fD,-N%IAuJeO7d5e"ckTDd&(U]mEh-;jtkSs"A%krSkeSq>#Z/g`^Y*/:0YceRXW]%X&Bzzzzzzzzzzzzz!!!#WYOE("02E8~> +endstream +endobj +18 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 90 +/Subtype /Image +/Type /XObject +/Width 250 +/Length 2270 +>> +stream +Gb"0TI8!XP*!bu?=)2B:rFIL[/XdQTi]!gmb[^Idi+ta!1:qXS4:d@8L'MpPrJg`9]G_&*oj[B;t]5lk:?7t$ILI[@8kAi3\CIb/gh.Q)Ekgc>*2Vn1,m/Gn3kt8li['\Hn5te(OPl/pWGa:.L7N>_;@'9@<[JIfm!Y;Fq#iQ>*W-"?9%?^H5lQWk=lTn6C@jE`DEN@Y6eMrn/d0i\NHOV7gu!C#d$!c-s:"Fp6_:k[T8imJ(imbu`b$:NMTpr=[DAT>d[e:Mt8r3&G@,o^\lq^-V.Z8)/H?fJDcrV_gUnVVOd(duGZT-kBK3>2u38o=s-HoZkh#'HO)g7iPAqb*?VHJ-=VTGHa%]JF'3,%lla\.dQTcMN;e)ejTWs:%[[umnS*_+Za2jAnhE\CDT?cfD27\&:WLNs_X7auj8$^d=E\jJjg;5%@nm"!I^E'mX,_Qe&oVaV4_kS13@#q!q9s7W0Q=V70^V?XRgka/d9qO+'F+WK,Cnma+q_KLX-/jm#i@42rBQm+X_ZVL=*kL5UK>;"%oHQTRK+]92`]*Tq!u(?gCneoRmJNV7C/L2"P8)itN!c#Kl;?%8Q@eYKmPTL#nCO`pQK:Y>[:G-j1KC@^n$jKsQ]3UQ)WXLrhTkAL1Nqp](e_I6for/>(/,QZ*6DWc\b(&-m8I'UZEYbsNH18`kuHI@h;pnXOZH6&@OI_'4/n[p-QAEOajbmVe+LoX:Set;ZYPY+[I-);QJW*%($W`ZD'UE6ImY9f'+3UL&-fRd[]Mg`IuMJk,M8%]:X9(SgoZl;S4g4NuBM*C5I>sIQ`gQ!_l->Kl%='W'uDQh0\0f\R!VF47Uk!oU$#tFHDU\BX]08rLu]D,]k%$.>kOVK7@+pU91[Q?,6QDZ>O,qk&.sg4Q*]br2pUa\[#&)fll[H8)WI:\/C:U4Z]YGM+6U9^"OU"r0`)g?f3J@+Ci'L9m(mB-5CW(].TGe^7*=S;MTPi2Rh6P+rr"A(6QcGDq]71jX+KFt[W)E.je3]n![peTp*t>+'88?kl4`HDs4l]n*a"b`C6WIld>bWJ(Y'u_7%uuW0hrKT)nOnirBfD%MCo!"GD;9O\:"i=i%pST,'b75d[?%e*l^o7.rXYfeoV^M%qTF529R4sP*n7Ig(40>)S[_Ul@:!We&UqeUjQpnr+naYj1^;eRLcPQ4'N$S9m>8"nMT59!dcGYu[$sMuMpfSliP7EmKkjDgWjh9t+)0=k5;K+,LkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkr2^IfkUlr,2~> +endstream +endobj +19 0 obj +<< +/Contents 20 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 2 0 R +>> +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 442 +>> +stream +GasbV92EDi'SZ;\MW51?/=k35\e>/!#\\19)`FO!BXP%f9\#d(oV'c<'%:B[h"6!gSBbOsou"r$O+@VX@*ZP=n/[m5f\d.]pdmKT@+iNS)B7_SSCInc`.b=90mXAeShRgo1_kUi"ZO^NMCDDo$Ibd]rX+,JKC*!s`3K`nK2oG>q4iWhFc1hYI4r'_j8bX;T\rNki)>`]lI15^[ObkfsST8VodBK%7U*+4ust^O'%Jk&hHsIW1DRX-QC5H*H?@\rGCjBpH>n +endstream +endobj +xref +0 21 +0000000000 65535 f +0000000015 00000 n +0000000355 00000 n +0000000428 00000 n +0000000494 00000 n +0000000845 00000 n +0000001277 00000 n +0000001339 00000 n +0000001446 00000 n +0000001558 00000 n +0000001641 00000 n +0000001719 00000 n +0000004457 00000 n +0000006910 00000 n +0000008551 00000 n +0000008904 00000 n +0000009340 00000 n +0000011289 00000 n +0000013577 00000 n +0000016036 00000 n +0000016227 00000 n +trailer +<< +/Size 21 +/Root 3 0 R +/Info 1 0 R +>> +startxref +16761 +%%EOF diff --git a/test_fixed.pdf b/test_fixed.pdf new file mode 100644 index 0000000..8d31ced --- /dev/null +++ b/test_fixed.pdf @@ -0,0 +1,275 @@ +%PDF-1.3 +%βγΟΣ +1 0 obj +<< +/Producer (ReportLab PDF Library \055 www\056reportlab\056com) +/Author (anonymous) +/CreationDate (D\07220251020161349\05504\04700\047) +/Creator (ReportLab PDF Library \055 www\056reportlab\056com) +/Keywords () +/ModDate (D\07220251020161349\05504\04700\047) +/Subject (unspecified) +/Title (untitled) +/Trapped (\057False) +>> +endobj +2 0 obj +<< +/Type /Pages +/Count 3 +/Kids [ 4 0 R 14 0 R 19 0 R ] +>> +endobj +3 0 obj +<< +/Type /Catalog +/Pages 2 0 R +/Lang (en\055US) +>> +endobj +4 0 obj +<< +/Contents 5 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.2c2d8c1a59ccd390014a13df1823520c 11 0 R +/FormXob.4239313bbffe37482d3f1e78247febb9 12 0 R +/FormXob.c61c5faae8c5519bf83811c2a31afbe3 13 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 2 0 R +>> +endobj +5 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 341 +>> +stream +GarWr9i&Y\$jPX:ItbE6&maiL1uX6udNf;FjhN`n',IsXJsHT`hpOU*nK9/qZ*Zp?=GnqpB^3Zg\lWZTo68Cf!.WaZc`5in9GDZ%R(!@*)"BsDt +endstream +endobj +6 0 obj +<< +/F1 7 0 R +/F2 8 0 R +/F3 9 0 R +/F4 10 0 R +>> +endobj +7 0 obj +<< +/BaseFont /Helvetica +/Encoding /WinAnsiEncoding +/Name /F1 +/Subtype /Type1 +/Type /Font +>> +endobj +8 0 obj +<< +/BaseFont /Helvetica-Bold +/Encoding /WinAnsiEncoding +/Name /F2 +/Subtype /Type1 +/Type /Font +>> +endobj +9 0 obj +<< +/BaseFont /ZapfDingbats +/Name /F3 +/Subtype /Type1 +/Type /Font +>> +endobj +10 0 obj +<< +/BaseFont /Symbol +/Name /F4 +/Subtype /Type1 +/Type /Font +>> +endobj +11 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 90 +/Subtype /Image +/Type /XObject +/Width 280 +/Length 2549 +>> +stream +Gb"0U$#g>t*!btg,d%GnKncJs5U@_PXUpaH)Ti3CWhW1eN^;K$ALJRAheM.!lABp.UPPpALo-1h8DKGcOG&E.+qjGBSbsfr41jtKHS9[,2rHrJ#asCm5A2"&B_B^UJ.5Pg)(W4tUjAf'D)"GAH+82g'Isrrd%Tku'ZgpDf*>*^&'j%Alo!_-k#Hm)R^:BuZ,#j5QMuHrS=0cl.$r(S`p^gCfHs!XaaZN9thnJDf_ha+TerJNh*iU_n0Nr1o`'5C=/bZ0)s,@upTEO@Flpm!P1EX/;nPE.^HpU/o>TODT3(;.]Cu2M]Akd,/Jj7EPmL@Y>H0!&eZ;jq+fa8Jn[CBSc,Q1K).J#A=+m2,O;58\$0Bi`mN;puBJ":)t<-J#>J6bcQhH*h^0%lD(/=]OH'\&."82dmjZ.`C>7g6kJ)pX?"an$5N;#3QFZB?@PQPGYrS.`bI^aWkASU`QnaS=_3k4rq,H=Y^H*,7oG8e96PJmMg]%oL[t94a2mP93T"<=b*@2CHaK)/-0:/YckY)m*Xs:n(?88?f*-*]dE_ec'g:C2nME;OZiZ53qY[;QRs0Anp`U3,gOOW-/dn,mD=RPe8p"]pDftG9"K3%J^k&?An!bFUU'am7l`)\PUY%:&W9?e;eG^SPk'ORW`@!%u6m4UX>FWL`\./VOOH?EZ6pGbl]+#V>8\%%a!W+Y859!RoWM=`LZ_-IFQ<;tIiH*8;165`ZcH7A1_%^V<[dFu,8P&XP,q?=noK,(DQ6tW+BP`'Gl.0^`]"RWT#)jC1X0AhA;IVB[4ZoCIdI:%'pUJ'VX&1>O].]/`'7l!M*8b!Z\Ge$!ZlINXb/pOWe()f(nX)9V0hH8f#d_,B`o=6g"F_H;XO]@>0%imb"5p<*Z(h=CCO,WrR3,k]SrrISN>0-sjTF?%48&^T(o158niPLMfCY/:31m$<.AA3-bIMMP:aNZ:q275KfLCO,`hm:OrEcTsc0B(R-UMJK<;NEE3`BQa[L8)>1s0Y;;,D1HX^!l'<$)W^5NY\8,R59hi8&^]+o10b'M-dk>1_!Kg*2qBTgt>,%eZ%#8'L$m+ThK+KW`Hg"S*Qph$JN_!ZY(5GTjDdJYj1?`AuU64U9-^Mn7;[l;Dh_?jHMCBq8Of;`G,\%Yo^SY&OrrUXqrJ$d%;VStd;`$I^3`%91R7HfWl.ii0ACVh%6!fijL!CoqI`du$P.])`/%K-.T]"`FClZ-3O&&B/*a@`&:Rq3AGuRHPrI&TAjgRd#ED?)5Ln*YS91]4RUJd+\O5+V,`N[q"nk0>OeJap&,i=&W\F?Z60lA!2Pq"r4:p]A2A??rhTN&'b(9LpAQ&!C9gsDHZ`K>65-m0X=)Io"@YsE2B&8L[iX/_a2N?((kL$@jPXSj]qPlEREI^q7Meot#$1QUVk9n;Jna]A>Wd%SX?Sk%B.;1sZn7RZl@9(L6P/tJEpKf$hh[s@T*;MuPMO,/UJLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCM!1,r+3k=+Zi~> +endstream +endobj +12 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 120 +/Subtype /Image +/Type /XObject +/Width 350 +/Length 2263 +>> +stream +Gb"0UH#+0p*5M)GH>j0WTFrdu!g24eE`>HpUC[t>'p3IV%>':aW)s+$0lf["&PF]GM:%uQ_8O8"9oPfDs6tg_K/`R\)@sIqlL4BTh4<6Ph)?@cgR@Tlo>g:bRsjmWn$g'"g"f[MV^>/De,dTs"dW/n=tYn@@IYt^3f"@Ih/A?Y]VGp81uG[peeoHYgio'hm`&MIoP`;r/kknsZL?SBHJbh\e9?tPU-dD(Q"lPcpYA$^kFD>#2DouOmZWj2:RsH:=3!s=*D5MZ=-M86YuE:mV>CthWtA3qhm*"QghM7'CW;XWP?[gWX45f0n*F)8;h#fa%np!ZoCPH3Q"LM'-[/"j,p(#\L5AEgdbd,So\Dp[JeN2#Cgn571;7rG8S;JH,"St`=Y5Ok\=5D^p%B+lkYTMR>AL_IXTH)G$ZXci_^=fL)L:EjRV!Bd(V9fbeeftOCIac\j;'chH1e#Ue[9@cd2K4Fr!a)n!p&bgn@MDEqV5'I;66tYGhqu%9.4dp!e$T9:>X"[ltDF?F"F:k&gK8LOO6r-MLF\CfGoP=!tGV'kThlUJEQ1tSlM_cum"<&&$L_map'IJT$]MO\$'cR$?=G@b$[Gl5d5M?TNRN7Z)Ht[4f51-X?2?jF-N;'7m:-%G"'$G=S)fXD\;g6SI%Z'E-]4)q2K%gSWVb$[#_V_Wo9:71.LN+(/W?pBQ7YsKqZbNc&1Y&8e?_p2CK".>4mb870k=6Ts1\a+T)-8">6[k_?&G^QL>.-J)dU\*a=a%Q&;B]^fF:M'%>Y-N4#K?Yg9aq-`r@@#4pL.NnJr@A#h$E6uDQ!sV*T7K&4d=43g9"hrF5A6/;o1ceAU%q+Q[<;=[TZYWn]l'7b8,_Is=io3?<#NOX-d;-a`\;+o&MFro02?daHuAcFurlMY0"e+^;[Oa$th&[f6h:l[r_;VqG\?L#H,SbB-5$eQ,.nbJRX=4Wf>/_Q0J,`:+RHcg[dKd:X-(S`a.OdR.48CG.DcR:[K[Mfa?n(G=fI2Sk"[.T(Sp8KF^h;Qd7jM2W%\Ac6?)dO@loX).`'#X++Y1kCljHohQdV6O0JW2?-+5R^$r32OZ](SrA7C$/D)7*C.tX"bNQSJCZ;,PaW7K48VY08N^RL6(qH1#:[Zn7US:L06WbDRKs)OL"1.Y3O2_eCKeaM2O-2O^p3(MRHGp$`VC&G)8MOe2W2sU\IlE0Yn(%I$QMZNK!=U<$e)(ckSi0 +endstream +endobj +13 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 100 +/Subtype /Image +/Type /XObject +/Width 300 +/Length 1451 +>> +stream +Gb"0U:P__`(r5Yt,l\28,"<@I,_]>K;\UNM/2/TUKS@F<@6n$%)pH;'AY[?(A8K7P(5Ke+`K+F5HMYqn-F1kFQb_3ELetzzzzzzzzzzzzz!!!!-Pbh%7gc9ZY>2%[UT9kiZ\T1,>XXXaK2c%;%cCBBH/t-eFec]6>'O%iZi'(MUc*'J&[3496qX)6O+hJ>\EHSBoUnR_+Kbqs:Y#oqn6ih=9Bg/T8Il`+05Eg?K6mr9bhg$:!;X9d+($j:okI^Hj2U>`:CfL^$[VL(Ue1.BQ#4Sp(A"+/NA#QqU9RQF/%nh'A&=\6X\H'Y:CfL^Me84R5>\JbQA6"DkHA7c_jS6O6N>j`9\Y3W^<+BS?7Csjc^sB.3T3oZhL'Xr+^Hq"Bu!H4FC`rRq=RBNU)u'9)"?iWF7QkXR6?\XkOm?S3<_2#k"RFXqYI"T>g=+(u9T'rLcIIk`HASr$aF7QC(.0oUoX<7Er,d]6alq9P(&K4RBk7pje5/H2:JBbTSMWn``>pF@#G0eRm.Yo/a3?IOp*V-V^@`H8'`VDU0Bu'ZclPB=.rfjd!Aal+Qc2&`)0kV2m]m,G*5]V+haO5-nO!CH!7tS2?5rl+ukHps:2Y'Z_>:b1G.=ARLNpF`k!'OcGA?.8,uJ[;33mUPCGI*_`%U8F/W`7bZLnRlWWBn`$:l.%_Oh5LDW6_EA&X.@7BuAa$gLF;.bToM.^=daI\F3;0sWWR:sH^-?;f$GnUIQS8#9;6dlD^OCCKS-aD[QgDPC"q>6`Q8)kh;]r-bL"NtZEoVmTO_KL;hrXZT/]\ec$7#Lr0NG]W<"BoEpY15IVrIm%V[(P +endstream +endobj +14 0 obj +<< +/Contents 15 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +/XObject << +/FormXob.1310210de56a359f75cadd6058093d5c 16 0 R +/FormXob.85598c76e5387c61e079109a4090d1fe 17 0 R +/FormXob.fe6121c1aa08a49ce6c0bd2422036546 18 0 R +>> +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 2 0 R +>> +endobj +15 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 344 +>> +stream +GarWs9hPRC&-h(ireg6C@b[=(,b'$WZqsRqaMDY\bhC3WKAA-SoA/g1NJ)uDKfj9?JA\,A)-_W,%uV_71&)YXbn^"8\FmfqB4*UZD!1LRV[l*=<,/qp_WaF4(>qiqc[,[GDuFLaS#tC!?$4sh\hih/i6T1!ru6I11s&fn"1a/8,Fq*/abM4Z=s1c_&/sbfWXIJ@*k#Q]GOhNl[:$otBErSq[H$5h`F>80m8I?;W?c#k,hdoL]=QEFUh!;+FCil4DK>8,14!Eb`$k;JWPoEIU_(lWjeA,ulbnYu9;@dJA4iG\d24hBH&gG/fiT->V6-I8_9*A$T[7,A=saK3GDm#MXT~> +endstream +endobj +16 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 80 +/Subtype /Image +/Type /XObject +/Width 200 +/Length 1760 +>> +stream +Gb"0SHUnlS*!btK%spT278X2APSBr^+VdBXo_M3)&dk?LrDb",77$mGWO]17lYB4#;)>3%bSOEbO!W"Th-+sQopKFU[<0sbgT0/2GJACT__fZh74r[f^;G_nF3\\DS,%*ebc(-al%k.OLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLknUFdH%':2/+Xj/L0D?U!H(`SMcPE7;i!2gZ1uM`-+3?['^uUfj9Mei0%Kqg_[`OU:&rJNJ>IBZLB_;CQsT)lOP9^Z?DP)0frt"_5)_7b2US(1s\@2S)Soc1GHj^:4,LCk+stsS%W0TX6OPe/%N%u[QB1'ahsD:d;Pe^S].eR:GZ(oIjUp<[kUr@RB*OQc7aB\1Qa2([\Q]!WE`n%$X:JH`.Hf-pkQ$@Cla,]7W#ls#_nR4E*JhDk=_^$67ImA%Q*jsPZo%EU?hs^V7pj9XrAn9mOn#o+Z#1X./oD1%_XGSa;L)/*tl3eRO)Igg9(c=9P?3YHHNu1Rbk[:LU).nsp'X5g\g>O2iZ`T[-Ao;[,a`4UkR4:jq[I$]Y7)^CfqeLZtcQ_h8fh8A(4_>Ucb8<]_R"h+hVM<<=RG29o?af>BD\P6mk=aqRaJ4RZAnBI\?g0C2j3+JBOMi:anWH&.SAJ&V82n>#m!BWl&,fq4lb!+ci9\`S:HDRo.BQZsTMri-ss5GA_qi3e;l504J.+=N^E]A3E0HK76j^T!CH)c0nj.>1hAlV?$:.#M7PTM3=/,P"?esj*,QAN@/4RI=sXK:J,?`0/>^^Hh!HrBo2g!.~> +endstream +endobj +17 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 100 +/Subtype /Image +/Type /XObject +/Width 320 +/Length 2098 +>> +stream +Gb"0UBiEMR(l%"a5&LXl$S!>%iiZ9`.U&YaY./u`/g0/6Q90sJ14UL"F.VBnPD\TMe!!(WkM4Z:dW?k)VOqsC&dedBzzzzzzzzzzzzzz!!!AhcCHJPbE!]-qU6h_PKfRUQ^@*q]/Q_7]6E^CTs(Zg2kCib%eoDIe(Ap=m+JSpq:`5lD/a6SregYUF^4Kqs.96dIe/EoU))hacQ^-&KpuFRB54fT=gR8-KaSP-';\T@AnGY"G^.]7:#WO'F`l<=?2O9YP:A+7/81DnGB^*QrV$'YkN/==RSKD7V4[53\PljB5;4da4[4Ak<968+4Y"3rs*j#;X^(P:L"j(TfD-,=`MKE-l07H+TqQ>X[\Y')G5^4KfQd;emA['6qi%;FUMXjbiIbd15JIF6*n6:0m/6bTml(+Ao=Jqu5.,DqJjNOUDtnEFXN^LjQ06>W09KcCq!g^!*7RRFCC'@t2Fm`mj]D'j&(_d=),[*mgSP1T2Dmn?Fj?L;'<[O^hoO_/Gir/O?#==ILF4s5>"_n]/($r/NTBibX]sM,oB&bXEpW8`=8Bmt+04Z9cOOpuq5l'8hp\K!X(6*cDSq2=j()&k#J/QGIOk`QgCc'fWOpdNr2Pmn*&tKUo',R?+OlO)&X>2$;V3h1GbJJ>$>*]-7Sb5T31pM=$t7[Lm2h2P)^L,n,E:_p%,Y2hdW)09PRM=B5`$M\gNVA=%BG='&IirH:X#X)T*>pX#U$qK[(#1&XI>bcgE3==hHMf4nI'4aQa6[CoGB6X1N"X+bu@!8?EU[]B@r,QDN&Da4]XcH]0(Bq!XSY?kL:U&5B2%gVpd]mI6UYeIh8j[3%lDgQiC--ORi9Zp*+DHY$&g`&g*il[?ih4.Z4MG*ToY4cdor*-/uRYHP$)uLJAWq*3)WuUk_o&n>kKD]KNg&;L%3"W'd>L?j,XI.mQ5Ak3G+$Qds;Q43QG&-=O[mOERSf^[$9pJX!9:;TYp2#cebEcM;'(tk_ltg39Z-fK^CYoM"Q!Z&ncjJ[bl:0"k&3N/q)]Nj.hU^7ia0g,cI%DG5pXN'24GfTJj2[5(b7B=*Hc*Tc>hS[`pCo*=[.(Q4p/j6N<&A;c=TmgJc't011du.7e]Q@ted1j$dEuCQH@("(QS0\<6^Wfs<'91?d*Yrl3mSTZ+%D\[e`snF)HpD#)TdT:;<=OC/NZda^P+Oajdos0fAEWg`(adP<,I^V;uQ,2'A>fD,-N%IAuJeO7d5e"ckTDd&(U]mEh-;jtkSs"A%krSkeSq>#Z/g`^Y*/:0YceRXW]%X&Bzzzzzzzzzzzzz!!!#WYOE("02E8~> +endstream +endobj +18 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Filter [ /ASCII85Decode /FlateDecode ] +/Height 90 +/Subtype /Image +/Type /XObject +/Width 250 +/Length 2270 +>> +stream +Gb"0TI8!XP*!bu?=)2B:rFIL[/XdQTi]!gmb[^Idi+ta!1:qXS4:d@8L'MpPrJg`9]G_&*oj[B;t]5lk:?7t$ILI[@8kAi3\CIb/gh.Q)Ekgc>*2Vn1,m/Gn3kt8li['\Hn5te(OPl/pWGa:.L7N>_;@'9@<[JIfm!Y;Fq#iQ>*W-"?9%?^H5lQWk=lTn6C@jE`DEN@Y6eMrn/d0i\NHOV7gu!C#d$!c-s:"Fp6_:k[T8imJ(imbu`b$:NMTpr=[DAT>d[e:Mt8r3&G@,o^\lq^-V.Z8)/H?fJDcrV_gUnVVOd(duGZT-kBK3>2u38o=s-HoZkh#'HO)g7iPAqb*?VHJ-=VTGHa%]JF'3,%lla\.dQTcMN;e)ejTWs:%[[umnS*_+Za2jAnhE\CDT?cfD27\&:WLNs_X7auj8$^d=E\jJjg;5%@nm"!I^E'mX,_Qe&oVaV4_kS13@#q!q9s7W0Q=V70^V?XRgka/d9qO+'F+WK,Cnma+q_KLX-/jm#i@42rBQm+X_ZVL=*kL5UK>;"%oHQTRK+]92`]*Tq!u(?gCneoRmJNV7C/L2"P8)itN!c#Kl;?%8Q@eYKmPTL#nCO`pQK:Y>[:G-j1KC@^n$jKsQ]3UQ)WXLrhTkAL1Nqp](e_I6for/>(/,QZ*6DWc\b(&-m8I'UZEYbsNH18`kuHI@h;pnXOZH6&@OI_'4/n[p-QAEOajbmVe+LoX:Set;ZYPY+[I-);QJW*%($W`ZD'UE6ImY9f'+3UL&-fRd[]Mg`IuMJk,M8%]:X9(SgoZl;S4g4NuBM*C5I>sIQ`gQ!_l->Kl%='W'uDQh0\0f\R!VF47Uk!oU$#tFHDU\BX]08rLu]D,]k%$.>kOVK7@+pU91[Q?,6QDZ>O,qk&.sg4Q*]br2pUa\[#&)fll[H8)WI:\/C:U4Z]YGM+6U9^"OU"r0`)g?f3J@+Ci'L9m(mB-5CW(].TGe^7*=S;MTPi2Rh6P+rr"A(6QcGDq]71jX+KFt[W)E.je3]n![peTp*t>+'88?kl4`HDs4l]n*a"b`C6WIld>bWJ(Y'u_7%uuW0hrKT)nOnirBfD%MCo!"GD;9O\:"i=i%pST,'b75d[?%e*l^o7.rXYfeoV^M%qTF529R4sP*n7Ig(40>)S[_Ul@:!We&UqeUjQpnr+naYj1^;eRLcPQ4'N$S9m>8"nMT59!dcGYu[$sMuMpfSliP7EmKkjDgWjh9t+)0=k5;K+,LkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkpkCLkr2^IfkUlr,2~> +endstream +endobj +19 0 obj +<< +/Contents 20 0 R +/MediaBox [ 0 0 612 792 ] +/Resources << +/Font 6 0 R +/ProcSet [ /PDF /Text /ImageB /ImageC /ImageI ] +>> +/Rotate 0 +/Trans << +>> +/Type /Page +/Parent 2 0 R +>> +endobj +20 0 obj +<< +/Filter [ /ASCII85Decode /FlateDecode ] +/Length 442 +>> +stream +GasbV92EDi'SZ;\MW51?/=k35\e>/!#\\19)`FO!BXP%f9\#d(oV'c<'%:B[h"6!gSBbOsou"r$O+@VX@*ZP=n/[m5f\d.]pdmKT@+iNS)B7_SSCInc`.b=90mXAeShRgo1_kUi"ZO^NMCDDo$Ibd]rX+,JKC*!s`3K`nK2oG>q4iWhFc1hYI4r'_j8bX;T\rNki)>`]lI15^[ObkfsST8VodBK%7U*+4ust^O'%Jk&hHsIW1DRX-QC5H*H?@\rGCjBpH>n +endstream +endobj +xref +0 21 +0000000000 65535 f +0000000015 00000 n +0000000355 00000 n +0000000428 00000 n +0000000494 00000 n +0000000845 00000 n +0000001277 00000 n +0000001339 00000 n +0000001446 00000 n +0000001558 00000 n +0000001641 00000 n +0000001719 00000 n +0000004457 00000 n +0000006910 00000 n +0000008551 00000 n +0000008904 00000 n +0000009340 00000 n +0000011289 00000 n +0000013577 00000 n +0000016036 00000 n +0000016227 00000 n +trailer +<< +/Size 21 +/Root 3 0 R +/Info 1 0 R +>> +startxref +16761 +%%EOF diff --git a/uploads/pdf_68f7946b8c7544.64378350.pdf b/uploads/pdf_68f7946b8c7544.64378350.pdf new file mode 100644 index 0000000..8490cf3 Binary files /dev/null and b/uploads/pdf_68f7946b8c7544.64378350.pdf differ