commit 424b2379efef4ebedfe4a655fb59da3437c5dc35 Author: data Date: Sat Jan 31 21:52:04 2026 +0100 V 1.1 Import Zugferd erstellt diff --git a/.claude/settings.local.json b/.claude/settings.local.json new file mode 100644 index 0000000..870dfde --- /dev/null +++ b/.claude/settings.local.json @@ -0,0 +1,9 @@ +{ + "permissions": { + "allow": [ + "Bash(pdfdetach:*)", + "Bash(python3:*)", + "Bash(xmllint:*)" + ] + } +} diff --git a/2026-01-19 - Auftragsbestätigung - Witte.pdf b/2026-01-19 - Auftragsbestätigung - Witte.pdf new file mode 100755 index 0000000..c6850c5 Binary files /dev/null and b/2026-01-19 - Auftragsbestätigung - Witte.pdf differ diff --git a/2026-02-04 - Zugferd Rechnung - Sonepar - 9010548449 - 3581,33 EUR.pdf b/2026-02-04 - Zugferd Rechnung - Sonepar - 9010548449 - 3581,33 EUR.pdf new file mode 100755 index 0000000..e72a715 --- /dev/null +++ b/2026-02-04 - Zugferd Rechnung - Sonepar - 9010548449 - 3581,33 EUR.pdf @@ -0,0 +1,18971 @@ +%PDF-1.6 +% +1 0 obj +<< +/AcroForm 2 0 R +/MarkInfo << +/Marked true +>> +/Metadata 3 0 R +/Pages 4 0 R +/StructTreeRoot 5 0 R +/Type /Catalog +/AF [6 0 R] +/Names 7 0 R +>> +endobj +8 0 obj +<< +/CreationDate (D:20260121225322+01'00') +/Creator (Adobe LiveCycle Designer 11.0) +/ModDate (D:20260121225322+01'00') +/Producer (Adobe XML Form Module Library) +>> +endobj +2 0 obj +<< +/DR << +/Font << +/Arial-BoldMT 9 0 R +/ArialMT 10 0 R +>> +>> +>> +endobj +3 0 obj +<< +/Type /Metadata +/Subtype /XML +/Length 11 0 R +>> +stream + + + + + + + +ZUGFeRD PDFA Extension Schema +urn:ferd:pdfa:CrossIndustryDocument:invoice:1p0# +zf + + + +DocumentFileName +Text +external +The name of the embedded ZUGFeRD XML invoice file + + +DocumentType +Text +external +INVOICE + + +Version +Text +external +The version of the ZUGFeRD data + + +ConformanceLevel +Text +external +The conformance level of the ZUGFeRD data, i.e. BASIC or EXTENDED + + + + + + + + +INVOICE +ZUGFeRD-invoice.xml +1.0 +EXTENDED + + + + +endstream +endobj +4 0 obj +<< +/Count 3 +/Kids [12 0 R 13 0 R 14 0 R] +/Type /Pages +>> +endobj +5 0 obj +<< +/IDTree 15 0 R +/K 16 0 R +/ParentTree 17 0 R +/ParentTreeNextKey 3 +/RoleMap 18 0 R +/Type /StructTreeRoot +>> +endobj +6 0 obj +<< +/Type /Filespec +/F (ZUGFeRD-invoice.xml) +/EF 19 0 R +/AFRelationship /Alternative +/UF (ZUGFeRD-invoice.xml) +>> +endobj +7 0 obj +<< +/EmbeddedFiles 20 0 R +>> +endobj +9 0 obj +<< +/BaseFont /Arial-BoldMT +/Encoding /WinAnsiEncoding +/FirstChar 0 +/FontDescriptor 21 0 R +/LastChar 255 +/Subtype /TrueType +/Type /Font +/Widths [750 750 750 750 750 750 750 750 750 750 +750 750 750 750 750 750 750 750 750 750 +750 750 750 750 750 750 750 750 750 750 +750 750 278 333 474 556 556 889 722 238 +333 333 389 584 278 333 278 278 556 556 +556 556 556 556 556 556 556 556 333 333 +584 584 584 611 975 722 722 722 722 667 +611 778 722 278 556 722 611 833 722 778 +667 778 722 667 611 722 667 944 667 667 +611 333 278 333 584 556 333 556 611 556 +611 556 333 611 611 278 278 556 278 889 +611 611 611 611 389 556 333 611 556 778 +556 556 500 389 280 389 584 350 556 350 +278 556 500 1000 556 556 333 1000 667 333 +1000 350 611 350 350 278 278 500 500 350 +556 1000 333 1000 556 333 944 350 500 667 +278 333 556 556 556 556 280 556 333 737 +370 556 584 333 737 552 400 549 333 333 +333 576 556 333 333 333 365 556 834 834 +834 611 722 722 722 722 722 722 1000 722 +667 667 667 667 278 278 278 278 722 722 +778 778 778 778 778 584 778 722 722 722 +722 667 667 611 556 556 556 556 556 556 +889 556 556 556 556 556 278 278 278 278 +611 611 611 611 611 611 611 549 611 611 +611 611 611 556 611 556] +>> +endobj +10 0 obj +<< +/BaseFont /ArialMT +/Encoding /WinAnsiEncoding +/FirstChar 0 +/FontDescriptor 22 0 R +/LastChar 255 +/Subtype /TrueType +/Type /Font +/Widths [750 750 750 750 750 750 750 750 750 750 +750 750 750 750 750 750 750 750 750 750 +750 750 750 750 750 750 750 750 750 750 +750 750 278 278 355 556 556 889 667 191 +333 333 389 584 278 333 278 278 556 556 +556 556 556 556 556 556 556 556 278 278 +584 584 584 556 1015 667 667 722 722 667 +611 778 722 278 500 667 556 833 722 778 +667 778 722 667 611 722 667 944 667 667 +611 278 278 278 469 556 333 556 556 500 +556 556 278 556 556 222 222 500 222 833 +556 556 556 556 333 500 278 556 500 722 +500 500 500 334 260 334 584 350 750 350 +222 556 333 1000 556 556 333 1000 667 333 +1000 350 750 350 350 222 222 333 333 350 +556 1000 333 1000 500 333 944 350 750 667 +278 333 556 556 556 556 260 556 333 737 +370 556 584 333 737 552 400 549 333 333 +333 576 537 333 333 333 365 556 834 834 +834 611 667 667 667 667 667 667 1000 722 +667 667 667 667 278 278 278 278 722 722 +778 778 778 778 778 584 778 722 722 722 +722 667 667 611 556 556 556 556 556 556 +889 500 556 556 556 556 278 278 278 278 +556 556 556 556 556 556 556 549 611 556 +556 556 556 500 556 500] +>> +endobj +11 0 obj +2412 +endobj +12 0 obj +<< +/Contents 23 0 R +/Group << +/CS /DeviceRGB +/S /Transparency +>> +/MediaBox [0.0 0.0 595.276 841.89] +/Parent 4 0 R +/Resources << +/Font << +/TT0 10 0 R +/TT1 9 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/XObject << +/Im0 24 0 R +>> +>> +/StructParents 0 +/Tabs /S +/Type /Page +>> +endobj +13 0 obj +<< +/Contents 25 0 R +/MediaBox [0.0 0.0 595.276 841.89] +/Parent 4 0 R +/Resources << +/Font << +/TT0 10 0 R +/TT1 9 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/XObject << +/Im0 24 0 R +>> +>> +/StructParents 1 +/Tabs /S +/Type /Page +>> +endobj +14 0 obj +<< +/Contents 26 0 R +/MediaBox [0.0 0.0 595.276 841.89] +/Parent 4 0 R +/Resources << +/Font << +/TT0 10 0 R +/TT1 9 0 R +>> +/ProcSet [/PDF /Text /ImageC] +/XObject << +/Im0 24 0 R +>> +>> +/StructParents 2 +/Tabs /S +/Type /Page +>> +endobj +15 0 obj +<< +/Names [(Page[1].data[0].ItemDetails_Subform[0].ADDRESS_INFO[0].ADDRESS[0].GT_METAL_SUM[0].Kopfzeile[0].Zelle1[0]) 27 0 R] +>> +endobj +16 0 obj +<< +/K [28 0 R 29 0 R 30 0 R] +/Lang (de-DE) +/P 5 0 R +/S /Document +>> +endobj +17 0 obj +<< +/Nums [0 [31 0 R 32 0 R 33 0 R 34 0 R 35 0 R 36 0 R 37 0 R 38 0 R 39 0 R 40 0 R +41 0 R 42 0 R 43 0 R 44 0 R 45 0 R 46 0 R 47 0 R 48 0 R 49 0 R 50 0 R +51 0 R 52 0 R 53 0 R 54 0 R 55 0 R 56 0 R 57 0 R 58 0 R 59 0 R 60 0 R +61 0 R 62 0 R 63 0 R 64 0 R 65 0 R 66 0 R 67 0 R 68 0 R 69 0 R 70 0 R +71 0 R 72 0 R 73 0 R 74 0 R 75 0 R 76 0 R 77 0 R 78 0 R 79 0 R 80 0 R +81 0 R 82 0 R 83 0 R 84 0 R 85 0 R 86 0 R 87 0 R 88 0 R 89 0 R 90 0 R +91 0 R 92 0 R 93 0 R 94 0 R 95 0 R 96 0 R 97 0 R 98 0 R 99 0 R 100 0 R +101 0 R 102 0 R 103 0 R 104 0 R 105 0 R 106 0 R 107 0 R 108 0 R 109 0 R 110 0 R +111 0 R 112 0 R 113 0 R 114 0 R 115 0 R 116 0 R 117 0 R 118 0 R 119 0 R 120 0 R +121 0 R 122 0 R 123 0 R 124 0 R 125 0 R 126 0 R 127 0 R 128 0 R 129 0 R 130 0 R +131 0 R 132 0 R 133 0 R 134 0 R 135 0 R 136 0 R 137 0 R 138 0 R 139 0 R 140 0 R +141 0 R 142 0 R 143 0 R 144 0 R 145 0 R 146 0 R 147 0 R 148 0 R 149 0 R 150 0 R +151 0 R 152 0 R 153 0 R 154 0 R 155 0 R 156 0 R 157 0 R 158 0 R 159 0 R 160 0 R +161 0 R 162 0 R 163 0 R 164 0 R 165 0 R 166 0 R 167 0 R 168 0 R 169 0 R 170 0 R +171 0 R 172 0 R 173 0 R 174 0 R 175 0 R 176 0 R 177 0 R 178 0 R 179 0 R 180 0 R +181 0 R 182 0 R 183 0 R 184 0 R 185 0 R 186 0 R 187 0 R 188 0 R 189 0 R 190 0 R +191 0 R 192 0 R 193 0 R 194 0 R 195 0 R 196 0 R 197 0 R 198 0 R 199 0 R 200 0 R +201 0 R 202 0 R 203 0 R 204 0 R 205 0 R 206 0 R 207 0 R 208 0 R 209 0 R 210 0 R +211 0 R 212 0 R 213 0 R 214 0 R 215 0 R 216 0 R 217 0 R 218 0 R 219 0 R 220 0 R +221 0 R 222 0 R 223 0 R 224 0 R 225 0 R 226 0 R 227 0 R 228 0 R 229 0 R 230 0 R +231 0 R 232 0 R 233 0 R 234 0 R 235 0 R 236 0 R 237 0 R 238 0 R 239 0 R 240 0 R +241 0 R 242 0 R 243 0 R 244 0 R 245 0 R 246 0 R 247 0 R 248 0 R 249 0 R 250 0 R +251 0 R 252 0 R 253 0 R 254 0 R 255 0 R 256 0 R 257 0 R 258 0 R 259 0 R 260 0 R +261 0 R 262 0 R 263 0 R 264 0 R 265 0 R 266 0 R 267 0 R 268 0 R 269 0 R 270 0 R +271 0 R 272 0 R 273 0 R 274 0 R 275 0 R 276 0 R 277 0 R 278 0 R 279 0 R 280 0 R +281 0 R 282 0 R 283 0 R 284 0 R 285 0 R 286 0 R 287 0 R 288 0 R 289 0 R 290 0 R +291 0 R 292 0 R 293 0 R 294 0 R 295 0 R 296 0 R 297 0 R 298 0 R 299 0 R 300 0 R +301 0 R 302 0 R 303 0 R 304 0 R 305 0 R 306 0 R 307 0 R 308 0 R 309 0 R 310 0 R +311 0 R 312 0 R 313 0 R 314 0 R] + 1 [315 0 R 316 0 R 317 0 R 318 0 R 319 0 R 320 0 R 321 0 R 322 0 R 323 0 R 324 0 R +325 0 R 326 0 R 327 0 R 328 0 R 329 0 R 330 0 R 331 0 R 332 0 R 333 0 R 334 0 R +335 0 R 336 0 R 337 0 R 338 0 R 339 0 R 340 0 R 341 0 R 342 0 R 343 0 R 344 0 R +345 0 R 346 0 R 347 0 R 348 0 R 349 0 R 350 0 R 351 0 R 352 0 R 353 0 R 354 0 R +355 0 R 356 0 R 357 0 R 358 0 R 359 0 R 360 0 R 361 0 R 362 0 R 363 0 R 364 0 R +365 0 R 366 0 R 367 0 R 368 0 R 369 0 R 370 0 R 371 0 R 372 0 R 373 0 R 374 0 R +375 0 R 376 0 R 377 0 R 378 0 R 379 0 R 380 0 R 381 0 R 382 0 R 383 0 R 384 0 R +385 0 R 386 0 R 387 0 R 388 0 R 389 0 R 390 0 R 391 0 R 392 0 R 393 0 R 394 0 R +395 0 R 396 0 R 397 0 R 398 0 R 399 0 R 400 0 R 401 0 R 402 0 R 403 0 R 404 0 R +405 0 R 406 0 R 407 0 R 408 0 R 409 0 R 410 0 R 411 0 R 412 0 R 413 0 R 414 0 R +415 0 R 416 0 R 417 0 R 418 0 R 419 0 R 420 0 R 421 0 R 422 0 R 423 0 R 424 0 R +425 0 R 426 0 R 427 0 R 428 0 R 429 0 R 430 0 R 431 0 R 432 0 R 433 0 R 434 0 R +435 0 R 436 0 R 437 0 R 438 0 R 439 0 R 440 0 R 441 0 R 442 0 R 443 0 R 444 0 R +445 0 R 446 0 R 447 0 R 448 0 R 449 0 R 450 0 R 451 0 R 452 0 R 453 0 R 454 0 R +455 0 R 456 0 R 457 0 R 458 0 R 459 0 R 460 0 R 461 0 R 462 0 R 463 0 R 464 0 R +465 0 R 466 0 R 467 0 R 468 0 R 469 0 R 470 0 R 471 0 R 472 0 R 473 0 R 474 0 R +475 0 R 476 0 R 477 0 R 478 0 R 479 0 R 480 0 R 481 0 R 482 0 R 483 0 R 484 0 R +485 0 R 486 0 R 487 0 R 488 0 R 489 0 R 490 0 R 491 0 R 492 0 R 493 0 R 494 0 R +495 0 R 496 0 R 497 0 R 498 0 R 499 0 R 500 0 R 501 0 R 502 0 R 503 0 R 504 0 R +505 0 R 506 0 R 507 0 R 508 0 R 509 0 R 510 0 R 511 0 R 512 0 R 513 0 R 514 0 R +515 0 R 516 0 R 517 0 R 518 0 R 519 0 R 520 0 R 521 0 R 522 0 R 523 0 R 524 0 R +525 0 R 526 0 R 527 0 R 528 0 R 529 0 R 530 0 R 531 0 R 532 0 R 533 0 R 534 0 R +535 0 R 536 0 R 537 0 R 538 0 R 539 0 R 540 0 R 541 0 R 542 0 R 543 0 R 544 0 R +545 0 R 546 0 R 547 0 R 548 0 R 549 0 R 550 0 R 551 0 R 552 0 R 553 0 R 554 0 R +555 0 R 556 0 R 557 0 R 558 0 R 559 0 R 560 0 R 561 0 R 562 0 R 563 0 R 564 0 R +565 0 R 566 0 R 567 0 R 568 0 R 569 0 R 570 0 R 571 0 R 572 0 R 573 0 R 574 0 R +575 0 R 576 0 R 577 0 R 578 0 R 579 0 R 580 0 R 581 0 R 582 0 R 583 0 R 584 0 R +585 0 R 586 0 R 587 0 R 588 0 R 589 0 R 590 0 R 591 0 R 592 0 R 593 0 R 594 0 R +595 0 R 596 0 R 597 0 R 598 0 R 599 0 R 600 0 R 601 0 R 602 0 R 603 0 R 604 0 R +605 0 R 606 0 R 607 0 R 608 0 R 609 0 R 610 0 R 611 0 R 612 0 R 613 0 R 614 0 R +615 0 R 616 0 R 617 0 R 618 0 R 619 0 R 620 0 R 621 0 R 622 0 R 623 0 R 624 0 R +625 0 R 626 0 R 627 0 R 628 0 R 629 0 R 630 0 R 631 0 R 632 0 R 633 0 R 634 0 R +635 0 R 636 0 R 637 0 R 638 0 R 639 0 R 640 0 R 641 0 R 642 0 R 643 0 R 644 0 R +645 0 R 646 0 R 647 0 R 648 0 R 649 0 R 650 0 R 651 0 R 652 0 R 653 0 R 654 0 R +655 0 R 656 0 R 657 0 R 658 0 R 659 0 R 660 0 R 661 0 R 662 0 R 663 0 R 664 0 R +665 0 R 666 0 R 667 0 R 668 0 R 669 0 R 670 0 R 671 0 R 672 0 R 673 0 R 674 0 R +675 0 R 676 0 R 677 0 R 678 0 R 679 0 R 680 0 R 681 0 R 682 0 R 683 0 R 684 0 R +685 0 R 686 0 R 687 0 R 688 0 R 689 0 R 690 0 R 691 0 R 692 0 R 693 0 R 694 0 R +695 0 R 696 0 R 697 0 R 698 0 R 699 0 R 700 0 R 701 0 R 702 0 R 703 0 R 704 0 R +705 0 R 706 0 R 707 0 R 708 0 R 709 0 R 710 0 R 711 0 R 712 0 R 713 0 R 714 0 R +715 0 R 716 0 R 717 0 R 718 0 R 719 0 R 720 0 R 721 0 R 722 0 R 723 0 R 724 0 R +725 0 R 726 0 R 727 0 R 728 0 R 729 0 R 730 0 R 731 0 R 732 0 R 733 0 R 734 0 R +735 0 R 736 0 R 737 0 R 738 0 R 739 0 R 740 0 R 741 0 R 742 0 R 743 0 R] + 2 [744 0 R 745 0 R 746 0 R 747 0 R 748 0 R 749 0 R 750 0 R 751 0 R 752 0 R 753 0 R +754 0 R 755 0 R 756 0 R 757 0 R 758 0 R 759 0 R 760 0 R 761 0 R 762 0 R 763 0 R +764 0 R 765 0 R 766 0 R 767 0 R 768 0 R 769 0 R 770 0 R 771 0 R 772 0 R 773 0 R +774 0 R 775 0 R 776 0 R 777 0 R 778 0 R 779 0 R 780 0 R 781 0 R 782 0 R 783 0 R +784 0 R 785 0 R 786 0 R 787 0 R 788 0 R 789 0 R 790 0 R 791 0 R 792 0 R 793 0 R +794 0 R 795 0 R 796 0 R 797 0 R 798 0 R 799 0 R 800 0 R 801 0 R 802 0 R 803 0 R +804 0 R 805 0 R 806 0 R 807 0 R 808 0 R 809 0 R 810 0 R 811 0 R 812 0 R 813 0 R +814 0 R 815 0 R 816 0 R 817 0 R 818 0 R 819 0 R 820 0 R 821 0 R 822 0 R 823 0 R +824 0 R 825 0 R 826 0 R 827 0 R 828 0 R 829 0 R 830 0 R 831 0 R 832 0 R 833 0 R +834 0 R 835 0 R 836 0 R 837 0 R 838 0 R 839 0 R 840 0 R 841 0 R 842 0 R 843 0 R +844 0 R 845 0 R 846 0 R 847 0 R 848 0 R 849 0 R 850 0 R 851 0 R 852 0 R 853 0 R +854 0 R 855 0 R 856 0 R 857 0 R 858 0 R 859 0 R 860 0 R 861 0 R 862 0 R 863 0 R +864 0 R 865 0 R 866 0 R 867 0 R 868 0 R 869 0 R 870 0 R 871 0 R 872 0 R 873 0 R +874 0 R 875 0 R 876 0 R 877 0 R 878 0 R 879 0 R 880 0 R 881 0 R 882 0 R 883 0 R +884 0 R 885 0 R 886 0 R 887 0 R 888 0 R 889 0 R 890 0 R 891 0 R 892 0 R 893 0 R +894 0 R 895 0 R 896 0 R 897 0 R 898 0 R 899 0 R 900 0 R 901 0 R 902 0 R 903 0 R +904 0 R 905 0 R 906 0 R 907 0 R 908 0 R 909 0 R 910 0 R 911 0 R 912 0 R 913 0 R +914 0 R 915 0 R 916 0 R 917 0 R 918 0 R 919 0 R 920 0 R 921 0 R 922 0 R 923 0 R +924 0 R 925 0 R 926 0 R 927 0 R 928 0 R 929 0 R 930 0 R 931 0 R 932 0 R 933 0 R +934 0 R 935 0 R 936 0 R 937 0 R 938 0 R 939 0 R 940 0 R 941 0 R 942 0 R 943 0 R +944 0 R 945 0 R 946 0 R 947 0 R 948 0 R 949 0 R 950 0 R 951 0 R 952 0 R 953 0 R +954 0 R 955 0 R 956 0 R 957 0 R 958 0 R 959 0 R 960 0 R 961 0 R 962 0 R 963 0 R +964 0 R 965 0 R 966 0 R 967 0 R 968 0 R 969 0 R 970 0 R 971 0 R 972 0 R 973 0 R +974 0 R 975 0 R 976 0 R 977 0 R 978 0 R 979 0 R 980 0 R 981 0 R 982 0 R 983 0 R +984 0 R 985 0 R 986 0 R 987 0 R 988 0 R 989 0 R 990 0 R 991 0 R 992 0 R 993 0 R +994 0 R 995 0 R 996 0 R 997 0 R 998 0 R 999 0 R 1000 0 R 1001 0 R 1002 0 R 1003 0 R +1004 0 R 1005 0 R 1006 0 R 1007 0 R 1008 0 R 1009 0 R 1010 0 R 1011 0 R 1012 0 R 1013 0 R +1014 0 R 1015 0 R 1016 0 R 1017 0 R 1018 0 R 1019 0 R 1020 0 R 1021 0 R 1022 0 R 1023 0 R +1024 0 R 1025 0 R 1026 0 R 1027 0 R 1028 0 R 1029 0 R 1030 0 R 1031 0 R 1032 0 R 1033 0 R +1034 0 R 1035 0 R 1036 0 R 1037 0 R 1038 0 R 1039 0 R 1040 0 R 1041 0 R 1042 0 R 1043 0 R +1044 0 R 1045 0 R 1046 0 R 1047 0 R 1048 0 R 1049 0 R 1050 0 R 1051 0 R 1052 0 R 1053 0 R +1054 0 R 1055 0 R 1056 0 R 1057 0 R 1058 0 R 1059 0 R 1060 0 R 1061 0 R 1062 0 R 1063 0 R +1064 0 R 1065 0 R 1066 0 R 1067 0 R 1068 0 R 1069 0 R 1070 0 R 1071 0 R 1072 0 R 1073 0 R +1074 0 R 1075 0 R 1076 0 R 1077 0 R 1078 0 R 1079 0 R 1080 0 R 1081 0 R 1082 0 R 1083 0 R] +] +>> +endobj +18 0 obj +<< +/Draw /Div +/Field /Div +/Page /Part +/Subform /Sect +>> +endobj +19 0 obj +<< +/F 1084 0 R +>> +endobj +20 0 obj +<< +/Names [(ZUGFeRD-invoice.xml) 6 0 R] +>> +endobj +21 0 obj +<< +/Ascent 1056 +/CapHeight 716 +/Descent -376 +/Flags 32 +/FontBBox [-628 -376 2000 1056] +/FontFamily (Arial) +/FontName /Arial-BoldMT +/FontStretch /Normal +/FontWeight 700 +/ItalicAngle 0 +/StemV 136 +/Type /FontDescriptor +/XHeight 519 +>> +endobj +22 0 obj +<< +/Ascent 913 +/CapHeight 716 +/Descent -210 +/Flags 32 +/FontBBox [-222 -210 1000 913] +/FontFamily (Arial MT) +/FontName /ArialMT +/FontStretch /Normal +/FontWeight 400 +/ItalicAngle 0 +/StemV 88 +/Type /FontDescriptor +/XHeight 519 +>> +endobj +23 0 obj +<< +/Filter /FlateDecode +/Length 4129 +>> +stream +HW]o}-~s7(+Y8vs-BYkI7TRYRHK&(кΙ33g"U5"X7qۋmMg{#Z\H ΑT37=}XŽi?'3Mluf n/ӟ7f6mr8AS^RH.{\ f3b38TSj@٦.&[}dv +kA:ë>H&6P;@S*Rq1nPH)FRe zCx : Qx ?$ZA|$R`-U2Bx,IP US@ GZbش/]=(Y@|m"+faa?w}Ppll:hx~-ϰICǻdm}dݦ(@M--bD(WRiyh㺏8`.T5WG & ҄ Fܯ!$=lR_ 68`ޏ$&qll_ DR0* + kA[T $q( PW40C.x4TA7 +44m%&r=9Jy€X{{ U|۝M# z]ml\tN5h(e6^l I, gǀ"{t%;6Rd/jHE+r/ԅ9^\Xʰ}5$U]qr ҰkҬVJQEt-wՍUqO;P<@GwbR7~Z0=O{;NTVB)R*Rm|T룮~3~m7'g==u_W(FE5/Di11s;b^Gf\قCv 63LPֱf~VŤT,m~cVXL*E$H<)ޠ[bm,ȁ>OA߂aTu£]gċ`~c_h|;E`FaYcD 'ýX }fTY2f\g-kIfSk6`Qj]?w5Xj)ڈ*Kx.b_s3'xU-MwKv}8(ʚ bM=(n-h[AM5Co'7a`DuqaXaefnH +ѦyţfK (FTJRRL0"Bo)*ğŦM&!ѪF mČM9}UԏG8#gr~ׂhRC@p3SP)G +}Ö T8y糩#CoI}GJ`ES,},xNg>C~#ΰ KYbX"O sD ݠmKa+1?11JB*g.Yd^olIs^6QAW19:& .+X!(_Zq1Sw駪[[(NqMD?jN6ez=Eԅ3}(+̻⽸|`8ģ~zP%XR>Ct/jX{`<EtiǬ=2Cj\>68:nqI{Ϊ +^1x6.N14#ώ6z`0ɳ45@ Jb.{iA40@&f,fӻ+{%fff_P`(tg.9j_Ѭvo3X܌z{>ж>^Dvp3DM<@1ᵻc?9ނ }UAZU5wi hijO#7 KU,M2@X>+ Dq\3WLbf,ې' d轴4i̠Gz0-Nj}03Z͌3yh"Җ42w$ƻv3 &(&]t;3Or E[5h0s4k{3i(hf Ƣ D4-* Ir{ܛyT8"I g+f& \dގ3s53'prBTM֛F>YЂg +3Gмh%& ]].IM5 zY z.X6s򪙳,xkf +3gkYVܥfZ?YzsKT3F )rwf>dD@W faa1f}gJ bd ¼\|1']cX1/}#%8CTG<ΆeZA{ 767IRMQA/P-IA0V6!Ê6+۠ 8̳}Ӈ_5y2 翝ؼx(g,s\Qlt}]<9Ύ=Fp#^}PԖ>׳g{x8ؽSs=oo? y2gR>Y 3j4) 1Oڰh0 +w܏CmB40FfU5Da(}6^PRlGuSC4 䠿o#wk*AR RFv6}߇mįڈ)Ȗ6B/`(km$yMEŀ%-K E$.xt}89?<|'f 6qL8$/睕066T2莄j4}adsNz 棅/b}ԝXA"D_Qe^gj(wD!h& +`(G@2P8'Xq.6OjХ|t"Cd\AY}|qr4 ;iFy EXoKo :FrS:bjߥ5fRS3,]b@bY tWբl+ 4]@K4'2&g0YSu<+U AIG+H6 Q +endstream +endobj +24 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceRGB +/Decode [0.0 1.0 0.0 1.0 0.0 1.0] +/Filter /FlateDecode +/Height 413 +/Length 73594 +/SMask 1085 0 R +/Subtype /Image +/Type /XObject +/Width 1004 +>> +stream +H[UՀDR%`BI}i C$^0&$*#<lt{A-R IӪbm;mfgfw.;3;}nmfwh8t|s?'`ab0Ii`L/؆]G!Kn\/-wӨۉNnR%:%Du?E1щ0o)&K~{sOU',=vɓ:]BsGAqnnU^-u_aMR /]l83#Z494EK!χ2Mwτ9TzDSq3_|` ,{5"o'<~{s?HOg_{=*/yq~;慱u- r_Svs.\*S3<# <}X=d' +=_;w,H + 4- +j\<#oV& NҋZǘ?/ܱ;[7ݔ  +LOf",sq3[VnpaJEzB;#oV=^6U6Rёt!* |Rg%x8/ +/FLY9`4>XTWrT/ZG^>`pWQ 4m ?!NgUx*vJW翶?噺 +>k.m*; +,[߯-E Z,.>~\\ixdMY)z<W/w~xi*>gOʹpu_sOql(RיW)VrSBi+u.3+ǦP^q\Z!ߤe+mDYeXn]JkHC/ >H 9^o]=ݕfՙ[fڴVXf9KPv卝f,䝲Wk g qͅXL}{/;2^>$LyË@@9y҃e.iAѷV; R!1;<#縺bIu!}d>;9`{0|l,LWX{r3N2sO[TG֏`WX2914:ȴ}*Wz˞Ή/5R&T!Hzf0]5ᥭJfb!j,6fzn!ؔrAt]b=6SG0(G7n5vT^'h`{V!G1{Jsь; +mwCdJ,ձ}HJkʇ *i~["vF^>Rzpti/ 7ěvSBרx +1{}?a?=Q4>|ҵv1Jnj[y>C{9S줏Do +G9e[d٣N}  +S!$VwأZJ^=}e&Z. +W[%jwK?xڎ3g>B/'O( zITG떂#6iA[^HSow=k -XE7ٳ>S.׻B54]>ݟf\n: #2C"UYUeTTW.g=^12 +FjD'@՛Ҟi\/_+nF7NMA&LX]1);0&A؊8N%:qɚfú5^8:0*-&ݩ;6깚 X!$\TAX]!=quHu`w{VdLg)k6,` X4IR?Q[x ʺ7[2bWFYSSga?,$ zmm]mݩLn:xhZIewPJTn%ABArH$\9}sIZNL^9>y>ЏA"B +b4GPm9]c/UYWlYU2IJļtRR6%-5K,)7^a{ze As HAn}Tg{M9kFc`?apc sIf$tu9%n2zO5,0( ]=:t~|م%3R9k&tkaV铜+Rꎟ>x@Reѻpr,Blӷz-@27vIR`LZ "@,A=<'?eS4^-D?uz[kjrA{4OUJ*?pr4)5i97ow<l4BXmNvfcR?,5y$$CmPaq7D&tH8Tq4TuF:ԃ}SY G?xP|C:il6 :X:J Gk\S)󊚁- '[uDce?YuJ^-,Ri[;M$Vx_;r9)SiOāLhvtOE\Y?@hd]zĢ r)Hs%)'2qLeXذ=Zmk8A:,.r|{ ogSbLYDNft,M!f.Wݒ'.(ji74ͼ4=J8հAg'ؠk?lL 8(h>F}fhJWE͙""Jny +2[7nˁ$9wA[9}>?jh5-Y^?+MD ;2vT.ݘw~P,C[P2?d1[?_|(f;]jFz~Mz=][t(~DWHsy![F69pgӻ+֜E/v23 1&]L<ޠ4KNSY<_QٛhkTMLgDL~S5d1p.WA&܍ cq{wkMлQfͶo12`:7muH¢.=tF3A7 Ӕlwtl1 ' +ܤ!E1sF`y\ݨ}4:2>d"f]'aDgfc2dCƩTոBwFl},3#\BܒZ\:h=hڳ*4RADZQ=tjöT>RĖ Et"_)Tf((>j5ꝟ\9$guh +BU$L#@H/#+OUexZm@ bmtrXXJ->$(lıgξZ7:R8y~VTֳ`IhXPO$w.\֌@dDFdې9 bZ( q01qα{pNUPvy)[Fk_c5x+W {ȷp'7&.]3dx^ 4Ng`*⣷>!ݙ3L2)5g2mcW鬛Wƕp"m1 ̎%B5㐦t:|t:D! mh2)Iڴ!itʔtR0yP0Oㄗ1؎1q0lcɲ, K-iW^P$С1{./ԫDZa|u`s7XԊ|xd=*~{uɚaAG&t"J?uR_O@;h5Q¦ݔzmʌBOf]YdY-޾nsmCk I^UE.Tۨ| tz'NY(QP*b'w΢IiRwɎ89PebVh93  %2)ew@zo4ڱm EJD8 YD[M|OaJmjP~'[?սܓ.u;?dwHO4G݄Х$+[Uԓ6?^Xb.\cOg +,R8ШUf!<S5WXUi@0/=oْ1/pDY:#"&NοӪ0vRzU&+R{SgoN7@XU|75QM`<jMMR?"Rsp9?5v2;:r瀖df/<7 (Bj*OBwwwT+Qjņ4UV_| Bt#Sd9yuӰZ^3j2' *k2Jnlqn7,^^Ie,z޹Nl,,9{Y6$VXc -b%\DQ>x=N-jjqDiO5Ch/|~y=Y(F"Ĩ<`s]rJHC18aLjUfBj9k#`y4>"?peGH:bOlu~;>rpUjW+|z"HO Cb0Gp$7'ŀFD(YQFXdGqFi_M}{z'eg0!OІ}?B&ax9^lm[ kS z#63Z FX7{;,LS$EI"@< FCOĔp pJz$d[V~DG'{n]`T1$ٻdxΤň%/D hJ($ԞeP&YtY k JN^ eĥf$ $ :T^u=lXS~q[%qOi1iK^-;SpZՆ1_f,k9e/aZvv7eDN+:cRXXfߺi9k"Qnj(ɕ<,)w0xԕ7ߩ2kQ"Gg4YLa'[Ku Fx(@aM#'r 0ڰJP/ DLH3!6EÅJo hvkk ^˛Me؉RNMk͖l֟64BS`$+o(d +4$t.PɮgQc-#c<'ӭ9NQU&)]X`axCw6T2Rwصq +t| ?z^Q} P$ G H@űKs1Zg 2bNLxY Nrz#yQ4vFɷ7CefBqx݇9Yis4~tJB{4bZRWw8=V6wvE/DTZT{Ҳ:[<TX* ㄓ5 zZ`fե6LfO:f܃8 (T{7jlq,LlitDVf $ K6X R }% lH<Ng$w7wex@Y(zzl +[ft67:5x0Qf,2<X@aVZs(qCFj Zk ,!O$x w?7o< +o J4f8".dV͖Q2#U\䴚0CŕmAo.w}t2?UG s [Y5$e-*Dq]n!HcƮ VP]ov:o0MlІ/NGw]૖ v 4BI|\Cޣ=q4~޳>rk'ԱCu6HڰngG%`xtv185(⹐ +9;.arod2Ͳ2@;i8TRZ\j(%l< `#i7dE%11D<- po7 +z9JYO;RMf&ӨLE>0%߈omj/^AS6#s2ڜ<)* J ̎[ʛ*9?xګ,2k rkPJ(Z4t );o}Zl1:p>;v }12cBcxAWcx"zgyG7}l_L'mKJa[>N>q\ug0V K;/j_>JlJŸKy/o' q Yk4x/$Q虂U~!aӘY1qyKUv ݍc,b|9*|,_Yt'pVZbx3d9K[ĕ5¡j#Z-!j' ~7,:;qÌ{NxOH3X͹ýsu4u}oSd|c0P/vn&p|T!:e-'zE[?~:ej|=;^;K6q1'9[0Nnvs9uӧO0)`FD`.2?Oѹ`pdwIy P/v˨ԳD}3R/;+rT@88& sZ'QRx>/b h0\4: +ijv%sHri-n0D'Xod` /0><{黻^k;=SUUuIXWW^W|`Ϗݽ.01|;y3焛Gv]u #'π!*U:ifWnx|+~'8\f5QƁyۛW@/gH7Z`8ɔA0~f_TDbu,i|o*:zF@<:a z4Op!.j~0c1THiݚP~44;zJ n .^'/̘Jrt/0Eؐ4CHo>'0@aogm>}KtxIѿԡ?/%+PZ ^-0Ӻ%"qVOU Ǘ۱syZ%&PH[`P'fM0H:y#$qڣsua3cxioyT/;3=6+I$`xRޠi et@tՁA;pkvg+ZBh=-JPÍ-{XKgxC_AQW/0}M3t K&>iRfbtLSj3싗QPqT1²q9{'ou{=w~Ilm=Ю5WO@ɑ=}~bg_4Dob''@ G#q2\b|hQڴm+m>M33}HRijBV kK"Qzyǟ707@ހ5 Gh:R߯KĿv7?w?_ +(eg(̇޷qyC(>),Ѫg#اd/^^򓣟m(_ewvO=%vytـIDwvyE$+yq|9y.=!LEw$j- `'ri<ꯖ25Z@vprC1ҰBaБH [FL-kjVНOQwhZ*֘QISzadg,p YI ` ī^H!o.=pUZ5bQfUve9zx0@kS4ޘ!wF,XIf:qyܹdiɒ{,5-e HkyX@¤c'kq H4H~&L8dyF.8UoLJ E t768tS-q2Y#a0G܆E,$3@;|5%eL:]ժꗬ Vm1LME}*^>%jﶟWZ bꚆǽ>:0&) ̍Q`F@{԰4}cbt5L)UqD ~)֝|=64ƁXɜ11W쎆X\g\^Xګm_ VM9 3ON&TnK*\/wi7?W#8tĞҺ~z7?˥DM䯺a E%ى%5g3|,P7,Ҥ +W)jh/5>Ņ'eh" *(g6'gE'kgQIHFQĮ&52&m$[yKv}+V^amz[`^DAFSBȔV %_MVqFOBc2:3i: vA$LѪ'eX`SY]l$/c7)wﭽJ-5շ/~DlS6NB6Nٝɳ7YnGg?MAH籧+syD x Bb>[G\1<7Tة4SjΟq6/=g]>:s^ҕ֬/fU3NK=tYr&y  ?mY{hQӍINÃRD(%*m[sƂ4"ZCy[tJk U^OɁ]u#!4h k`` fRþfCF$8DaI5΢+SS)λՐ4~zg\kx 0  YZ_[9ȜCUv, +(m){#Br#meղ<ş<wGhu2? r5ٷ^ RAtnQɶsg^D-^'~qvC zrF>36[(hTaٰj1캀!hm^b~@ia3#@߼ѧGswU<}7jvWX\vCYʛM"ެKH%p42!* Ҁ +m?UC2UzC]38- >7z -ԭL +/yΞ{q&Fw839mG מ~N#.bg#fo[R4`cBYOxũ]^Gd5_ DwOu'&i$c4CvQu^ټs[ I+m4r="g[f ք)o]bmyUEWE)-͖܋k֗nQ,p ІՎk)ES_~`}Eq ?nbɊ;MƄ&3n]GKca1~kn`Xs/1Qf^E * g逪c+~Y\>1y#R:bj.!}:9N\;t:,*E ( NtY: E>?DҞ:-?*d᧻Ezr~. L +|#zøz`s@Х b@>1X2*qz[Aw’Q&Z+Q Cei~[-֬/QX)Q0L~q}(~uq2@[dC>-4n+(F9- K^/ +!Kvs'HP4]55ԣ5tA$O'XU'F@!Ivb8%&1Xm\鱋z<^ 2NMdYܸռ!0m3 >,`^X6?HiʏO兺)2ys@i|#RNHzkpc2mi;f=jK&@-)fB <@&$)IҔ$i:G: ^ 6vLxc0L[%[]I޻Z4|g,{t$"X ̋<RP` .}-}k 2wr}VaUt{qUe=*+OPQgdWE+K̶4Ryə8*ǫIrXۛ,Sӥ31_u];'c#kKEjUMGn#h8 GPpE/xiD`J3/,/AͥK[ n0  h +\ ?;kG이D"` %,eII15  $)s$Iu*Ӏ #PVO)u`N +@,Xr{U ;pX@U;f:Uo;bv3=.ܸ3\P/SB?ǝSOX@Q4V7ߩMcZ4̨w$Cz<9#b2'^PޖUj xv˼Oqp`m$Neu˼;R-H1}59ug/ `=Еh̘X!ƍb͐ 8j.X=/&6\',lCҀȓI3tI w\]SoQ͍ ])CX|SܗeVt[%ڜz4yBE)ȅ3 %>36+dc93ȱw0@5:V;&]V4gDPȐ+CB^;N=? G-B˼-i{!L?2춅}а@¨At5^ k#ёxWKӟ!$5vrSI~3YW߮>uKS]tI0Ss- N!`pH) 5[̂ٹ1oH?*\x{ uALxScjL:T-(+)_x+H Iѝ*+ܸM)=A;]?t}<HM$0nq}+蕰-0D8ѝzы2 0"ȣQ%ʝ}q-*V8'(};rtW9Ab wB6;AD@e̖Wh\9ޯLif5|ETTQ}WXL7n? r[XFFD؞!Q4{+шzI&fk<"}*ZVJ}mƇEfPؑ脹K\ݑhD[0u5~vjTaEMˬ9EzrD`L`}~kәNɜ`@ی9vS'YWJ[.;%)L2-y= XW O5:LDŽٷϞ[t3iJiXrK:3K~]|bwh4i6XױC!˓|ߑ/ޝ"q%Jc:,nk$!Jӹu/ u Wnwy0LNQ^w<N~rJN%RqqwWA綔H,fp# NjtB0StX1=G)#t'$R"< +7"2vw7zSWCmް?,Sļ-#Fٍ'~kʼnK͈ +68~( Mp2(s4J>:<Dž`xw+C#|q 轷 ueJG%hk]..,]U:Fbt!3C+,B_p{rTc Inp: =2 +*)aPțު:hH7AV @ p3"K9!5<vsןfHyʞjx%80S456_ 1>2&1;5-cOӜi[xWbXNp]PE5wZ :9G=@i}wā45'u9^GdըcY6ȖUu\o8H{l;I|q_ ` 4hQ]AVL`r. T=1ʥh|A[J~1##jI.`Ɓg](J;@dxcFgZƑ^DAm B$,gꮺm,cn2eψMf9ŗ@89qlQ|۬̚M*9m ^_~K~fKWcx[|v:Lqp{0h KX&@9wU{j:*&J|$|0^u\郴%{z%D*$IQPgG60Hq/ҵt`W)O02bmVX٢\`ۨKB48WxpQ -|$عxEF&h)#ëb$5Hm]A@J} B8,Vڬ3l Kk6ek eUI7ggd=S )mD!XkZKD! CVǦw qBҞbR ρ 0Ƕ†vQ],9NTtEH]H?r/Od2!Ayn񜔃LUbT2rsxcl:\6Xt\ OۑUo.4?}٦"&uoIhX?? +Riiŀ]pi)'y/z"xpM! 2^V)NX C@Ce$al%,>wjWD k r FDByPmǘa?P\${:a4wcaxXd^F)²`wvž p2 +K EvwyY?ۥ71lku:MgV yyNl,?9_ƿJjCƑO{VLQA+ufuW\Ai&@yYRb`&$+A@U㇧ũ|㊘Fwʮ9@DSX,7t>g|% Q>[|s'!K_?+qxrY"YB}s ZAj0Ko$9\4 G|E{E=F؞~_p~ d".E[Ʋyu>AG%,ac7N^zpfE]IEQ|Sh;Yq/RSu$MkZ;ىo{ēH N^@#&jíZ m[GD$`n ;x!kϚ_7lV=d(;]XZq? Z{xEo3Ks J;*iR;a I!=H;l]=@SB'mVtCiN[_z;d䷘~+&}8-3TGcO5(t':u=;k3,?-l@XH5;j^i}__L}rUq0_>3|LB[&nglX>1uqLg$\ >\&nṲRU!1S1A[ b_oF~iEx& u%*]T*dz3{Ԡ]TR?Y%ƐGJH~4(dXbRk-עq1<.3$i!9/L5e@ǁD +K}߸hDG4ÉD|MRD )z}&֬-eS26e}IͮGQH;״HtRhR۹+ +4zbx Ȁ/3=\ &IOtc0⿌ +Ÿ7~qZ lb~C +|\Qz #Iɉa/9Hi1 +d r{/#1hax.u8MŻ{C,M r6_)cpD)px0 +ҫpۏ8UodjQut< ݞmk mSK;;#c`;ao㤙,\rUX8-4P+陀ʡsRU:5JIpMI%8c.Kntu;9cFm2U+pʬH +L9_rͧ \~^,xi[_=H #Rv՛ Mֱб3Ch+̽p8H '}RQה +n3<mj{ÄCTca9*Pvϲ9FuBw}?<%$hllx|!}A&?YqY0'Ó$fWA?R !w_ՙ !dBA$9*Ӡ0Oy>f~Fͅv&h|`-zeGgoͣbDe6qu^e՝6 XB{^/7RHVhV C {>v'M2\7_ /WoAկY]O5mw[PYQGmxzǁ6 SHЈqM܇{DEԐ=< 0NY,Ȕ=5,[4``B8Cx\)E'l)'(J*NKOX0=|~0͢@Pr'(lvcܗFSmԪanqCUHM!P~g7[1om[\bo¢ +wG:< ;Q[[mA$L o<έH*~)5ĦqRV)M )o^MĮbp .}tp ;PG$L.Bz5 S 2;$ +kťY{9aJ6v<(6,`Y&z +r3969 ~ƺgkڦǧc5 + exa` ƒ36=hXn,|NsI\QD٥dc.뿊`wKzWM3֓)J&,#?1)yVx|/Qn׹:tzq7;,Krfъ#'B NA:v^paZZ:].>g> Bq3<џ{0tg_ ϱoerMapG㒊~DG=[f D +aD O#YܙDޱ 4+V1FL"MO,}̧T`FK7E_h n'To k&18n )JvdVn|42t;Dɀ6G(C%7J;Ž%Go*OdxSTҐ4~rp&vL{~Euq2I>fNG&-!(>m4Il-SmmԤIL} RD#*b0DawٕeY@X׽w{sY68ٟgp޽=tGգdxFsr\o=dc;eW}1wdA/t8 &''nG;( %: \3,hhO#ɬVH[nr>>C!T=jn)jz[qdŪw 5aj."Z'$J#v^jyo$ՄٛfϟTfbUj% g:!052שׁ>ORȒis<DD$"1^C`q-E#Ԏ)w&Tu것FrT,84_߂n&h{M&Ugec[=^YMdI4;_b5ܐҍ׋',I*|g5_%Q_rcS#=juhˤ7ɽP{+輟 1q ť'F0_zeo5u pO `DaڪGU ]ߕ՟0aiXx|Si髻 *tv ߯mCǿ*\6Ok38Q2J޹vrz 5y2Q3{_tx>/䧚Ir\_)ß=Ms6=c߲ d, ?ڲ ቝsߪY$R|HD\'v0|1~Vz +Kn H!b|tM.^(~qH:Bq839 jC00KCXkq w8K}}2I]~M:9NA3 '$3Ke"WǰƊ>_-8Fs Tdn}lStss^ /3RH}N-Rw;ކ%Z߭Ey楢o`#fxlROTtCf`ttVxcecؙʡS(9$LM6c Yq*ѝ1vT )g:%vj5d ?D6om^9*?|+-6JޟuQ rg/R&aj6Q'5r&Y2dAF+USA{h(I +U1Pp3|ߕ/-~W%F|#h`^?Ɂ@1..c( +tG[1 ;91]G}3Ƃ^u4((0,86g/eI#ץ|jia-!exH԰whch yx ᅶokU,E[U$tn)$' + +3|ŁTG(Ӟئ)>/\!;ZX*FЈK͚+/.a,OK{O wUp|Zn CQi %fp)0[9 O7(/{+!cxї'cL*Trݼj]Uls 山exxi(@L>maK{LF-^^y=V|>${hk-{IPY_CMUҌ="fx,TxOe,ħfJRI"KtLf޿(1Gz[V,q +r&}2 /}E8DeўKvևAvH|ZO 7vdu@dvw؂a4 uFGl(QQ4,76Zn*L'ÃKC͂f +pIݹ\q !ow2!@G$GuɤvtfM'#`F+>[I&NRM['3NM5:7<Dh}DEPѠ"\`]sz/ Hyf{;WbE0q=ËÓ5[Ic8HӨc5A>-U1!6KFdw-S} tڨF+nīU}fjNѥUK%mwcxo^bxHFD<,!U,^`xFؼdxPXw 8FDe,q*/6!&0B^0HKF{W*^GK7|sNYc$0T&)w9H(O=0:6rRP'^ XĦ E~[MN +o4 +Kk4}EcT^lpV?> Ya(`u^ 2xp~~Ku|(씱?i^\~v,}x% E(T}o+h%ew,|Cn:(`7uYjjF$(HaIF92 fw&jtgݰOASS3d5KE +q UG`'gQYĥze?t#Ybm\~]#/c /JARqFzJJ13 $"M){.xp#DXdxwNՋ'YuzzX՛g𐤼80Cmmuv}(j42BxI ¼>|Ⱎ#w-NK-0vd a<$b؄u1upa{W5g]^x=GGKA;YiVOFYEZkæwh$9cяlQ +R'zoAФՏyIQ} e 9nS @E޵y{F:hN#2`x \KHҥ(#^Q1::hDJx|~nSdx*7o}/9M0~*!r\PDuם{mE7~Ufmih`^G\<L dROv6COJ4yEo6KݜXjs/);bPWT:iL4٢qO>UZ K+W瞿T/RgKO(d5oq-v݆q{p u>?J%Ûg%qU8s];6~y +b[g2j sS4+ēQhu ̓8-`W,,uzKVex<9pqmnm9zw=!vw{\ކƮ;Ϊ Y#M' d1;ĕ i2 c}~ +jq" Pr.FDO)3D,meN/<~^>NPi0^eO?Ai HS +Av}퐓@M/ +Zv>(Fy[=l'v[-WQ'#9z)ǾFO72+H29WcL8.LqڴtLڙP݅jIzLƉZؤm:I@bP1JURE"r, ,z^{ -uþ}C{* @,zzWj̆+;yz fM:YP<ë(gBa8Ә+aü:׆% +v{Mqcx"Q x9%"y4k +m1fx)J6'.RܔY6ATJk ?sN[b2ǸкͣH*i˗h_uvN+ف(x)ILJ9A2SǤ.MlIٍ/zg4uη4x^TT\aʅſjet0Gg5ypZMj\:O P l9U g +l[, ~f{#$?C`cZUх!"`glNg`QU]7 *ͥ:>=l +!/7cxL>c rt82 ;p]gMpNn:{9XjG +a>OU%ií6",pj.ܧVNÐ)׮\[u֏|8Ľl<&-gZPq7 c6-/%4(;aE&T<37ԌS2}ەQ)\W|Z6XqGau^i'I?oBbAkt0 >Vpd%{p, 2!Q ?ڸ9_i 5#xW9{4St.H <=ZЂ&vzJ'ez!:n" IL!sLi[e@s1|<PɹV +,9oFoHPRjeVVؿG*s96y} ã\F)!yFh1^7/3cSÇW\DMA$uY5lVN&0MZe<>\|>'D -hm7yPnDȍ;`h#n@-Nꁻ=LReY-፦ٖN25H~p~R>A\MC_tIAo+Zq:\ÞG>7zt2?"a8i7n+NX5B!ex PXj!ÕzJD0ƴeJWQFP"'i 9^m)dª_3wiɃԪ֤]l 髬j$_J#kjtrǃ>H<,=Ā`Xxc!>.># _2FPmѿp,*clxӢS68wD@RPfniMXaK8hBx;/(nYɡ}z~:T c𗮌G뫿0qZ-hA2`0KPn*BQG!F3I#x'N[$N2w~o _9-;9* + y sN?N3!q5,g=Ԓvfy +%M軹ydu&٦' U.vuMZaCqS~fo{y]G(}TC2y{xD#|[o9? RJ*1nFlJ*ip-IDw/#wuãq"Wo8x>sl0_/K{zd ?+65$-hA{ :r,6.ihV1գ}Nγ8ӡT0W5Yio_ZnhhD{gߢbo{53|JKЂ )?i{~^dh4O4>AxĮc3[4wwxOn=k^L߂w,֩Gm.%1Y&sk|LԈC&WUk;݀Uu׼#gx .8l+6rm:xD41Zl@DŽGBu) :J@]PQXjll@(v@blV#4!P`z歷wJ3fuV-dNНQ=׹;Z}؛Uhb+h%Sp>3.BvrrzwW7HuڽhYD(|&)ݘuNav;= sVa{1<*|2 +3poK0 e$5_Ĝ:c:AhGjYxkחC&g1m&{~Z2bl˖}#zYaE3 H  + U ߃(.^q~m. IHBIЕ2CPY3/:>fk՞`R@O|"⋐[_\~R.~ts]kzZ_eZ @3aUO'-Z^ P#BTR!\u)YɸϚOl%0m͊g&ei\ +V85 x`DVϬFqHhCf?ڣ?K)%-3ٌγiYZy]O ݝNj[9,lS[d9Kn+s-ɫq +ThL@:;oz[!mۈ820Gf$i@7?< cg7P SsH>ioEX')7m*Έfޒت $ϐfZ*=,I! IwBd[p*pL.hKfp>wdKuOCiSASE5:ʀMCw I|V6<n#ޑU]y`WX˴vJ{n sד|BhYI2ycυ2*Zotѹh wŶ_M\w7iә&63d +6 sZJH hK!LH2! %`@h0e\032PrQl|H)dIvキf"x&j~}?o|0v2Rg}_ ᱘bBpȫhׅ375v<9Uyq̏gv8>[C׿~txF4-;$i _VQ}^7 NV7Z2yfr]5ldfxG=uN\+]$Ā$f"_A Gץ++OimUwuGXNHad@ǀ\=?G= +1i"L#4 bAVD!"^ڞ^[-* iPQ%MP- @MjUg[BY'*߮\x X|EEx⨱7VX{ X:FE1 i(m;ac.|n!e|^gAcbB&{(yշbQnD;,F8 9ր~ +d͟- Ƒ,XdmڜRc +/,6@P6-4]G01Qѓ >n0 D$SP@ "#Q# ?Qz޵՚&3u@m`)1 qюP[exFx[_Zxҡ6M&KMio3R0zjg:DGjo^PA86D)K/;1*c R1mNǎ#p5+WvńmV + h7iCgD=#=}x*X"Sc4̖ѧw缴% fd2:,r-POH%R5"v3W&6l:$J+a\ra, +<, W'ب7JKŒ=mkΫ`8W,ՐJp\eĜDs9ZH7YjM?T$};+)U.(:N9uV.9Op[@"o,),E,^xvis%: uE03< Bp!DM[{%MetWHpibnl-UNA"L|zɢg&: zv|;c]ry̪J鈥]?!}Dϖis'~D4çGz|ebuIy^C8Ilu!.ikF9UGS[}@HzJϲgTu*%JPt ;CHgT(& q'[ś=Py G7}7{_p^U RVAQ|T')@\fCo+{ +wt qʴjT)4-~k("YQ6p3ўSP抽@{O/BB+o~Sԙ0''!&ySuO뽽!$%Iuݖ̩MT܃1w5n>;<+Lk}kU N #(=ֹr4?ɰ +ȣli]zҜZx`*7NZ[Oޝ:YPp #zZq`5432+x\ރ[1<] ӚE(|z  n8-BbP;y d9 =>9CA:Xr,s ބxJ,}Xzvu)w +V%~:U/!ѩ8lLMdgLz~P3q2I3|zWi@AdjG2w$2e!r 6ha*Ri+_~{^D!G0|< +/ސ#Q +-)9. +I0IRI=qw"4 Cl,؜QwJg#;17۞s9J> ľC3N|&J 3EpMǀyr̚?s >Q䀑r߹=\|W;5-?SI%Sc~PbJ+D2VB9f3WdNE|ϳOUᣳ M0 qyaݜ g߄]tOkYzx +:r3y{BSWȷl/.qb  /v//+` OcdGO !?׎,5uD"ua#RLta!ܸ\6!Yw,:ʱ-mqQF@(6a`o`Ca$'4pŕ +&dH$Ni~}z#@8i2-i?2mg$P Y`QJ@CȐf(9M i!n,q 816ƶd C}v'`s4t:Zv~o߾BDf̞UyU  !LaM ; ̋k;:9R]%Չ3 cQ52|JF%Zo +&0OɄBhp{6W֬f$fY`֧ +;( +ȷ20|vGkZW/y%E4W1o^+8ЋU+c9fDɦ=)lΤq1Hю]u !U5(((Qx%鸺 4-%H%ݬ!4A~"X?f^v|^OP T9Dɶ?2%]K8ɰJLAPG$;sk56: 2=:]=9EOA: 93؄Ԕ;?Xz\ӝA@b2_ dL=ަ殼Wy_\bn剉ib0i0i1sa@axawѧU"Sl?!~%QNV>!1Xxy# 8mv DAJ>z:kڙ} !*\9t=?߽cޣbx^@yv7­"k~e}CWw| ?_Ux'M͠O+Oc +PkKxn)4=2|V?<óc -Kހ (ήH'; + @}CqI3cx}ehhBxd8mrO\{/+V$vS/!?suzk:K͈T5 M|5w|0+>(ʮX# L9D]3)l6x{Y:.'EsKK!; 1`+e{Q'x2߲y&#׋ᅭyfՇG-N|6= չfѱG, g qe~aG2.1ם>H7l-OuΕ:T:ao*:Y3~EK [{|^1oyXmV6I)Q5FM:y(P;s +<.{ Ii)-Ӊ"> Z9LJA iםJ}e`%\l:g'uZ]ta +PV I¬NYb]ʻ% K.~~ޮ *V"ƲDad9[,3]+1Ţ([~G:kՐB (y`v0Yez ` /[3_6~C ~0e<^V5 F5ڼD<5L[% ]tpb0[bYc'-%8i{bealq~-o!ƾeXҧ5#S02Fyd;\+np"| $*$R@ET\%/Pk]RNc[{ u˥$˳#h[[bX[9-?-/(B`)V4imo|sU YL!V@&La (4Y30cF0 7,{T)nm_z6A1VTjТ}ԡmЄ`55 Yb-uI( eȐ@B?y4 Zrx}p>K}HWLH=yɼjSPɉ!6LHNu*L>tyHe:Zج ř\)Sߪ8%$jpFA֏o9۫p݃V[ rfT46<.E>y&l{Tw_c} ucԆtg2y#^Us|ȘH!Tt,i)HMoAJ=spdsER=<ե]P%^}e+^Y}mQL[]P8퐐;6s4tCW̬Ĥ IW(a:@H&ၕ?47}pS֌c:cB HDx!/ԗ_l51-,q 4ށ2NdKU5X(7zةK q [:\CzG8B7*@23QN,97IpC@04B A$vqR)爧:"DMcɞօGkܾt+~;Ctgn{C?x>bdM-xYm>He@n9 E/sٜՑfUwQH!X^ ofS>YPZU/Mm.;bvv +PGW./ C1^3g7rB9gN7ו Mc6K<o^ޤ i+5b=A| (YYl/TgWmV?>ֿ"8 +Pk_S 9`|?3K#O~FȎb{Q+\?++p0˒B[xB+yM7>D XLu`N&WLY8Bo 4s۟Nrt{z\HY + QDL!W<|ҰDм[\*w:Y݉hLh1=Yษo@w +=EdQzu5:ibTd__cO!ny2|RfP<ǎPt&jˢ^6-٩Aو'JO(ky|{PoEЏw”7֞.jwq}dxK'D.cͅKw)ὤe0p0vڲ5od ˳ |06;_5yNTt19὜$T[jY!2Nh^Xh ioz)0|aFaai+:&Bǫ\4,"%әУ==ΚĎ@wŅ[??pcž'k`ߡ#y`@nȯxX =7{Zu'л4סF:c`+.b%irCN(4 ێ|lJ YˆIkm{pWdVe &"}LNa IٲwٿTTB <R~c'±&K* ]x]'3TO3^WⶢO1vC2^?γ 4jk:w9rl(ޣ3Lg%\VgF鬹5_\n{l]q dj͞_G@}rmj ڛM&:pQ@z:Lڷf}ƞuȵIr nx/k%CHI$BimBvLL)Mi!% +l`]0|c'x,[MB@91ph4t ApXC-ۄVpnh\?md%잻uB GҊi(u=.\H?hu1 5-$e IxP0<^lʑеp'5LxPv.1)7C((xA/ݶ{`:% YБ^>*Es-o1eƺ-kzvm:@6rIxLu\F%hzӧWY\6H$@ۼ>G kLVs1ٸ'f t5*9SJ =Z׶~s1{*]^ o0K@JYNJrB `(#GppZ +PJ +@(%IV4oC>,ARR@]F lEF]@艮o8Lj#XLQx*nB}z/P5g[wj +4|E{7F e*%]>r-8*jXqmD(,_|ՇWcqAέzg6`օ|N=MtL Ab7b;A``i3]T_]7c1AТ2%LeIѫ^婳¢c49'J ghGk5ߗQųsV:ף= ++zx<}7RY2gK ,rs<%7J-VɣBj%R|_6_$$I,w;0Ix28~Kw j X-r0;f;2XMV_?*\uiC % (D6lj뷑\kti7`'8lf_`Ӷ1 +Qѫ~38wb<Іe\(DVDBӬ7+ o3%#+@yF%`>9 H20rq1Jzkoԗ̩pˊd:g֔|$ߏO_; n~RT =]dFDx"uv]^9 H ٝfFd`F7?>ktu ēȂ">gѢ15xg_^%O'hz<68bZ/*I#UjhDUF@ۄEJڦ@DKRBmXccl PpL񹻳=3olq徯x~ϯj.LeSC7E%] 7]诬VQ6̨&muKPZIgb  P})xe]#WR҃<usՙ߬ytyU}X|&q%]S9 @*bD°uȇ#26cqOIo<*YZz ޢL +ږҦ~wIwaoA#z?5BJ!R$x.>wH 흞 -c~aCݫW\o ;v7YZ7_jz|DD:-Ӊ>5*@NWuut,+Ƞ]d/nM7XۊE/s=Ԟǟ4eUk*rkO\NwbI\VЃ$:X%cH(zH< * da ~N @\^0oW,R26t '[]ז[4\S䥢=?oѾ'=.;g,_]?[R +I. B h5#0#0[0]`JSa\6{~q͆K_xe\QUk6}lׇMu`@2P3 RUMgylbq@Q|vq}syw_M>h~Ute+UX/:skBP4%+8$y'l)a2'IR66+H&QEp@*, 2jhRqanb-Jy^bŞo宅 =1H) ӤrPYsg\>)%^,>YfsZ㾃җ +S ![.P-t_&m ecˋ4O_ _X*a.AeKOC^8acfO9t}XKVX +֨˟AJ_TT~@V1}`Wv׵vNOgo!1X#-kENMP7(+`y1n~tS2x*g ƾM8l([^Ȱ +lbd vAxݝ]^ȱ 7:<%`gKH4 CC:q$PYex$\,dRxv)g 0Fc HgMIž9On%mY5Կl-ۥPo?<Co 0Ri=44uoO2`vPzs7Jsh?I4nhu M[jӠt˰O5 xe)ǠzD~Ӎ?~Xcg\ɋeٓŽ\tO?u?TJ㋅x*rt!ߖ[h].K +"7e(WBJ*Ќ:%&,U(*DZwJxUCk_d8 ;ː_ 41yM=)Oѓ;2c6Uf4E lhx;p`+pYTw! ) b5)YesdEroZ QYs013a.4FI6@p'?cϜ2=íp3YT.umeSd8s:)$4畊.J˄o6 6ӂ; be+=Y`H*׌ +9r sZpfBKUXs0`R*d Kִve^qH +6Qm\<,5Jk9P1)%j] ,Ѳh#/2:v|s3ܝϪoCI[b+ G;3jZS3|`,vk7n 0Aqۈ`q;NwM ; +p#ߗ:ԡѝ2ȟ7OudTFHeWf& JBBB%@TPoOz3VGB~seb'<ϗz%ܲG '7xs7ׅ{3dh\T1}ѮYfyyT;MF +|Z`+t:Y#|I k<pxB h9s_ۛa@ݫk>&|M>T8q,[|dS8<(ß[rO x/!0MH$9y/m7GsCEfT}.(p~^;ҿ929k_(6!Ku Oot{߼y`/`vr2S^q|gX\YzTZ:KhJE1cIqO;3O9ݑE˩x֥jo >6`t_Y77I׷0O|°Os?5^ymZq2￟wOԭۓKڒ_a.i~uWƚf~5Sϟm?*'Ki;W7eMxae>42}v#aXW`D:px%;7k0J- /˯֜moRNB 9;D b' BXa՚ίoxp&[Gߪ#j -zu+ +PPǡC;?gOg*'**Gӕdg.h4jk&D7N-usxJҕ윈Z&uY0݉2.O6Es)6PBR"d8ʅ f\|=(i'o][w$?jcxHcTQUÝX<*垺Me"gvm_/NdOe{OGt(S6RոHQ+Ҏ$Fp$t߫~j6C=2P|={7$"Q6Wڼ5fFK*jH}Y+[5 jPgį}JB!dm2U!E8D{__TGE-ړ 噶%^!< A'7Yk$dSћ_Ϣ/yj?._L)^ o:tR;m yl;yXu&W{_nKTy#K%#ƹsgOdVvXؗX</ޖx(L\EQ!6LW :5meaF}r[{cS]=Q&.,HxhҨj +bwuw &:3J}b U8hׇ +w"ͭX%~uq%NB)U RiEZcUtYUn $v `*5*;b;&Q4uCIlsc=7=?J[ljỏW<6@Ɠ_{Lw0/%=6d] t ey u3S +} o$0̾tu0 πSٶD*tUfwMH_?VڟZ|e^ u28Ukf !sׯcO* wMUIt r~x}nB9Njj$:H\]$cg#g?(]y@ +~+ZvC o=ֺ(uSՈpϒ Q;2p~y+auШAfWniGT~è#=:  v,qI<囀^G`m,o:ڋeЭgxWWpap7r<tBGeIHj]G}ɼ?յL49Z݂h>p?Z6LHs__L㩉ZX2ןmmm dYd7|7bOsώ[#rmD&,FUy39=۬u#B['|ˠHgKRLtSU a38A!ZE1@5eh13C1@ nUEM\Uzu5ɛz0 F\S 4z%sY7`{=`l[lݟFYsbI$ \jHkr-_(vɜ- kTa"F $(RaĠٛP4`l*AS8b0lI Z;*VڳA&0Z`#+2*) W'rva= i0q' ^OV +.3 +E2`%;K`%ȴYE^08[r"7/0S__5S}fm啯dr 9kxd!s*@@z8_{4Z= %Qآ 2b',\fzDoS‡s^䀖x2Lg\*`<%(ta¨r6 3fъTShvXeH:׎^/ Fkش +z> Vn_8]kqoq/fseẉ _`F|c8_K0 NT1N6,4ӿ4῱U3⮾X+RѲOϨ_8(aN_^C> !ucH?35; V %~v5l;+Y%[Fg~SI3\ƈLt fx7?7½z%,ݴ=9"D KKOKdgGsyZ%KJVQbqVWQb!~73{'t`p e3 olP6^Iyp%##J1PW8k Ofokج!{$?)gA7"=ы4 3{)2\d>_1պC}fݲKXG2 ^au\ڭK.Wc^6׶.bTn)Gsj$n"P]mC E@aO\% +[;,OhC5!&i`) K9R=MX=C)`#U\ RY\ $MH!T +J䶢M+UmMժ͗AmUmS5J&U ( `c .bvvgٝ8J@Ǣy4^<HYXrἾqȅôn9蘔}S Gw{_8\* Ⱥy*_~׽Y`xb, `{'˻37#bH樛sB%Fa|k9?0W5ghS(fU +E#éu`Kj&yri Jv4qk_){an0i<aߵfLE\q8ZҡVqO93$(zbg"I@&_-JHHsys49kv]vKpX2bӋj ZDmó7+\MkmřfɞgN{/}HyyrI_~_(ȭh 1Q@[=/N*z5l]S-0^<fU k 9,Ǭ.v;,12I @/m&5o$5kT_#H`qMlCsjW/,%FPާϚYwTx;ǂk\Kdjx!Dpsb-da~p-r Qʣn.06:~.~L9iaI_S2V>$aE >Xv@I%Fw!KA΅/ Tu#۶H1"4 HA-Ҷ TM%*yeSHҨ0[\qw*lyuz/?Yn^Rʎw~xp%ύxޮj0m {>Mu0jSQU{(F ge0ZntPaOt"iYq#8v}ZZVAJ̞ ]KcEAcM^& CO=G¥ռgWɿI(Hj09'H`ibm1Q o_<f![@=KIڤOm+/;\uT\{1&|;}ʕp[Ou^dՅv5ʝdJASH<5;/&Jtps޺:2e}Hf_]"щ]nd3g/-5kE%̰:g-9ykbkE:o +yT?nҼxbt3;gBS=puBX1`lhDգJ)vM._V-4[wK6ԊUU/w</ _Oft/6&?1wSFQ@[(DA#Dp8QL6ˉ0? /3P(4ym8NҬn]Sɯ@xQГ!ß& 8w# ?9?1Eo\JA~Q~8}Q[Wԇ[A<;͂V%,oj󢝱W׵SaFq 땲0A~}k1}Cqݡ[°7dq!e [[BE6(+dٙ&W2%A=j~{oRltn;1ys8Y̆%AqRl'R`I~G3)97>f'wC(qӟ y<JH.}׷ᔚ4prz%s][x>pNs,DW jqnAɬ.ƌĽ _?:4^˚Qsߒ&M1H𝽨 qs^Mf,oBCr>/W ohFi$i'HO)4Ghc* M|1ļLVw\BL/aIN= =#LĨ8ƶ pOw)iV^ +˪Vq4NAu+Au`p8oR1]^(\\ЬN'OwE:EGb.YX"a~t22B#.\ycHf\\8u!B p_PTvc'jI75.A8j ~Fq]qk;N0)v ڤ@mM&Q6R+5RjQH[TR4T)U ("@  n~bξwggwfsYU=={ιsߝ:ogND27s,H\(٢ ;M ]?:Hgdqn&ḲDh}orHHDoLRC7_U5q."f#\50)>b&$N^ss0<WlUe&5#.OF]aXkSS[EyCX<Wu FL rK4cQcݔ1biC +7APႧɑ*:@5=|jXy8Y%kQ3qRz{"C vn,$EOI*c&! •n~8+2>6)GǸ5=}2؂QTm WQr2{7Zl E ([6[[y/d%+YJnv7?#s~~{@d>OS`zCGL1m0oR͏|'PL{f>,.D(UݼpkJF|־vHtsF&D$d 哑Jمȵ {=+/:#Sh۶kIH K=q('3y!X^EK7 `@ 5Bk7Ĝ;/0$s{cdeAO _tGdc>a G`2MK9:Uѡy1$?|9䇧C1y6 ` jk*M/mv-0 8=,hP q0`h%Dޟ%U:]Ԍi@TL(HByp˸VcD8|phXzτgB3s &k"P⫽՝|6G:Pۨ~:bxct:nIAԆ#}"p龉>%dꯓls#(x,r<%t&Dp:fɜ +(@7xĎ9`% ˁ|/B5 CTmfRXVtS18T.$o)QumA>['M<(I[) 0чRĢ; WS+yݰ濛ܤTcmۃ!d" 1o|c쿞,_tU8 Y5 ql; m*$p;FR;wS  ؏b=HZG*AѰG{AHVh'b8-|} c$HjhwD@ʂT 1aLV/Z+gc^' ^7镝EW>Jzagx=]OSItMjXFo> ~Fۯ෍&$fӹ/pbBNvaVd%+'ր%uY;F`0'U7 <\T]k[g~>rIGW?}b7E$( `Řc"8TG7]cp%i=F~".y^ux mc] 0#?C.j4Gi)@ְ~O鴸%:kj[y0^8FA h1k &%QP#ŎrZ׎njZnЕ(y3q)$CRۙCziK`keN<ɮ PQx4Uf˥LrMV +o^rrXzdJCθlp]E +%4Ǖs +OħKRKF7i鎍pȶTӄs +iEH:\;jmZXm߶\4W5\rJ3?"i>|Ñ$i6I%3مMm⹤n=gxMe|4 ůD銰"V$KSl^Ŀ:\fxJg- +3DP)^%| $nɃrUZ폨:p+9hH[4'BejKfѤ=/Tkإ[{wGV-}IZV|4'F`zZѠYEy(AU?:,QÛ\ C>G|DȚ-$ȭGc[WEȌj^?=٧b~nE[ il%Ϧ5(ݸ/v@u? OxŰspO ?2/=:X$2]ڟ_M/bknnߜZa=zw$b]©VQ:+P_|x/ /n(7>W:9*s1@3tP;vՎs@7ll.g`] H:`$g{0p{0-#y;#9!Bty^xy AџU }X1ݵm'3Тoo6P6YԂ_V +&)+Z5& ttNFU=8;v1mJULl6rD]ZHv[,93kEp6I_~vDyT2/MEdi}-i¾NO23QYb \Jce]v#E޿g"UJ_7ar6U6p6>J⴩O J(Z)s/OeW G/umMn` ⋕~a\f"nE>W`Ɗ ˽1k}N[p\Wy6V4괞ˀ+V42:#8u902dR>i<cE/1ˏJ*JxW"}p܈ۨ:hHg / /np ҽO]OVG/J*}і9@~BȚLj%`]~u'DhJD?TvD:Ħ^Mg "^|3u }Tbq H|d]j/ %gӆMpm1ZCQ>_X>;\Eu @юd-jMu, *3} 1lvp::v(JբUtZ}$7o @ 0<@ $!!@޻w#ݽ=svV:so9|ӹ|[Y/[ex `8O"Nѳ#T7e'"Dz8) 50 |G.9" ݼ;ka|,-=Q?Nd z#z8rZYp {J^ÆuF\A'aeMW=,;V=PhtVuc nplSfD3y!qn6CSvFB: o*MH-XA[R $j8 @TISHÆo +] cуgs[z 6>/~9)Awo6 8L޵CPFBqc`usPc:I)p;smg0??%Ԍ 5n(I..>W޸F8p;>J_&PR+.'VSwC1x yjW(|6J%1ߟR4 :.HdyHLatTZ.,=R*ʵg z3c&)ٸs4Ւ*IgyQYRr43<>NFdݗ\V+8DZX&/[f.PD1 *W7=)))Tr͡ 762ؽU~2]X.=*ӕ3ccnkM1DG (U 0hZǀt,Wſ3'U֛*$x [ޅ5=S?OD7 +gҲ;*D.WuH;~-fI- rB5݉,«tXp BHa];=|~:HjK$WZ(pwrݘ vsm\!z[]Wrc2}| !#g\@F&`z35 o*LwID)U-N:e$)gTq80HcQ +W U zxѽ mWdI(#p26,ykPJh(ix$އ"7ng4P>!D FEsd g:@EnZ7oPHDx~6OcwÑ{+- +][]ǿ{ v .Zgx o +Ù@ߺ#FPƙ^ozKHcίA9IhU u99'Y*oj `CŞD1e8S J:"s+1cgnE5> '3@xlx03"jG0dꅓ|cTTh8NE#r^Ty}G. 34ͨhiIr..>5|6uYET$7Xɩ[ׁ]C<˒Fmg͠խfxH06w*2bqR;#K(0&O@4 Ҫ6EyTEilUJE) 0c]mvgvvgv朙~63XKDa9BcL{59-єȌٯ_?Ǹ6óyMd ϟαS^S%p=1-uHUcx^׎1~s@] +KZ= C,9zI[ K玧60gi t%*uay|4o F6 C14B-B 6~$ex^Xudx k₲x }-ZL.C^[v|TQF\H(ӛp&Wu /:# xw7M*H<;hXә2ç햗$oM>z(}50@ˀ:5US)װO7rT|e#{Ɓ!Et`Ld NZ]Zk{rwsy-ja?5wgGS10UD?k$3//z65bfyaS&YbI)u(.9 cKM3s> 0)CxqCZ@ȯ˵ +p q%F/-fRtMRax?DA=`xrw|^ӕ[qucrQʫvd&uxei<'? ho3ٛԯ 0Cwq6F 52R"`9n\UQʮ N&J KܐX)kѨn}b([d $t.2)^%%e\,x=B -;+0x$o3\=q]!0KOM˟N5QɐbXִn=:m[3;ic3 ܴƥ7$AM +{5rL2K2H1(l)㲅;ƋORt'zZA.aƗ3kKpvԖa @lW&,IøI2&P1/4Pe'Ro 0m +<)#.gO7+DNr'LX]Fß }Y~5Ó} +H|o]`x~9 NL,K(J@nO] /bkdudBLyDx(gmka4ݠ~Hj),!>bh4aX >򓇓]I{V(OnM|KAZ ]@&Vt/,ZB3Đs/hu(+5;ek1h:77Aor!F%(=}8?ߙ0 p1Dj(=},O@̮Tף=KۇZhip*bPvH>{vS9Y67_3R*J۔q;;٪b﹡ Tҩs*nlB4gǪ AhtTӰ+ݹgru?N ؆)[0ʀouC!uǘS-Sd 3G=gr{zhtSl8H6FR?Q8;W: @&?f UJKSAN6L_FΤ > 3e fp@YϝHT+$.ruLҠajis{uKDkŖrϴ#Gó*x>T3Ios/u+#tČl>1M7Ju i8շ)8hPi^S^ή8}+s? @ dlf |9knfَTGԫpɣSw:8ݑub0n {3;3k_ rT]rkT<*&畗{?ʬ|+Z╬E[ϢhB -B 4zv"pƸ.>3sL,5Ddc?Q )1!;! cYX +kAxȒe+93XYq V%4WNu`b8KR2Â]'|r1B吷LT[aSq@9`ccA֔b_ΘPMh^7E03"ʋ,TE[Hb]rV\1 )e!lnOl -.G"kYSˆ˺ +Nc)AQ R* 5.f^Zh tļ iA p+zH!f_GVYh˿@$7_}m rlȷ;0yoj2|*JB*3Xync^~-毵KPfE*C+_B|Ymt9}ٴn[P9LC|* 4~*֙J?-Wkj6fXrA|jLJ+3}))řnܡSthwg^PM?!<]]=m/rS-h9&%SIRL]7w)̯n1?^Y]OQJVS|"lŖ8cƜ2~xї+10ږE퐴88N,O큹5l=|6b| }]W$Um7żmk*4%-g3:w7>wv?͝t4kƝO\nQdNcUsL-{Ӛ]T.:6][&%Ϧn,YN4ܝe^3" t˺Ui,!׭u2l߯'9,ecơ;}Sw"Wsſw]~+w^~n!Qp >Ƈ!u{.=Ow}s/O޽0,y +o_3x֯/+;VĸNiZ%|O•q΅+/\_|}xxZB<1ZpÃ$'q[ +iN*CkhR<Yײ{jAaJ5؟5,W1ObكA_#P`# +endstream +endobj +25 0 obj +<< +/Filter /FlateDecode +/Length 4851 +>> +stream +HW]oH|ׯAO!'NbgY/Mۺ,EekR"MZⰺkjkHܰd*{r/"ɳfKgV \Zv#ύh:+K/U}]i9׃ߎNHp0 +˔nauq0 +%\` +8x`z1zZɷ8/M~K?πPt$EEA`gJ*:s6@B%P"F(`ݗ<3SSt~=R6bEϔyą7A0k6ܫ}r& ԁSJj+Y$uzEvA$^c +Yx#ܦw2eےJ6( N\N7*b':_=U8_,*g_ Uj͖P<Px\,8+~ݼ#yg=*sܽ28MߓEpSqH;.f~ʗ)Kҿ=1ͳV)0).ҶY5Poѧ?4(3!ůe暯㦂V' Ue^1#3y̓$RH>*Z7q@` JKYI)2v2aω4xd`WafaҖ2}hwoPtՓË4n\hR=nEW[L jOO˥K68;aLV+N]=4OQcYcqEO{Bw85p^}1q;@җ@FHD$z0gD5rܶv9s&rԨL [h7*v?yqMZLXGd˄TdF\ YnFva`^I-Nhhm 6M/vp^r<' *;OdǪZPI +Y+ז'g2Kfj*\U.ZGgUXIUWSv?MIT;ZaM)& %5(Y W4{ >~,bхB+3.QT.#,cC1{R}PJP +z(nb)4~ ƀST},7AAxVHYqT1)YE+HuPszMQhԺvWR%4-ݑe[ ( Z SLfEKCwQbmF5Y|m]}zLVM'LV&kC<4M?  + 6-NpH˻H]?'74ƀ=G%i&l}r:6pu)EC>XEʃ +( ό%*,^Uh]jm9u -*U ,u-шV +V2- ۑQ,qha؎0jϵ4]Ķ`p:Ox>FۘǏV9iΘ jeiõm\5AkgBHNxiU:]֡uV1#*Pzt]U5'}7[Q9XS.zIBðYQiz5`֩άE0Wr& iJ2}VM1ySE&PTYK.IRQTVwzRtG)[z%kXzVWV7ώC$n_׻Ҽ2&zS%&wNod 1mfMOx^OCz3`yبh1z[4nsퟞvT`ޏ +LEJBy)o~F\hc)UT/1wlPK +C~k$)J F8q$)R]ؑ`O$!!Ee!Rh|3.фU]& 2 VnV\]U];V!:+~f]ɠ|wGA#ry|*b_xwaq@䟦 2XO/q(Q+}wiz8;.7I?Ir # o㛩:`e2{UVdZ2Zj<%iwS1UǓIQ +Lä;Mc4!W7-2d!\&dpaIȔPD~r.؎Hy̷.܎o> ?fyxܗR~;@l?י B3q[9TCɉ&̜~kl_Y@ Z}yNNp1(BVuq' ɳ C|$,4*D~)HAFJ1Bꒋ ]bK.gJUũblA;LƁ[9,_6No^~?7/YŤ68rŶHFՙwiKӼiE#ܻأm?0@3^[T1(L`yV5q'+p *ȥIMMπO;WPuX;$+FIӰ%cZp= vBX0d2ǢqŲ sOk&uPl0[oUb/ǩ'oBHho:.4)5*\dE =X,QWdpUOBQAVdd*dG.RU$*KT$긏B@h6l +K6v +l\PhӒ1Xlhh克nuiF$)VD׳.uі -ϛa|ux}뷯65|'oitlK[A {:idS8>9Km\бJw9ֆv +ƀ1\OՁ`2d`4OYax2H1JA ;bIH +F1| D%c]Y&B[s%>F]T,\-g]Z*6/W.sc\1쿊OqLp)Y"Ȋ\֔,e)Xk=)Y<fMTUJ&cJd%b4%OQ(*y2H)+(HJ4J +F2#{Z0Kh|1zsl,3ػ~.>h^ m)t`Kz{,"5E wi(t6.dbq`VM +2}dK̀> RRPX}gi|dH1&RXW&SΘtL. ]%;кcIBdKvuxC͋5Mq.RTfb5ɘJV.tXk?\,9Xsq7R)r shbr +R#gE19+REOQLR@&P a猵 k8gc=]a% [k׻-{`uiU)%oe]fd51"><<>cywu5_땸 +endstream +endobj +26 0 obj +<< +/Filter /FlateDecode +/Length 4589 +>> +stream +HWSF}_ֲwoMBtTi'}dKH,mZ{Ϟ=`x3l7o&;6:Hb#=Z/b_ %3\+Ō.-^竑Fhrt93K/U}^Yf׃ӣ)o#62emX~7|tpuUb\ݎB=Z^mY}Wf]~O߮މ$eeA`gJ*:s6@Jy#C5dTEwG`)Y);Hﳇ-26t)I nFa:/mWaҏWL!mmTKj+Y"&͒A$^cYxCܦΘ_n嶢Ң yÃ[iPlUp`oV_ߖ Uj͎P<Px^yMޔnߑՁھ3o(Kܽ:/y9KdUlR}qD;.f ~}fϗ7eϿ(R&3%f}WڶF?e&ա\uTjɛ̋CfDp:ezD +H0'B^C&w[jɽ'6Er2DƦ3HG6] Ap]prVBX]Bvbb׍ 4׶&H<{(>^,_klՁt!E6~Wl:E<қEi}[l*Dt=K4O[vEYU+~[]WK7u:Qobyv/řn8]nw\wwy>E +?wʎ[,xz![(tΈ:91UV2AU"L.fɣ'9 # d5ЌdWvX <3c F-`)X(Am&yTWLԋ4%UGS8hF8br&%PZXZxk1SLpu0PARp O}'|$ ]>/( I@/ ӕ[J%VTz +a͋"alu98pƔ`tSfQ18{ xV @zJZ@ HmS}x:av9EC2y[Τ۴>1BVH[ q^:jG| ygD/-ЭR2L-e|Sjz -, kgm0z -ޮL*P`LL$v(56lz;Ha`ieHڀq Y`*pEke/cj%^mz5HOWڈow謟g_tL1^뜝[3Ì*65xMM:Mg.g XJaj㜠梤#+(XCѪrs@u\s[X:Z#.҈ O +z,=N|u;h-H˅5/Z>Gxa ^M^]\ΫHzzBy HZ[ߝ\Svޣ.W\^??щs6& &cyJqq#_JU}@)(:(䷰[ v[[ TXmt"}5sZ[,FZ0r=*Ic=#XjPD@7ڈCoH@D*i4A|ފǭKڋDBqF%_<4Zh ^93M6G +zDxK4@㻤jQVF:1x%tn[u8'=HOvX%iigm4~H-Zz)"x`vہ#)DW@U_0I"QHj]қ} *׾|c8R6_IW /zVijUa5ߣD2 pzə%V2 *;s?58 (ܷvI8PNG+v=@b:XmVa#y~BXPq3e!xc"~!2Tb a/n D1 >?7zB?6fkϕQ+Rf5_˭q#,$RafG'J_hK@L2>EӦ<taU~u*R;aӨ$ai^7}ʸv0~Mb/s>~}>žB*~gݩ% m $T`λ +#:$"5eQ7Kx6xaDs^&p61\K縫@gK0M9Rnq[Z:Ǖ 9sqa:wP)K\66tx4I\bJ0)):+3):Kά 5^G7Ejl)!kx[Ociyo/y7C>udFv*8Nf)Fj2r( E$vi-MgGpHS+IIMd#J˸5ߖ +=6ILlҠY9üqlhVqwf6RB5Lqנ}}q-V&pB%>jfS@C -|y37G*u\--&T'UGjX;%z_q//&_x; V?¢WfZ L.{}|MJc:B8@B=8S۽|)6lY>XvMcu:eA&RPliZxO- +Tz3?Z>E2a5c " ,R SRYYeeܚneƉG1Ki-%ز|.TυƋ֕r.Cny\b(e٤E=)k0D~Yl]^>ǯbUqqYu.S -_JVc"(& +Ev,M_l^Vs!?EU}񜗕BVb ^{_}_ͽ%NP +endstream +endobj +27 0 obj +<< +/ID (Page[1].data[0].ItemDetails_Subform[0].ADDRESS_INFO[0].ADDRESS[0].GT_METAL_SUM[0].Kopfzeile[0].Zelle1[0]) +/K 50 0 R +/P 1086 0 R +/S /TH +>> +endobj +28 0 obj +<< +/K [1087 0 R 1088 0 R 1089 0 R 1090 0 R 1091 0 R 1092 0 R] +/P 16 0 R +/S /Page +/T (Page 1) +>> +endobj +29 0 obj +<< +/K [1093 0 R 1094 0 R 1095 0 R 1096 0 R] +/P 16 0 R +/S /Page +/T (Page 2) +>> +endobj +30 0 obj +<< +/K [1097 0 R 1098 0 R 1099 0 R 1100 0 R] +/P 16 0 R +/S /Page +/T (Page 3) +>> +endobj +31 0 obj +<< +/Alt (BILL_LOG_NOTE) +/K 0 +/P 1088 0 R +/Pg 12 0 R +/S /P +>> +endobj +32 0 obj +<< +/K 1 +/P 1101 0 R +/Pg 12 0 R +/S /P +>> +endobj +33 0 obj +<< +/Alt (sonepar_text) +/K 2 +/P 1101 0 R +/Pg 12 0 R +/S /P +>> +endobj +34 0 obj +<< +/Alt (IDES LOGO) +/K 3 +/P 1102 0 R +/Pg 12 0 R +/S /Figure +>> +endobj +35 0 obj +<< +/K 4 +/P 1103 0 R +/Pg 12 0 R +/S /P +>> +endobj +36 0 obj +<< +/Alt (Sender Text) +/K 5 +/P 1103 0 R +/Pg 12 0 R +/S /P +>> +endobj +37 0 obj +<< +/K 6 +/P 1104 0 R +/Pg 12 0 R +/S /P +>> +endobj +38 0 obj +<< +/K 7 +/P 1105 0 R +/Pg 12 0 R +/S /P +>> +endobj +39 0 obj +<< +/Alt (SUBSIDIARY_INFO) +/K 8 +/P 1105 0 R +/Pg 12 0 R +/S /P +>> +endobj +40 0 obj +<< +/K 9 +/P 1106 0 R +/Pg 12 0 R +/S /P +>> +endobj +41 0 obj +<< +/Alt (Sender Text) +/K 10 +/P 1106 0 R +/Pg 12 0 R +/S /P +>> +endobj +42 0 obj +<< +/K 11 +/P 1107 0 R +/Pg 12 0 R +/S /P +>> +endobj +43 0 obj +<< +/Alt (Anschrift) +/K 12 +/P 1107 0 R +/Pg 12 0 R +/S /P +>> +endobj +44 0 obj +<< +/K 13 +/P 1108 0 R +/Pg 12 0 R +/S /P +>> +endobj +45 0 obj +<< +/K 14 +/P 1109 0 R +/Pg 12 0 R +/S /P +>> +endobj +46 0 obj +<< +/Alt (Zahlungsbedingungen Text 1) +/K 15 +/P 1109 0 R +/Pg 12 0 R +/S /P +>> +endobj +47 0 obj +<< +/K 16 +/P 1110 0 R +/Pg 12 0 R +/S /P +>> +endobj +48 0 obj +<< +/K 17 +/P 1111 0 R +/Pg 12 0 R +/S /P +>> +endobj +49 0 obj +<< +/K 18 +/P 1112 0 R +/Pg 12 0 R +/S /P +>> +endobj +50 0 obj +<< +/K 19 +/P 27 0 R +/Pg 12 0 R +/S /P +>> +endobj +51 0 obj +<< +/K 20 +/P 1113 0 R +/Pg 12 0 R +/S /P +>> +endobj +52 0 obj +<< +/K 21 +/P 1114 0 R +/Pg 12 0 R +/S /P +>> +endobj +53 0 obj +<< +/K 22 +/P 1115 0 R +/Pg 12 0 R +/S /P +>> +endobj +54 0 obj +<< +/K 23 +/P 1116 0 R +/Pg 12 0 R +/S /P +>> +endobj +55 0 obj +<< +/K 24 +/P 1117 0 R +/Pg 12 0 R +/S /P +>> +endobj +56 0 obj +<< +/K 25 +/P 1118 0 R +/Pg 12 0 R +/S /P +>> +endobj +57 0 obj +<< +/K 26 +/P 1119 0 R +/Pg 12 0 R +/S /P +>> +endobj +58 0 obj +<< +/K 27 +/P 1120 0 R +/Pg 12 0 R +/S /P +>> +endobj +59 0 obj +<< +/K 28 +/P 1121 0 R +/Pg 12 0 R +/S /P +>> +endobj +60 0 obj +<< +/Alt (VBELN) +/K 29 +/P 1121 0 R +/Pg 12 0 R +/S /P +>> +endobj +61 0 obj +<< +/K 30 +/P 1122 0 R +/Pg 12 0 R +/S /P +>> +endobj +62 0 obj +<< +/K 31 +/P 1123 0 R +/Pg 12 0 R +/S /P +>> +endobj +63 0 obj +<< +/Alt (FKDAT) +/K 32 +/P 1123 0 R +/Pg 12 0 R +/S /P +>> +endobj +64 0 obj +<< +/K 33 +/P 1124 0 R +/Pg 12 0 R +/S /P +>> +endobj +65 0 obj +<< +/K 34 +/P 1125 0 R +/Pg 12 0 R +/S /P +>> +endobj +66 0 obj +<< +/K 35 +/P 1126 0 R +/Pg 12 0 R +/S /P +>> +endobj +67 0 obj +<< +/K 36 +/P 1127 0 R +/Pg 12 0 R +/S /P +>> +endobj +68 0 obj +<< +/Alt (KUNAG) +/K 37 +/P 1127 0 R +/Pg 12 0 R +/S /P +>> +endobj +69 0 obj +<< +/K 38 +/P 1128 0 R +/Pg 12 0 R +/S /P +>> +endobj +70 0 obj +<< +/Alt (Niederlassung:) +/K 39 +/P 1128 0 R +/Pg 12 0 R +/S /P +>> +endobj +71 0 obj +<< +/K 40 +/P 1129 0 R +/Pg 12 0 R +/S /P +>> +endobj +72 0 obj +<< +/K 41 +/P 1130 0 R +/Pg 12 0 R +/S /P +>> +endobj +73 0 obj +<< +/Alt (NAME_TEXT) +/K 42 +/P 1130 0 R +/Pg 12 0 R +/S /P +>> +endobj +74 0 obj +<< +/K 43 +/P 1131 0 R +/Pg 12 0 R +/S /P +>> +endobj +75 0 obj +<< +/Alt (Mail:) +/K 44 +/P 1131 0 R +/Pg 12 0 R +/S /P +>> +endobj +76 0 obj +<< +/K 45 +/P 1132 0 R +/Pg 12 0 R +/S /P +>> +endobj +77 0 obj +<< +/Alt (POSNR_TXT_1) +/K 46 +/P 1132 0 R +/Pg 12 0 R +/S /P +>> +endobj +78 0 obj +<< +/K 47 +/P 1133 0 R +/Pg 12 0 R +/S /P +>> +endobj +79 0 obj +<< +/K 48 +/P 1134 0 R +/Pg 12 0 R +/S /P +>> +endobj +80 0 obj +<< +/K 49 +/P 1135 0 R +/Pg 12 0 R +/S /P +>> +endobj +81 0 obj +<< +/Alt (POSNR_TXT_2) +/K 50 +/P 1135 0 R +/Pg 12 0 R +/S /P +>> +endobj +82 0 obj +<< +/K 51 +/P 1136 0 R +/Pg 12 0 R +/S /P +>> +endobj +83 0 obj +<< +/K 52 +/P 1137 0 R +/Pg 12 0 R +/S /P +>> +endobj +84 0 obj +<< +/K 53 +/P 1138 0 R +/Pg 12 0 R +/S /P +>> +endobj +85 0 obj +<< +/K 54 +/P 1139 0 R +/Pg 12 0 R +/S /P +>> +endobj +86 0 obj +<< +/K 55 +/P 1140 0 R +/Pg 12 0 R +/S /P +>> +endobj +87 0 obj +<< +/K 56 +/P 1141 0 R +/Pg 12 0 R +/S /P +>> +endobj +88 0 obj +<< +/K 57 +/P 1142 0 R +/Pg 12 0 R +/S /P +>> +endobj +89 0 obj +<< +/K 58 +/P 1143 0 R +/Pg 12 0 R +/S /P +>> +endobj +90 0 obj +<< +/Alt (Lieferung) +/K 59 +/P 1143 0 R +/Pg 12 0 R +/S /P +>> +endobj +91 0 obj +<< +/K 60 +/P 1144 0 R +/Pg 12 0 R +/S /P +>> +endobj +92 0 obj +<< +/Alt (vom) +/K 61 +/P 1144 0 R +/Pg 12 0 R +/S /P +>> +endobj +93 0 obj +<< +/K 62 +/P 1145 0 R +/Pg 12 0 R +/S /P +>> +endobj +94 0 obj +<< +/Alt (ab) +/K 63 +/P 1145 0 R +/Pg 12 0 R +/S /P +>> +endobj +95 0 obj +<< +/K 64 +/P 1146 0 R +/Pg 12 0 R +/S /P +>> +endobj +96 0 obj +<< +/Alt (Auftrag ) +/K 65 +/P 1146 0 R +/Pg 12 0 R +/S /P +>> +endobj +97 0 obj +<< +/K 66 +/P 1147 0 R +/Pg 12 0 R +/S /P +>> +endobj +98 0 obj +<< +/K 67 +/P 1148 0 R +/Pg 12 0 R +/S /P +>> +endobj +99 0 obj +<< +/Alt (vom:) +/K 68 +/P 1148 0 R +/Pg 12 0 R +/S /P +>> +endobj +100 0 obj +<< +/K 69 +/P 1149 0 R +/Pg 12 0 R +/S /P +>> +endobj +101 0 obj +<< +/Alt (ZZ_ORDER_CODE2) +/K 70 +/P 1149 0 R +/Pg 12 0 R +/S /P +>> +endobj +102 0 obj +<< +/K 71 +/P 1150 0 R +/Pg 12 0 R +/S /P +>> +endobj +103 0 obj +<< +/K 72 +/P 1151 0 R +/Pg 12 0 R +/S /P +>> +endobj +104 0 obj +<< +/Alt (POSNR_VF) +/K 73 +/P 1151 0 R +/Pg 12 0 R +/S /P +>> +endobj +105 0 obj +<< +/K 74 +/P 1152 0 R +/Pg 12 0 R +/S /P +>> +endobj +106 0 obj +<< +/Alt (MATNR) +/K 75 +/P 1152 0 R +/Pg 12 0 R +/S /P +>> +endobj +107 0 obj +<< +/K 76 +/P 1153 0 R +/Pg 12 0 R +/S /P +>> +endobj +108 0 obj +<< +/Alt (ZZMATTEXT) +/K 77 +/P 1153 0 R +/Pg 12 0 R +/S /P +>> +endobj +109 0 obj +<< +/K 78 +/P 1154 0 R +/Pg 12 0 R +/S /P +>> +endobj +110 0 obj +<< +/Alt (POSNR_VL) +/K 79 +/P 1154 0 R +/Pg 12 0 R +/S /P +>> +endobj +111 0 obj +<< +/K 80 +/P 1155 0 R +/Pg 12 0 R +/S /P +>> +endobj +112 0 obj +<< +/Alt (EAN11) +/K 81 +/P 1155 0 R +/Pg 12 0 R +/S /P +>> +endobj +113 0 obj +<< +/K 82 +/P 1156 0 R +/Pg 12 0 R +/S /P +>> +endobj +114 0 obj +<< +/Alt (BISMT) +/K 83 +/P 1156 0 R +/Pg 12 0 R +/S /P +>> +endobj +115 0 obj +<< +/K 84 +/P 1157 0 R +/Pg 12 0 R +/S /P +>> +endobj +116 0 obj +<< +/Alt (FKIMG) +/K 85 +/P 1157 0 R +/Pg 12 0 R +/S /P +>> +endobj +117 0 obj +<< +/K 86 +/P 1158 0 R +/Pg 12 0 R +/S /P +>> +endobj +118 0 obj +<< +/Alt (VRKME) +/K 87 +/P 1158 0 R +/Pg 12 0 R +/S /P +>> +endobj +119 0 obj +<< +/K 88 +/P 1159 0 R +/Pg 12 0 R +/S /P +>> +endobj +120 0 obj +<< +/Alt (PREIS_VF) +/K 89 +/P 1159 0 R +/Pg 12 0 R +/S /P +>> +endobj +121 0 obj +<< +/K 90 +/P 1160 0 R +/Pg 12 0 R +/S /P +>> +endobj +122 0 obj +<< +/Alt (PEINH_VF) +/K 91 +/P 1160 0 R +/Pg 12 0 R +/S /P +>> +endobj +123 0 obj +<< +/K 92 +/P 1161 0 R +/Pg 12 0 R +/S /P +>> +endobj +124 0 obj +<< +/Alt (POSPREIS_VF) +/K 93 +/P 1161 0 R +/Pg 12 0 R +/S /P +>> +endobj +125 0 obj +<< +/K 94 +/P 1162 0 R +/Pg 12 0 R +/S /P +>> +endobj +126 0 obj +<< +/K 95 +/P 1163 0 R +/Pg 12 0 R +/S /P +>> +endobj +127 0 obj +<< +/Alt (POSNR_VF) +/K 96 +/P 1163 0 R +/Pg 12 0 R +/S /P +>> +endobj +128 0 obj +<< +/K 97 +/P 1164 0 R +/Pg 12 0 R +/S /P +>> +endobj +129 0 obj +<< +/Alt (MATNR) +/K 98 +/P 1164 0 R +/Pg 12 0 R +/S /P +>> +endobj +130 0 obj +<< +/K 99 +/P 1165 0 R +/Pg 12 0 R +/S /P +>> +endobj +131 0 obj +<< +/Alt (ZZMATTEXT) +/K 100 +/P 1165 0 R +/Pg 12 0 R +/S /P +>> +endobj +132 0 obj +<< +/K 101 +/P 1166 0 R +/Pg 12 0 R +/S /P +>> +endobj +133 0 obj +<< +/Alt (POSNR_VL) +/K 102 +/P 1166 0 R +/Pg 12 0 R +/S /P +>> +endobj +134 0 obj +<< +/K 103 +/P 1167 0 R +/Pg 12 0 R +/S /P +>> +endobj +135 0 obj +<< +/Alt (EAN11) +/K 104 +/P 1167 0 R +/Pg 12 0 R +/S /P +>> +endobj +136 0 obj +<< +/K 105 +/P 1168 0 R +/Pg 12 0 R +/S /P +>> +endobj +137 0 obj +<< +/Alt (BISMT) +/K 106 +/P 1168 0 R +/Pg 12 0 R +/S /P +>> +endobj +138 0 obj +<< +/K 107 +/P 1169 0 R +/Pg 12 0 R +/S /P +>> +endobj +139 0 obj +<< +/Alt (FKIMG) +/K 108 +/P 1169 0 R +/Pg 12 0 R +/S /P +>> +endobj +140 0 obj +<< +/K 109 +/P 1170 0 R +/Pg 12 0 R +/S /P +>> +endobj +141 0 obj +<< +/Alt (VRKME) +/K 110 +/P 1170 0 R +/Pg 12 0 R +/S /P +>> +endobj +142 0 obj +<< +/K 111 +/P 1171 0 R +/Pg 12 0 R +/S /P +>> +endobj +143 0 obj +<< +/Alt (PREIS_VF) +/K 112 +/P 1171 0 R +/Pg 12 0 R +/S /P +>> +endobj +144 0 obj +<< +/K 113 +/P 1172 0 R +/Pg 12 0 R +/S /P +>> +endobj +145 0 obj +<< +/Alt (PEINH_VF) +/K 114 +/P 1172 0 R +/Pg 12 0 R +/S /P +>> +endobj +146 0 obj +<< +/K 115 +/P 1173 0 R +/Pg 12 0 R +/S /P +>> +endobj +147 0 obj +<< +/Alt (POSPREIS_VF) +/K 116 +/P 1173 0 R +/Pg 12 0 R +/S /P +>> +endobj +148 0 obj +<< +/K 117 +/P 1174 0 R +/Pg 12 0 R +/S /P +>> +endobj +149 0 obj +<< +/K 118 +/P 1175 0 R +/Pg 12 0 R +/S /P +>> +endobj +150 0 obj +<< +/Alt (POSNR_VF) +/K 119 +/P 1175 0 R +/Pg 12 0 R +/S /P +>> +endobj +151 0 obj +<< +/K 120 +/P 1176 0 R +/Pg 12 0 R +/S /P +>> +endobj +152 0 obj +<< +/Alt (MATNR) +/K 121 +/P 1176 0 R +/Pg 12 0 R +/S /P +>> +endobj +153 0 obj +<< +/K 122 +/P 1177 0 R +/Pg 12 0 R +/S /P +>> +endobj +154 0 obj +<< +/Alt (ZZMATTEXT) +/K 123 +/P 1177 0 R +/Pg 12 0 R +/S /P +>> +endobj +155 0 obj +<< +/K 124 +/P 1178 0 R +/Pg 12 0 R +/S /P +>> +endobj +156 0 obj +<< +/Alt (POSNR_VL) +/K 125 +/P 1178 0 R +/Pg 12 0 R +/S /P +>> +endobj +157 0 obj +<< +/K 126 +/P 1179 0 R +/Pg 12 0 R +/S /P +>> +endobj +158 0 obj +<< +/Alt (EAN11) +/K 127 +/P 1179 0 R +/Pg 12 0 R +/S /P +>> +endobj +159 0 obj +<< +/K 128 +/P 1180 0 R +/Pg 12 0 R +/S /P +>> +endobj +160 0 obj +<< +/Alt (BISMT) +/K 129 +/P 1180 0 R +/Pg 12 0 R +/S /P +>> +endobj +161 0 obj +<< +/K 130 +/P 1181 0 R +/Pg 12 0 R +/S /P +>> +endobj +162 0 obj +<< +/Alt (FKIMG) +/K 131 +/P 1181 0 R +/Pg 12 0 R +/S /P +>> +endobj +163 0 obj +<< +/K 132 +/P 1182 0 R +/Pg 12 0 R +/S /P +>> +endobj +164 0 obj +<< +/Alt (VRKME) +/K 133 +/P 1182 0 R +/Pg 12 0 R +/S /P +>> +endobj +165 0 obj +<< +/K 134 +/P 1183 0 R +/Pg 12 0 R +/S /P +>> +endobj +166 0 obj +<< +/Alt (PREIS_VF) +/K 135 +/P 1183 0 R +/Pg 12 0 R +/S /P +>> +endobj +167 0 obj +<< +/K 136 +/P 1184 0 R +/Pg 12 0 R +/S /P +>> +endobj +168 0 obj +<< +/Alt (PEINH_VF) +/K 137 +/P 1184 0 R +/Pg 12 0 R +/S /P +>> +endobj +169 0 obj +<< +/K 138 +/P 1185 0 R +/Pg 12 0 R +/S /P +>> +endobj +170 0 obj +<< +/Alt (POSPREIS_VF) +/K 139 +/P 1185 0 R +/Pg 12 0 R +/S /P +>> +endobj +171 0 obj +<< +/K 140 +/P 1186 0 R +/Pg 12 0 R +/S /P +>> +endobj +172 0 obj +<< +/K 141 +/P 1187 0 R +/Pg 12 0 R +/S /P +>> +endobj +173 0 obj +<< +/Alt (POSNR_VF) +/K 142 +/P 1187 0 R +/Pg 12 0 R +/S /P +>> +endobj +174 0 obj +<< +/K 143 +/P 1188 0 R +/Pg 12 0 R +/S /P +>> +endobj +175 0 obj +<< +/Alt (MATNR) +/K 144 +/P 1188 0 R +/Pg 12 0 R +/S /P +>> +endobj +176 0 obj +<< +/K 145 +/P 1189 0 R +/Pg 12 0 R +/S /P +>> +endobj +177 0 obj +<< +/Alt (ZZMATTEXT) +/K 146 +/P 1189 0 R +/Pg 12 0 R +/S /P +>> +endobj +178 0 obj +<< +/K 147 +/P 1190 0 R +/Pg 12 0 R +/S /P +>> +endobj +179 0 obj +<< +/Alt (POSNR_VL) +/K 148 +/P 1190 0 R +/Pg 12 0 R +/S /P +>> +endobj +180 0 obj +<< +/K 149 +/P 1191 0 R +/Pg 12 0 R +/S /P +>> +endobj +181 0 obj +<< +/Alt (EAN11) +/K 150 +/P 1191 0 R +/Pg 12 0 R +/S /P +>> +endobj +182 0 obj +<< +/K 151 +/P 1192 0 R +/Pg 12 0 R +/S /P +>> +endobj +183 0 obj +<< +/Alt (BISMT) +/K 152 +/P 1192 0 R +/Pg 12 0 R +/S /P +>> +endobj +184 0 obj +<< +/K 153 +/P 1193 0 R +/Pg 12 0 R +/S /P +>> +endobj +185 0 obj +<< +/Alt (FKIMG) +/K 154 +/P 1193 0 R +/Pg 12 0 R +/S /P +>> +endobj +186 0 obj +<< +/K 155 +/P 1194 0 R +/Pg 12 0 R +/S /P +>> +endobj +187 0 obj +<< +/Alt (VRKME) +/K 156 +/P 1194 0 R +/Pg 12 0 R +/S /P +>> +endobj +188 0 obj +<< +/K 157 +/P 1195 0 R +/Pg 12 0 R +/S /P +>> +endobj +189 0 obj +<< +/Alt (PREIS_VF) +/K 158 +/P 1195 0 R +/Pg 12 0 R +/S /P +>> +endobj +190 0 obj +<< +/K 159 +/P 1196 0 R +/Pg 12 0 R +/S /P +>> +endobj +191 0 obj +<< +/Alt (PEINH_VF) +/K 160 +/P 1196 0 R +/Pg 12 0 R +/S /P +>> +endobj +192 0 obj +<< +/K 161 +/P 1197 0 R +/Pg 12 0 R +/S /P +>> +endobj +193 0 obj +<< +/Alt (POSPREIS_VF) +/K 162 +/P 1197 0 R +/Pg 12 0 R +/S /P +>> +endobj +194 0 obj +<< +/K 163 +/P 1198 0 R +/Pg 12 0 R +/S /P +>> +endobj +195 0 obj +<< +/K 164 +/P 1199 0 R +/Pg 12 0 R +/S /P +>> +endobj +196 0 obj +<< +/Alt (POSNR_VF) +/K 165 +/P 1199 0 R +/Pg 12 0 R +/S /P +>> +endobj +197 0 obj +<< +/K 166 +/P 1200 0 R +/Pg 12 0 R +/S /P +>> +endobj +198 0 obj +<< +/Alt (MATNR) +/K 167 +/P 1200 0 R +/Pg 12 0 R +/S /P +>> +endobj +199 0 obj +<< +/K 168 +/P 1201 0 R +/Pg 12 0 R +/S /P +>> +endobj +200 0 obj +<< +/Alt (ZZMATTEXT) +/K 169 +/P 1201 0 R +/Pg 12 0 R +/S /P +>> +endobj +201 0 obj +<< +/K 170 +/P 1202 0 R +/Pg 12 0 R +/S /P +>> +endobj +202 0 obj +<< +/Alt (POSNR_VL) +/K 171 +/P 1202 0 R +/Pg 12 0 R +/S /P +>> +endobj +203 0 obj +<< +/K 172 +/P 1203 0 R +/Pg 12 0 R +/S /P +>> +endobj +204 0 obj +<< +/Alt (EAN11) +/K 173 +/P 1203 0 R +/Pg 12 0 R +/S /P +>> +endobj +205 0 obj +<< +/K 174 +/P 1204 0 R +/Pg 12 0 R +/S /P +>> +endobj +206 0 obj +<< +/Alt (BISMT) +/K 175 +/P 1204 0 R +/Pg 12 0 R +/S /P +>> +endobj +207 0 obj +<< +/K 176 +/P 1205 0 R +/Pg 12 0 R +/S /P +>> +endobj +208 0 obj +<< +/Alt (FKIMG) +/K 177 +/P 1205 0 R +/Pg 12 0 R +/S /P +>> +endobj +209 0 obj +<< +/K 178 +/P 1206 0 R +/Pg 12 0 R +/S /P +>> +endobj +210 0 obj +<< +/Alt (VRKME) +/K 179 +/P 1206 0 R +/Pg 12 0 R +/S /P +>> +endobj +211 0 obj +<< +/K 180 +/P 1207 0 R +/Pg 12 0 R +/S /P +>> +endobj +212 0 obj +<< +/Alt (PREIS_VF) +/K 181 +/P 1207 0 R +/Pg 12 0 R +/S /P +>> +endobj +213 0 obj +<< +/K 182 +/P 1208 0 R +/Pg 12 0 R +/S /P +>> +endobj +214 0 obj +<< +/Alt (PEINH_VF) +/K 183 +/P 1208 0 R +/Pg 12 0 R +/S /P +>> +endobj +215 0 obj +<< +/K 184 +/P 1209 0 R +/Pg 12 0 R +/S /P +>> +endobj +216 0 obj +<< +/Alt (POSPREIS_VF) +/K 185 +/P 1209 0 R +/Pg 12 0 R +/S /P +>> +endobj +217 0 obj +<< +/K 186 +/P 1210 0 R +/Pg 12 0 R +/S /P +>> +endobj +218 0 obj +<< +/K 187 +/P 1211 0 R +/Pg 12 0 R +/S /P +>> +endobj +219 0 obj +<< +/Alt (POSNR_VF) +/K 188 +/P 1211 0 R +/Pg 12 0 R +/S /P +>> +endobj +220 0 obj +<< +/K 189 +/P 1212 0 R +/Pg 12 0 R +/S /P +>> +endobj +221 0 obj +<< +/Alt (MATNR) +/K 190 +/P 1212 0 R +/Pg 12 0 R +/S /P +>> +endobj +222 0 obj +<< +/K 191 +/P 1213 0 R +/Pg 12 0 R +/S /P +>> +endobj +223 0 obj +<< +/Alt (ZZMATTEXT) +/K 192 +/P 1213 0 R +/Pg 12 0 R +/S /P +>> +endobj +224 0 obj +<< +/K 193 +/P 1214 0 R +/Pg 12 0 R +/S /P +>> +endobj +225 0 obj +<< +/Alt (POSNR_VL) +/K 194 +/P 1214 0 R +/Pg 12 0 R +/S /P +>> +endobj +226 0 obj +<< +/Alt (EAN11) +/K 195 +/P 1215 0 R +/Pg 12 0 R +/S /P +>> +endobj +227 0 obj +<< +/K 196 +/P 1216 0 R +/Pg 12 0 R +/S /P +>> +endobj +228 0 obj +<< +/Alt (BISMT) +/K 197 +/P 1216 0 R +/Pg 12 0 R +/S /P +>> +endobj +229 0 obj +<< +/K 198 +/P 1217 0 R +/Pg 12 0 R +/S /P +>> +endobj +230 0 obj +<< +/Alt (FKIMG) +/K 199 +/P 1217 0 R +/Pg 12 0 R +/S /P +>> +endobj +231 0 obj +<< +/K 200 +/P 1218 0 R +/Pg 12 0 R +/S /P +>> +endobj +232 0 obj +<< +/Alt (VRKME) +/K 201 +/P 1218 0 R +/Pg 12 0 R +/S /P +>> +endobj +233 0 obj +<< +/K 202 +/P 1219 0 R +/Pg 12 0 R +/S /P +>> +endobj +234 0 obj +<< +/Alt (PREIS_VF) +/K 203 +/P 1219 0 R +/Pg 12 0 R +/S /P +>> +endobj +235 0 obj +<< +/K 204 +/P 1220 0 R +/Pg 12 0 R +/S /P +>> +endobj +236 0 obj +<< +/Alt (PEINH_VF) +/K 205 +/P 1220 0 R +/Pg 12 0 R +/S /P +>> +endobj +237 0 obj +<< +/K 206 +/P 1221 0 R +/Pg 12 0 R +/S /P +>> +endobj +238 0 obj +<< +/Alt (POSPREIS_VF) +/K 207 +/P 1221 0 R +/Pg 12 0 R +/S /P +>> +endobj +239 0 obj +<< +/K 208 +/P 1222 0 R +/Pg 12 0 R +/S /P +>> +endobj +240 0 obj +<< +/K 209 +/P 1223 0 R +/Pg 12 0 R +/S /P +>> +endobj +241 0 obj +<< +/K 210 +/P 1224 0 R +/Pg 12 0 R +/S /P +>> +endobj +242 0 obj +<< +/Alt (ZUSCHLAGSWERT) +/K 211 +/P 1224 0 R +/Pg 12 0 R +/S /P +>> +endobj +243 0 obj +<< +/K 212 +/P 1225 0 R +/Pg 12 0 R +/S /P +>> +endobj +244 0 obj +<< +/Alt (POSNR_VF) +/K 213 +/P 1225 0 R +/Pg 12 0 R +/S /P +>> +endobj +245 0 obj +<< +/K 214 +/P 1226 0 R +/Pg 12 0 R +/S /P +>> +endobj +246 0 obj +<< +/Alt (MATNR) +/K 215 +/P 1226 0 R +/Pg 12 0 R +/S /P +>> +endobj +247 0 obj +<< +/K 216 +/P 1227 0 R +/Pg 12 0 R +/S /P +>> +endobj +248 0 obj +<< +/Alt (ZZMATTEXT) +/K 217 +/P 1227 0 R +/Pg 12 0 R +/S /P +>> +endobj +249 0 obj +<< +/K 218 +/P 1228 0 R +/Pg 12 0 R +/S /P +>> +endobj +250 0 obj +<< +/Alt (POSNR_VL) +/K 219 +/P 1228 0 R +/Pg 12 0 R +/S /P +>> +endobj +251 0 obj +<< +/K 220 +/P 1229 0 R +/Pg 12 0 R +/S /P +>> +endobj +252 0 obj +<< +/Alt (EAN11) +/K 221 +/P 1229 0 R +/Pg 12 0 R +/S /P +>> +endobj +253 0 obj +<< +/K 222 +/P 1230 0 R +/Pg 12 0 R +/S /P +>> +endobj +254 0 obj +<< +/Alt (BISMT) +/K 223 +/P 1230 0 R +/Pg 12 0 R +/S /P +>> +endobj +255 0 obj +<< +/K 224 +/P 1231 0 R +/Pg 12 0 R +/S /P +>> +endobj +256 0 obj +<< +/Alt (FKIMG) +/K 225 +/P 1231 0 R +/Pg 12 0 R +/S /P +>> +endobj +257 0 obj +<< +/K 226 +/P 1232 0 R +/Pg 12 0 R +/S /P +>> +endobj +258 0 obj +<< +/Alt (VRKME) +/K 227 +/P 1232 0 R +/Pg 12 0 R +/S /P +>> +endobj +259 0 obj +<< +/K 228 +/P 1233 0 R +/Pg 12 0 R +/S /P +>> +endobj +260 0 obj +<< +/Alt (PREIS_VF) +/K 229 +/P 1233 0 R +/Pg 12 0 R +/S /P +>> +endobj +261 0 obj +<< +/K 230 +/P 1234 0 R +/Pg 12 0 R +/S /P +>> +endobj +262 0 obj +<< +/Alt (PEINH_VF) +/K 231 +/P 1234 0 R +/Pg 12 0 R +/S /P +>> +endobj +263 0 obj +<< +/K 232 +/P 1235 0 R +/Pg 12 0 R +/S /P +>> +endobj +264 0 obj +<< +/Alt (POSPREIS_VF) +/K 233 +/P 1235 0 R +/Pg 12 0 R +/S /P +>> +endobj +265 0 obj +<< +/K 234 +/P 1236 0 R +/Pg 12 0 R +/S /P +>> +endobj +266 0 obj +<< +/K 235 +/P 1237 0 R +/Pg 12 0 R +/S /P +>> +endobj +267 0 obj +<< +/K 236 +/P 1238 0 R +/Pg 12 0 R +/S /P +>> +endobj +268 0 obj +<< +/Alt (ZUSCHLAGSWERT) +/K 237 +/P 1238 0 R +/Pg 12 0 R +/S /P +>> +endobj +269 0 obj +<< +/K 238 +/P 1239 0 R +/Pg 12 0 R +/S /P +>> +endobj +270 0 obj +<< +/Alt (POSNR_VF) +/K 239 +/P 1239 0 R +/Pg 12 0 R +/S /P +>> +endobj +271 0 obj +<< +/K 240 +/P 1240 0 R +/Pg 12 0 R +/S /P +>> +endobj +272 0 obj +<< +/Alt (MATNR) +/K 241 +/P 1240 0 R +/Pg 12 0 R +/S /P +>> +endobj +273 0 obj +<< +/K 242 +/P 1241 0 R +/Pg 12 0 R +/S /P +>> +endobj +274 0 obj +<< +/Alt (ZZMATTEXT) +/K 243 +/P 1241 0 R +/Pg 12 0 R +/S /P +>> +endobj +275 0 obj +<< +/K 244 +/P 1242 0 R +/Pg 12 0 R +/S /P +>> +endobj +276 0 obj +<< +/Alt (POSNR_VL) +/K 245 +/P 1242 0 R +/Pg 12 0 R +/S /P +>> +endobj +277 0 obj +<< +/K 246 +/P 1243 0 R +/Pg 12 0 R +/S /P +>> +endobj +278 0 obj +<< +/Alt (EAN11) +/K 247 +/P 1243 0 R +/Pg 12 0 R +/S /P +>> +endobj +279 0 obj +<< +/K 248 +/P 1244 0 R +/Pg 12 0 R +/S /P +>> +endobj +280 0 obj +<< +/Alt (BISMT) +/K 249 +/P 1244 0 R +/Pg 12 0 R +/S /P +>> +endobj +281 0 obj +<< +/K 250 +/P 1245 0 R +/Pg 12 0 R +/S /P +>> +endobj +282 0 obj +<< +/Alt (FKIMG) +/K 251 +/P 1245 0 R +/Pg 12 0 R +/S /P +>> +endobj +283 0 obj +<< +/K 252 +/P 1246 0 R +/Pg 12 0 R +/S /P +>> +endobj +284 0 obj +<< +/Alt (VRKME) +/K 253 +/P 1246 0 R +/Pg 12 0 R +/S /P +>> +endobj +285 0 obj +<< +/K 254 +/P 1247 0 R +/Pg 12 0 R +/S /P +>> +endobj +286 0 obj +<< +/Alt (PREIS_VF) +/K 255 +/P 1247 0 R +/Pg 12 0 R +/S /P +>> +endobj +287 0 obj +<< +/K 256 +/P 1248 0 R +/Pg 12 0 R +/S /P +>> +endobj +288 0 obj +<< +/Alt (PEINH_VF) +/K 257 +/P 1248 0 R +/Pg 12 0 R +/S /P +>> +endobj +289 0 obj +<< +/K 258 +/P 1249 0 R +/Pg 12 0 R +/S /P +>> +endobj +290 0 obj +<< +/Alt (POSPREIS_VF) +/K 259 +/P 1249 0 R +/Pg 12 0 R +/S /P +>> +endobj +291 0 obj +<< +/K 260 +/P 1250 0 R +/Pg 12 0 R +/S /P +>> +endobj +292 0 obj +<< +/K 261 +/P 1251 0 R +/Pg 12 0 R +/S /P +>> +endobj +293 0 obj +<< +/Alt (POSNR_VF) +/K 262 +/P 1251 0 R +/Pg 12 0 R +/S /P +>> +endobj +294 0 obj +<< +/K 263 +/P 1252 0 R +/Pg 12 0 R +/S /P +>> +endobj +295 0 obj +<< +/Alt (MATNR) +/K 264 +/P 1252 0 R +/Pg 12 0 R +/S /P +>> +endobj +296 0 obj +<< +/K 265 +/P 1253 0 R +/Pg 12 0 R +/S /P +>> +endobj +297 0 obj +<< +/Alt (ZZMATTEXT) +/K 266 +/P 1253 0 R +/Pg 12 0 R +/S /P +>> +endobj +298 0 obj +<< +/K 267 +/P 1254 0 R +/Pg 12 0 R +/S /P +>> +endobj +299 0 obj +<< +/Alt (POSNR_VL) +/K 268 +/P 1254 0 R +/Pg 12 0 R +/S /P +>> +endobj +300 0 obj +<< +/K 269 +/P 1255 0 R +/Pg 12 0 R +/S /P +>> +endobj +301 0 obj +<< +/Alt (EAN11) +/K 270 +/P 1255 0 R +/Pg 12 0 R +/S /P +>> +endobj +302 0 obj +<< +/K 271 +/P 1256 0 R +/Pg 12 0 R +/S /P +>> +endobj +303 0 obj +<< +/Alt (BISMT) +/K 272 +/P 1256 0 R +/Pg 12 0 R +/S /P +>> +endobj +304 0 obj +<< +/K 273 +/P 1257 0 R +/Pg 12 0 R +/S /P +>> +endobj +305 0 obj +<< +/Alt (FKIMG) +/K 274 +/P 1257 0 R +/Pg 12 0 R +/S /P +>> +endobj +306 0 obj +<< +/K 275 +/P 1258 0 R +/Pg 12 0 R +/S /P +>> +endobj +307 0 obj +<< +/Alt (VRKME) +/K 276 +/P 1258 0 R +/Pg 12 0 R +/S /P +>> +endobj +308 0 obj +<< +/K 277 +/P 1259 0 R +/Pg 12 0 R +/S /P +>> +endobj +309 0 obj +<< +/Alt (PREIS_VF) +/K 278 +/P 1259 0 R +/Pg 12 0 R +/S /P +>> +endobj +310 0 obj +<< +/K 279 +/P 1260 0 R +/Pg 12 0 R +/S /P +>> +endobj +311 0 obj +<< +/Alt (PEINH_VF) +/K 280 +/P 1260 0 R +/Pg 12 0 R +/S /P +>> +endobj +312 0 obj +<< +/K 281 +/P 1261 0 R +/Pg 12 0 R +/S /P +>> +endobj +313 0 obj +<< +/Alt (POSPREIS_VF) +/K 282 +/P 1261 0 R +/Pg 12 0 R +/S /P +>> +endobj +314 0 obj +<< +/K 283 +/P 1262 0 R +/Pg 12 0 R +/S /P +>> +endobj +315 0 obj +<< +/K 0 +/P 1263 0 R +/Pg 13 0 R +/S /P +>> +endobj +316 0 obj +<< +/Alt (sonepar_text) +/K 1 +/P 1263 0 R +/Pg 13 0 R +/S /P +>> +endobj +317 0 obj +<< +/Alt (IDES LOGO) +/K 2 +/P 1264 0 R +/Pg 13 0 R +/S /Figure +>> +endobj +318 0 obj +<< +/K 3 +/P 1265 0 R +/Pg 13 0 R +/S /P +>> +endobj +319 0 obj +<< +/K 4 +/P 1266 0 R +/Pg 13 0 R +/S /P +>> +endobj +320 0 obj +<< +/K 5 +/P 1267 0 R +/Pg 13 0 R +/S /P +>> +endobj +321 0 obj +<< +/K 6 +/P 1268 0 R +/Pg 13 0 R +/S /P +>> +endobj +322 0 obj +<< +/Alt (Footer Text) +/K 7 +/P 1268 0 R +/Pg 13 0 R +/S /P +>> +endobj +323 0 obj +<< +/K 8 +/P 1269 0 R +/Pg 13 0 R +/S /P +>> +endobj +324 0 obj +<< +/Alt (SUBSIDIARY_INFO) +/K 9 +/P 1269 0 R +/Pg 13 0 R +/S /P +>> +endobj +325 0 obj +<< +/K 10 +/P 1270 0 R +/Pg 13 0 R +/S /P +>> +endobj +326 0 obj +<< +/Alt (POSNR_TXT_1) +/K 11 +/P 1270 0 R +/Pg 13 0 R +/S /P +>> +endobj +327 0 obj +<< +/K 12 +/P 1271 0 R +/Pg 13 0 R +/S /P +>> +endobj +328 0 obj +<< +/K 13 +/P 1272 0 R +/Pg 13 0 R +/S /P +>> +endobj +329 0 obj +<< +/K 14 +/P 1273 0 R +/Pg 13 0 R +/S /P +>> +endobj +330 0 obj +<< +/Alt (POSNR_TXT_2) +/K 15 +/P 1273 0 R +/Pg 13 0 R +/S /P +>> +endobj +331 0 obj +<< +/K 16 +/P 1274 0 R +/Pg 13 0 R +/S /P +>> +endobj +332 0 obj +<< +/K 17 +/P 1275 0 R +/Pg 13 0 R +/S /P +>> +endobj +333 0 obj +<< +/K 18 +/P 1276 0 R +/Pg 13 0 R +/S /P +>> +endobj +334 0 obj +<< +/K 19 +/P 1277 0 R +/Pg 13 0 R +/S /P +>> +endobj +335 0 obj +<< +/K 20 +/P 1278 0 R +/Pg 13 0 R +/S /P +>> +endobj +336 0 obj +<< +/K 21 +/P 1279 0 R +/Pg 13 0 R +/S /P +>> +endobj +337 0 obj +<< +/K 22 +/P 1280 0 R +/Pg 13 0 R +/S /P +>> +endobj +338 0 obj +<< +/K 23 +/P 1281 0 R +/Pg 13 0 R +/S /P +>> +endobj +339 0 obj +<< +/Alt (POSNR_VF) +/K 24 +/P 1281 0 R +/Pg 13 0 R +/S /P +>> +endobj +340 0 obj +<< +/K 25 +/P 1282 0 R +/Pg 13 0 R +/S /P +>> +endobj +341 0 obj +<< +/Alt (MATNR) +/K 26 +/P 1282 0 R +/Pg 13 0 R +/S /P +>> +endobj +342 0 obj +<< +/K 27 +/P 1283 0 R +/Pg 13 0 R +/S /P +>> +endobj +343 0 obj +<< +/Alt (ZZMATTEXT) +/K 28 +/P 1283 0 R +/Pg 13 0 R +/S /P +>> +endobj +344 0 obj +<< +/K 29 +/P 1284 0 R +/Pg 13 0 R +/S /P +>> +endobj +345 0 obj +<< +/Alt (POSNR_VL) +/K 30 +/P 1284 0 R +/Pg 13 0 R +/S /P +>> +endobj +346 0 obj +<< +/K 31 +/P 1285 0 R +/Pg 13 0 R +/S /P +>> +endobj +347 0 obj +<< +/Alt (EAN11) +/K 32 +/P 1285 0 R +/Pg 13 0 R +/S /P +>> +endobj +348 0 obj +<< +/K 33 +/P 1286 0 R +/Pg 13 0 R +/S /P +>> +endobj +349 0 obj +<< +/Alt (BISMT) +/K 34 +/P 1286 0 R +/Pg 13 0 R +/S /P +>> +endobj +350 0 obj +<< +/K 35 +/P 1287 0 R +/Pg 13 0 R +/S /P +>> +endobj +351 0 obj +<< +/Alt (FKIMG) +/K 36 +/P 1287 0 R +/Pg 13 0 R +/S /P +>> +endobj +352 0 obj +<< +/K 37 +/P 1288 0 R +/Pg 13 0 R +/S /P +>> +endobj +353 0 obj +<< +/Alt (VRKME) +/K 38 +/P 1288 0 R +/Pg 13 0 R +/S /P +>> +endobj +354 0 obj +<< +/K 39 +/P 1289 0 R +/Pg 13 0 R +/S /P +>> +endobj +355 0 obj +<< +/Alt (PREIS_VF) +/K 40 +/P 1289 0 R +/Pg 13 0 R +/S /P +>> +endobj +356 0 obj +<< +/K 41 +/P 1290 0 R +/Pg 13 0 R +/S /P +>> +endobj +357 0 obj +<< +/Alt (PEINH_VF) +/K 42 +/P 1290 0 R +/Pg 13 0 R +/S /P +>> +endobj +358 0 obj +<< +/K 43 +/P 1291 0 R +/Pg 13 0 R +/S /P +>> +endobj +359 0 obj +<< +/Alt (POSPREIS_VF) +/K 44 +/P 1291 0 R +/Pg 13 0 R +/S /P +>> +endobj +360 0 obj +<< +/K 45 +/P 1292 0 R +/Pg 13 0 R +/S /P +>> +endobj +361 0 obj +<< +/K 46 +/P 1293 0 R +/Pg 13 0 R +/S /P +>> +endobj +362 0 obj +<< +/Alt (POSNR_VF) +/K 47 +/P 1293 0 R +/Pg 13 0 R +/S /P +>> +endobj +363 0 obj +<< +/K 48 +/P 1294 0 R +/Pg 13 0 R +/S /P +>> +endobj +364 0 obj +<< +/Alt (MATNR) +/K 49 +/P 1294 0 R +/Pg 13 0 R +/S /P +>> +endobj +365 0 obj +<< +/K 50 +/P 1295 0 R +/Pg 13 0 R +/S /P +>> +endobj +366 0 obj +<< +/Alt (ZZMATTEXT) +/K 51 +/P 1295 0 R +/Pg 13 0 R +/S /P +>> +endobj +367 0 obj +<< +/K 52 +/P 1296 0 R +/Pg 13 0 R +/S /P +>> +endobj +368 0 obj +<< +/Alt (POSNR_VL) +/K 53 +/P 1296 0 R +/Pg 13 0 R +/S /P +>> +endobj +369 0 obj +<< +/K 54 +/P 1297 0 R +/Pg 13 0 R +/S /P +>> +endobj +370 0 obj +<< +/Alt (EAN11) +/K 55 +/P 1297 0 R +/Pg 13 0 R +/S /P +>> +endobj +371 0 obj +<< +/K 56 +/P 1298 0 R +/Pg 13 0 R +/S /P +>> +endobj +372 0 obj +<< +/Alt (BISMT) +/K 57 +/P 1298 0 R +/Pg 13 0 R +/S /P +>> +endobj +373 0 obj +<< +/K 58 +/P 1299 0 R +/Pg 13 0 R +/S /P +>> +endobj +374 0 obj +<< +/Alt (FKIMG) +/K 59 +/P 1299 0 R +/Pg 13 0 R +/S /P +>> +endobj +375 0 obj +<< +/K 60 +/P 1300 0 R +/Pg 13 0 R +/S /P +>> +endobj +376 0 obj +<< +/Alt (VRKME) +/K 61 +/P 1300 0 R +/Pg 13 0 R +/S /P +>> +endobj +377 0 obj +<< +/K 62 +/P 1301 0 R +/Pg 13 0 R +/S /P +>> +endobj +378 0 obj +<< +/Alt (PREIS_VF) +/K 63 +/P 1301 0 R +/Pg 13 0 R +/S /P +>> +endobj +379 0 obj +<< +/K 64 +/P 1302 0 R +/Pg 13 0 R +/S /P +>> +endobj +380 0 obj +<< +/Alt (PEINH_VF) +/K 65 +/P 1302 0 R +/Pg 13 0 R +/S /P +>> +endobj +381 0 obj +<< +/K 66 +/P 1303 0 R +/Pg 13 0 R +/S /P +>> +endobj +382 0 obj +<< +/Alt (POSPREIS_VF) +/K 67 +/P 1303 0 R +/Pg 13 0 R +/S /P +>> +endobj +383 0 obj +<< +/K 68 +/P 1304 0 R +/Pg 13 0 R +/S /P +>> +endobj +384 0 obj +<< +/K 69 +/P 1305 0 R +/Pg 13 0 R +/S /P +>> +endobj +385 0 obj +<< +/K 70 +/P 1306 0 R +/Pg 13 0 R +/S /P +>> +endobj +386 0 obj +<< +/Alt (ZUSCHLAGSWERT) +/K 71 +/P 1306 0 R +/Pg 13 0 R +/S /P +>> +endobj +387 0 obj +<< +/K 72 +/P 1307 0 R +/Pg 13 0 R +/S /P +>> +endobj +388 0 obj +<< +/Alt (POSNR_VF) +/K 73 +/P 1307 0 R +/Pg 13 0 R +/S /P +>> +endobj +389 0 obj +<< +/K 74 +/P 1308 0 R +/Pg 13 0 R +/S /P +>> +endobj +390 0 obj +<< +/Alt (MATNR) +/K 75 +/P 1308 0 R +/Pg 13 0 R +/S /P +>> +endobj +391 0 obj +<< +/K 76 +/P 1309 0 R +/Pg 13 0 R +/S /P +>> +endobj +392 0 obj +<< +/Alt (ZZMATTEXT) +/K 77 +/P 1309 0 R +/Pg 13 0 R +/S /P +>> +endobj +393 0 obj +<< +/K 78 +/P 1310 0 R +/Pg 13 0 R +/S /P +>> +endobj +394 0 obj +<< +/Alt (POSNR_VL) +/K 79 +/P 1310 0 R +/Pg 13 0 R +/S /P +>> +endobj +395 0 obj +<< +/K 80 +/P 1311 0 R +/Pg 13 0 R +/S /P +>> +endobj +396 0 obj +<< +/Alt (EAN11) +/K 81 +/P 1311 0 R +/Pg 13 0 R +/S /P +>> +endobj +397 0 obj +<< +/K 82 +/P 1312 0 R +/Pg 13 0 R +/S /P +>> +endobj +398 0 obj +<< +/Alt (BISMT) +/K 83 +/P 1312 0 R +/Pg 13 0 R +/S /P +>> +endobj +399 0 obj +<< +/K 84 +/P 1313 0 R +/Pg 13 0 R +/S /P +>> +endobj +400 0 obj +<< +/Alt (FKIMG) +/K 85 +/P 1313 0 R +/Pg 13 0 R +/S /P +>> +endobj +401 0 obj +<< +/K 86 +/P 1314 0 R +/Pg 13 0 R +/S /P +>> +endobj +402 0 obj +<< +/Alt (VRKME) +/K 87 +/P 1314 0 R +/Pg 13 0 R +/S /P +>> +endobj +403 0 obj +<< +/K 88 +/P 1315 0 R +/Pg 13 0 R +/S /P +>> +endobj +404 0 obj +<< +/Alt (PREIS_VF) +/K 89 +/P 1315 0 R +/Pg 13 0 R +/S /P +>> +endobj +405 0 obj +<< +/K 90 +/P 1316 0 R +/Pg 13 0 R +/S /P +>> +endobj +406 0 obj +<< +/Alt (PEINH_VF) +/K 91 +/P 1316 0 R +/Pg 13 0 R +/S /P +>> +endobj +407 0 obj +<< +/K 92 +/P 1317 0 R +/Pg 13 0 R +/S /P +>> +endobj +408 0 obj +<< +/Alt (POSPREIS_VF) +/K 93 +/P 1317 0 R +/Pg 13 0 R +/S /P +>> +endobj +409 0 obj +<< +/K 94 +/P 1318 0 R +/Pg 13 0 R +/S /P +>> +endobj +410 0 obj +<< +/K 95 +/P 1319 0 R +/Pg 13 0 R +/S /P +>> +endobj +411 0 obj +<< +/Alt (POSNR_VF) +/K 96 +/P 1319 0 R +/Pg 13 0 R +/S /P +>> +endobj +412 0 obj +<< +/K 97 +/P 1320 0 R +/Pg 13 0 R +/S /P +>> +endobj +413 0 obj +<< +/Alt (MATNR) +/K 98 +/P 1320 0 R +/Pg 13 0 R +/S /P +>> +endobj +414 0 obj +<< +/K 99 +/P 1321 0 R +/Pg 13 0 R +/S /P +>> +endobj +415 0 obj +<< +/Alt (ZZMATTEXT) +/K 100 +/P 1321 0 R +/Pg 13 0 R +/S /P +>> +endobj +416 0 obj +<< +/K 101 +/P 1322 0 R +/Pg 13 0 R +/S /P +>> +endobj +417 0 obj +<< +/Alt (POSNR_VL) +/K 102 +/P 1322 0 R +/Pg 13 0 R +/S /P +>> +endobj +418 0 obj +<< +/Alt (EAN11) +/K 103 +/P 1323 0 R +/Pg 13 0 R +/S /P +>> +endobj +419 0 obj +<< +/K 104 +/P 1324 0 R +/Pg 13 0 R +/S /P +>> +endobj +420 0 obj +<< +/Alt (BISMT) +/K 105 +/P 1324 0 R +/Pg 13 0 R +/S /P +>> +endobj +421 0 obj +<< +/K 106 +/P 1325 0 R +/Pg 13 0 R +/S /P +>> +endobj +422 0 obj +<< +/Alt (FKIMG) +/K 107 +/P 1325 0 R +/Pg 13 0 R +/S /P +>> +endobj +423 0 obj +<< +/K 108 +/P 1326 0 R +/Pg 13 0 R +/S /P +>> +endobj +424 0 obj +<< +/Alt (VRKME) +/K 109 +/P 1326 0 R +/Pg 13 0 R +/S /P +>> +endobj +425 0 obj +<< +/K 110 +/P 1327 0 R +/Pg 13 0 R +/S /P +>> +endobj +426 0 obj +<< +/Alt (PREIS_VF) +/K 111 +/P 1327 0 R +/Pg 13 0 R +/S /P +>> +endobj +427 0 obj +<< +/K 112 +/P 1328 0 R +/Pg 13 0 R +/S /P +>> +endobj +428 0 obj +<< +/Alt (PEINH_VF) +/K 113 +/P 1328 0 R +/Pg 13 0 R +/S /P +>> +endobj +429 0 obj +<< +/K 114 +/P 1329 0 R +/Pg 13 0 R +/S /P +>> +endobj +430 0 obj +<< +/Alt (POSPREIS_VF) +/K 115 +/P 1329 0 R +/Pg 13 0 R +/S /P +>> +endobj +431 0 obj +<< +/K 116 +/P 1330 0 R +/Pg 13 0 R +/S /P +>> +endobj +432 0 obj +<< +/K 117 +/P 1331 0 R +/Pg 13 0 R +/S /P +>> +endobj +433 0 obj +<< +/K 118 +/P 1332 0 R +/Pg 13 0 R +/S /P +>> +endobj +434 0 obj +<< +/Alt (ZUSCHLAGSWERT) +/K 119 +/P 1332 0 R +/Pg 13 0 R +/S /P +>> +endobj +435 0 obj +<< +/K 120 +/P 1333 0 R +/Pg 13 0 R +/S /P +>> +endobj +436 0 obj +<< +/Alt (POSNR_VF) +/K 121 +/P 1333 0 R +/Pg 13 0 R +/S /P +>> +endobj +437 0 obj +<< +/K 122 +/P 1334 0 R +/Pg 13 0 R +/S /P +>> +endobj +438 0 obj +<< +/Alt (MATNR) +/K 123 +/P 1334 0 R +/Pg 13 0 R +/S /P +>> +endobj +439 0 obj +<< +/K 124 +/P 1335 0 R +/Pg 13 0 R +/S /P +>> +endobj +440 0 obj +<< +/Alt (ZZMATTEXT) +/K 125 +/P 1335 0 R +/Pg 13 0 R +/S /P +>> +endobj +441 0 obj +<< +/K 126 +/P 1336 0 R +/Pg 13 0 R +/S /P +>> +endobj +442 0 obj +<< +/Alt (POSNR_VL) +/K 127 +/P 1336 0 R +/Pg 13 0 R +/S /P +>> +endobj +443 0 obj +<< +/Alt (EAN11) +/K 128 +/P 1337 0 R +/Pg 13 0 R +/S /P +>> +endobj +444 0 obj +<< +/K 129 +/P 1338 0 R +/Pg 13 0 R +/S /P +>> +endobj +445 0 obj +<< +/Alt (BISMT) +/K 130 +/P 1338 0 R +/Pg 13 0 R +/S /P +>> +endobj +446 0 obj +<< +/K 131 +/P 1339 0 R +/Pg 13 0 R +/S /P +>> +endobj +447 0 obj +<< +/Alt (FKIMG) +/K 132 +/P 1339 0 R +/Pg 13 0 R +/S /P +>> +endobj +448 0 obj +<< +/K 133 +/P 1340 0 R +/Pg 13 0 R +/S /P +>> +endobj +449 0 obj +<< +/Alt (VRKME) +/K 134 +/P 1340 0 R +/Pg 13 0 R +/S /P +>> +endobj +450 0 obj +<< +/K 135 +/P 1341 0 R +/Pg 13 0 R +/S /P +>> +endobj +451 0 obj +<< +/Alt (PREIS_VF) +/K 136 +/P 1341 0 R +/Pg 13 0 R +/S /P +>> +endobj +452 0 obj +<< +/K 137 +/P 1342 0 R +/Pg 13 0 R +/S /P +>> +endobj +453 0 obj +<< +/Alt (PEINH_VF) +/K 138 +/P 1342 0 R +/Pg 13 0 R +/S /P +>> +endobj +454 0 obj +<< +/K 139 +/P 1343 0 R +/Pg 13 0 R +/S /P +>> +endobj +455 0 obj +<< +/Alt (POSPREIS_VF) +/K 140 +/P 1343 0 R +/Pg 13 0 R +/S /P +>> +endobj +456 0 obj +<< +/K 141 +/P 1344 0 R +/Pg 13 0 R +/S /P +>> +endobj +457 0 obj +<< +/K 142 +/P 1345 0 R +/Pg 13 0 R +/S /P +>> +endobj +458 0 obj +<< +/K 143 +/P 1346 0 R +/Pg 13 0 R +/S /P +>> +endobj +459 0 obj +<< +/Alt (ZUSCHLAGSWERT) +/K 144 +/P 1346 0 R +/Pg 13 0 R +/S /P +>> +endobj +460 0 obj +<< +/K 145 +/P 1347 0 R +/Pg 13 0 R +/S /P +>> +endobj +461 0 obj +<< +/Alt (POSNR_VF) +/K 146 +/P 1347 0 R +/Pg 13 0 R +/S /P +>> +endobj +462 0 obj +<< +/K 147 +/P 1348 0 R +/Pg 13 0 R +/S /P +>> +endobj +463 0 obj +<< +/Alt (MATNR) +/K 148 +/P 1348 0 R +/Pg 13 0 R +/S /P +>> +endobj +464 0 obj +<< +/K 149 +/P 1349 0 R +/Pg 13 0 R +/S /P +>> +endobj +465 0 obj +<< +/Alt (ZZMATTEXT) +/K 150 +/P 1349 0 R +/Pg 13 0 R +/S /P +>> +endobj +466 0 obj +<< +/K 151 +/P 1350 0 R +/Pg 13 0 R +/S /P +>> +endobj +467 0 obj +<< +/Alt (POSNR_VL) +/K 152 +/P 1350 0 R +/Pg 13 0 R +/S /P +>> +endobj +468 0 obj +<< +/Alt (EAN11) +/K 153 +/P 1351 0 R +/Pg 13 0 R +/S /P +>> +endobj +469 0 obj +<< +/K 154 +/P 1352 0 R +/Pg 13 0 R +/S /P +>> +endobj +470 0 obj +<< +/Alt (BISMT) +/K 155 +/P 1352 0 R +/Pg 13 0 R +/S /P +>> +endobj +471 0 obj +<< +/K 156 +/P 1353 0 R +/Pg 13 0 R +/S /P +>> +endobj +472 0 obj +<< +/Alt (FKIMG) +/K 157 +/P 1353 0 R +/Pg 13 0 R +/S /P +>> +endobj +473 0 obj +<< +/K 158 +/P 1354 0 R +/Pg 13 0 R +/S /P +>> +endobj +474 0 obj +<< +/Alt (VRKME) +/K 159 +/P 1354 0 R +/Pg 13 0 R +/S /P +>> +endobj +475 0 obj +<< +/K 160 +/P 1355 0 R +/Pg 13 0 R +/S /P +>> +endobj +476 0 obj +<< +/Alt (PREIS_VF) +/K 161 +/P 1355 0 R +/Pg 13 0 R +/S /P +>> +endobj +477 0 obj +<< +/K 162 +/P 1356 0 R +/Pg 13 0 R +/S /P +>> +endobj +478 0 obj +<< +/Alt (PEINH_VF) +/K 163 +/P 1356 0 R +/Pg 13 0 R +/S /P +>> +endobj +479 0 obj +<< +/K 164 +/P 1357 0 R +/Pg 13 0 R +/S /P +>> +endobj +480 0 obj +<< +/Alt (POSPREIS_VF) +/K 165 +/P 1357 0 R +/Pg 13 0 R +/S /P +>> +endobj +481 0 obj +<< +/K 166 +/P 1358 0 R +/Pg 13 0 R +/S /P +>> +endobj +482 0 obj +<< +/K 167 +/P 1359 0 R +/Pg 13 0 R +/S /P +>> +endobj +483 0 obj +<< +/K 168 +/P 1360 0 R +/Pg 13 0 R +/S /P +>> +endobj +484 0 obj +<< +/Alt (ZUSCHLAGSWERT) +/K 169 +/P 1360 0 R +/Pg 13 0 R +/S /P +>> +endobj +485 0 obj +<< +/K 170 +/P 1361 0 R +/Pg 13 0 R +/S /P +>> +endobj +486 0 obj +<< +/Alt (POSNR_VF) +/K 171 +/P 1361 0 R +/Pg 13 0 R +/S /P +>> +endobj +487 0 obj +<< +/K 172 +/P 1362 0 R +/Pg 13 0 R +/S /P +>> +endobj +488 0 obj +<< +/Alt (MATNR) +/K 173 +/P 1362 0 R +/Pg 13 0 R +/S /P +>> +endobj +489 0 obj +<< +/K 174 +/P 1363 0 R +/Pg 13 0 R +/S /P +>> +endobj +490 0 obj +<< +/Alt (ZZMATTEXT) +/K 175 +/P 1363 0 R +/Pg 13 0 R +/S /P +>> +endobj +491 0 obj +<< +/K 176 +/P 1364 0 R +/Pg 13 0 R +/S /P +>> +endobj +492 0 obj +<< +/Alt (POSNR_VL) +/K 177 +/P 1364 0 R +/Pg 13 0 R +/S /P +>> +endobj +493 0 obj +<< +/K 178 +/P 1365 0 R +/Pg 13 0 R +/S /P +>> +endobj +494 0 obj +<< +/Alt (EAN11) +/K 179 +/P 1365 0 R +/Pg 13 0 R +/S /P +>> +endobj +495 0 obj +<< +/K 180 +/P 1366 0 R +/Pg 13 0 R +/S /P +>> +endobj +496 0 obj +<< +/Alt (BISMT) +/K 181 +/P 1366 0 R +/Pg 13 0 R +/S /P +>> +endobj +497 0 obj +<< +/K 182 +/P 1367 0 R +/Pg 13 0 R +/S /P +>> +endobj +498 0 obj +<< +/Alt (FKIMG) +/K 183 +/P 1367 0 R +/Pg 13 0 R +/S /P +>> +endobj +499 0 obj +<< +/K 184 +/P 1368 0 R +/Pg 13 0 R +/S /P +>> +endobj +500 0 obj +<< +/Alt (VRKME) +/K 185 +/P 1368 0 R +/Pg 13 0 R +/S /P +>> +endobj +501 0 obj +<< +/K 186 +/P 1369 0 R +/Pg 13 0 R +/S /P +>> +endobj +502 0 obj +<< +/Alt (PREIS_VF) +/K 187 +/P 1369 0 R +/Pg 13 0 R +/S /P +>> +endobj +503 0 obj +<< +/K 188 +/P 1370 0 R +/Pg 13 0 R +/S /P +>> +endobj +504 0 obj +<< +/Alt (PEINH_VF) +/K 189 +/P 1370 0 R +/Pg 13 0 R +/S /P +>> +endobj +505 0 obj +<< +/K 190 +/P 1371 0 R +/Pg 13 0 R +/S /P +>> +endobj +506 0 obj +<< +/Alt (POSPREIS_VF) +/K 191 +/P 1371 0 R +/Pg 13 0 R +/S /P +>> +endobj +507 0 obj +<< +/K 192 +/P 1372 0 R +/Pg 13 0 R +/S /P +>> +endobj +508 0 obj +<< +/K 193 +/P 1373 0 R +/Pg 13 0 R +/S /P +>> +endobj +509 0 obj +<< +/Alt (POSNR_VF) +/K 194 +/P 1373 0 R +/Pg 13 0 R +/S /P +>> +endobj +510 0 obj +<< +/K 195 +/P 1374 0 R +/Pg 13 0 R +/S /P +>> +endobj +511 0 obj +<< +/Alt (MATNR) +/K 196 +/P 1374 0 R +/Pg 13 0 R +/S /P +>> +endobj +512 0 obj +<< +/K 197 +/P 1375 0 R +/Pg 13 0 R +/S /P +>> +endobj +513 0 obj +<< +/Alt (ZZMATTEXT) +/K 198 +/P 1375 0 R +/Pg 13 0 R +/S /P +>> +endobj +514 0 obj +<< +/K 199 +/P 1376 0 R +/Pg 13 0 R +/S /P +>> +endobj +515 0 obj +<< +/Alt (POSNR_VL) +/K 200 +/P 1376 0 R +/Pg 13 0 R +/S /P +>> +endobj +516 0 obj +<< +/K 201 +/P 1377 0 R +/Pg 13 0 R +/S /P +>> +endobj +517 0 obj +<< +/Alt (EAN11) +/K 202 +/P 1377 0 R +/Pg 13 0 R +/S /P +>> +endobj +518 0 obj +<< +/K 203 +/P 1378 0 R +/Pg 13 0 R +/S /P +>> +endobj +519 0 obj +<< +/Alt (BISMT) +/K 204 +/P 1378 0 R +/Pg 13 0 R +/S /P +>> +endobj +520 0 obj +<< +/K 205 +/P 1379 0 R +/Pg 13 0 R +/S /P +>> +endobj +521 0 obj +<< +/Alt (FKIMG) +/K 206 +/P 1379 0 R +/Pg 13 0 R +/S /P +>> +endobj +522 0 obj +<< +/K 207 +/P 1380 0 R +/Pg 13 0 R +/S /P +>> +endobj +523 0 obj +<< +/Alt (VRKME) +/K 208 +/P 1380 0 R +/Pg 13 0 R +/S /P +>> +endobj +524 0 obj +<< +/K 209 +/P 1381 0 R +/Pg 13 0 R +/S /P +>> +endobj +525 0 obj +<< +/Alt (PREIS_VF) +/K 210 +/P 1381 0 R +/Pg 13 0 R +/S /P +>> +endobj +526 0 obj +<< +/K 211 +/P 1382 0 R +/Pg 13 0 R +/S /P +>> +endobj +527 0 obj +<< +/Alt (PEINH_VF) +/K 212 +/P 1382 0 R +/Pg 13 0 R +/S /P +>> +endobj +528 0 obj +<< +/K 213 +/P 1383 0 R +/Pg 13 0 R +/S /P +>> +endobj +529 0 obj +<< +/Alt (POSPREIS_VF) +/K 214 +/P 1383 0 R +/Pg 13 0 R +/S /P +>> +endobj +530 0 obj +<< +/K 215 +/P 1384 0 R +/Pg 13 0 R +/S /P +>> +endobj +531 0 obj +<< +/K 216 +/P 1385 0 R +/Pg 13 0 R +/S /P +>> +endobj +532 0 obj +<< +/Alt (POSNR_VF) +/K 217 +/P 1385 0 R +/Pg 13 0 R +/S /P +>> +endobj +533 0 obj +<< +/K 218 +/P 1386 0 R +/Pg 13 0 R +/S /P +>> +endobj +534 0 obj +<< +/Alt (MATNR) +/K 219 +/P 1386 0 R +/Pg 13 0 R +/S /P +>> +endobj +535 0 obj +<< +/K 220 +/P 1387 0 R +/Pg 13 0 R +/S /P +>> +endobj +536 0 obj +<< +/Alt (ZZMATTEXT) +/K 221 +/P 1387 0 R +/Pg 13 0 R +/S /P +>> +endobj +537 0 obj +<< +/K 222 +/P 1388 0 R +/Pg 13 0 R +/S /P +>> +endobj +538 0 obj +<< +/Alt (POSNR_VL) +/K 223 +/P 1388 0 R +/Pg 13 0 R +/S /P +>> +endobj +539 0 obj +<< +/K 224 +/P 1389 0 R +/Pg 13 0 R +/S /P +>> +endobj +540 0 obj +<< +/Alt (EAN11) +/K 225 +/P 1389 0 R +/Pg 13 0 R +/S /P +>> +endobj +541 0 obj +<< +/K 226 +/P 1390 0 R +/Pg 13 0 R +/S /P +>> +endobj +542 0 obj +<< +/Alt (BISMT) +/K 227 +/P 1390 0 R +/Pg 13 0 R +/S /P +>> +endobj +543 0 obj +<< +/K 228 +/P 1391 0 R +/Pg 13 0 R +/S /P +>> +endobj +544 0 obj +<< +/Alt (FKIMG) +/K 229 +/P 1391 0 R +/Pg 13 0 R +/S /P +>> +endobj +545 0 obj +<< +/K 230 +/P 1392 0 R +/Pg 13 0 R +/S /P +>> +endobj +546 0 obj +<< +/Alt (VRKME) +/K 231 +/P 1392 0 R +/Pg 13 0 R +/S /P +>> +endobj +547 0 obj +<< +/K 232 +/P 1393 0 R +/Pg 13 0 R +/S /P +>> +endobj +548 0 obj +<< +/Alt (PREIS_VF) +/K 233 +/P 1393 0 R +/Pg 13 0 R +/S /P +>> +endobj +549 0 obj +<< +/K 234 +/P 1394 0 R +/Pg 13 0 R +/S /P +>> +endobj +550 0 obj +<< +/Alt (PEINH_VF) +/K 235 +/P 1394 0 R +/Pg 13 0 R +/S /P +>> +endobj +551 0 obj +<< +/K 236 +/P 1395 0 R +/Pg 13 0 R +/S /P +>> +endobj +552 0 obj +<< +/Alt (POSPREIS_VF) +/K 237 +/P 1395 0 R +/Pg 13 0 R +/S /P +>> +endobj +553 0 obj +<< +/K 238 +/P 1396 0 R +/Pg 13 0 R +/S /P +>> +endobj +554 0 obj +<< +/K 239 +/P 1397 0 R +/Pg 13 0 R +/S /P +>> +endobj +555 0 obj +<< +/Alt (POSNR_VF) +/K 240 +/P 1397 0 R +/Pg 13 0 R +/S /P +>> +endobj +556 0 obj +<< +/K 241 +/P 1398 0 R +/Pg 13 0 R +/S /P +>> +endobj +557 0 obj +<< +/Alt (MATNR) +/K 242 +/P 1398 0 R +/Pg 13 0 R +/S /P +>> +endobj +558 0 obj +<< +/K 243 +/P 1399 0 R +/Pg 13 0 R +/S /P +>> +endobj +559 0 obj +<< +/Alt (ZZMATTEXT) +/K 244 +/P 1399 0 R +/Pg 13 0 R +/S /P +>> +endobj +560 0 obj +<< +/K 245 +/P 1400 0 R +/Pg 13 0 R +/S /P +>> +endobj +561 0 obj +<< +/Alt (POSNR_VL) +/K 246 +/P 1400 0 R +/Pg 13 0 R +/S /P +>> +endobj +562 0 obj +<< +/K 247 +/P 1401 0 R +/Pg 13 0 R +/S /P +>> +endobj +563 0 obj +<< +/Alt (EAN11) +/K 248 +/P 1401 0 R +/Pg 13 0 R +/S /P +>> +endobj +564 0 obj +<< +/K 249 +/P 1402 0 R +/Pg 13 0 R +/S /P +>> +endobj +565 0 obj +<< +/Alt (BISMT) +/K 250 +/P 1402 0 R +/Pg 13 0 R +/S /P +>> +endobj +566 0 obj +<< +/K 251 +/P 1403 0 R +/Pg 13 0 R +/S /P +>> +endobj +567 0 obj +<< +/Alt (FKIMG) +/K 252 +/P 1403 0 R +/Pg 13 0 R +/S /P +>> +endobj +568 0 obj +<< +/K 253 +/P 1404 0 R +/Pg 13 0 R +/S /P +>> +endobj +569 0 obj +<< +/Alt (VRKME) +/K 254 +/P 1404 0 R +/Pg 13 0 R +/S /P +>> +endobj +570 0 obj +<< +/K 255 +/P 1405 0 R +/Pg 13 0 R +/S /P +>> +endobj +571 0 obj +<< +/Alt (PREIS_VF) +/K 256 +/P 1405 0 R +/Pg 13 0 R +/S /P +>> +endobj +572 0 obj +<< +/K 257 +/P 1406 0 R +/Pg 13 0 R +/S /P +>> +endobj +573 0 obj +<< +/Alt (PEINH_VF) +/K 258 +/P 1406 0 R +/Pg 13 0 R +/S /P +>> +endobj +574 0 obj +<< +/K 259 +/P 1407 0 R +/Pg 13 0 R +/S /P +>> +endobj +575 0 obj +<< +/Alt (POSPREIS_VF) +/K 260 +/P 1407 0 R +/Pg 13 0 R +/S /P +>> +endobj +576 0 obj +<< +/K 261 +/P 1408 0 R +/Pg 13 0 R +/S /P +>> +endobj +577 0 obj +<< +/K 262 +/P 1409 0 R +/Pg 13 0 R +/S /P +>> +endobj +578 0 obj +<< +/Alt (POSNR_VF) +/K 263 +/P 1409 0 R +/Pg 13 0 R +/S /P +>> +endobj +579 0 obj +<< +/K 264 +/P 1410 0 R +/Pg 13 0 R +/S /P +>> +endobj +580 0 obj +<< +/Alt (MATNR) +/K 265 +/P 1410 0 R +/Pg 13 0 R +/S /P +>> +endobj +581 0 obj +<< +/K 266 +/P 1411 0 R +/Pg 13 0 R +/S /P +>> +endobj +582 0 obj +<< +/Alt (ZZMATTEXT) +/K 267 +/P 1411 0 R +/Pg 13 0 R +/S /P +>> +endobj +583 0 obj +<< +/K 268 +/P 1412 0 R +/Pg 13 0 R +/S /P +>> +endobj +584 0 obj +<< +/Alt (POSNR_VL) +/K 269 +/P 1412 0 R +/Pg 13 0 R +/S /P +>> +endobj +585 0 obj +<< +/K 270 +/P 1413 0 R +/Pg 13 0 R +/S /P +>> +endobj +586 0 obj +<< +/Alt (EAN11) +/K 271 +/P 1413 0 R +/Pg 13 0 R +/S /P +>> +endobj +587 0 obj +<< +/K 272 +/P 1414 0 R +/Pg 13 0 R +/S /P +>> +endobj +588 0 obj +<< +/Alt (BISMT) +/K 273 +/P 1414 0 R +/Pg 13 0 R +/S /P +>> +endobj +589 0 obj +<< +/K 274 +/P 1415 0 R +/Pg 13 0 R +/S /P +>> +endobj +590 0 obj +<< +/Alt (FKIMG) +/K 275 +/P 1415 0 R +/Pg 13 0 R +/S /P +>> +endobj +591 0 obj +<< +/K 276 +/P 1416 0 R +/Pg 13 0 R +/S /P +>> +endobj +592 0 obj +<< +/Alt (VRKME) +/K 277 +/P 1416 0 R +/Pg 13 0 R +/S /P +>> +endobj +593 0 obj +<< +/K 278 +/P 1417 0 R +/Pg 13 0 R +/S /P +>> +endobj +594 0 obj +<< +/Alt (PREIS_VF) +/K 279 +/P 1417 0 R +/Pg 13 0 R +/S /P +>> +endobj +595 0 obj +<< +/K 280 +/P 1418 0 R +/Pg 13 0 R +/S /P +>> +endobj +596 0 obj +<< +/Alt (PEINH_VF) +/K 281 +/P 1418 0 R +/Pg 13 0 R +/S /P +>> +endobj +597 0 obj +<< +/K 282 +/P 1419 0 R +/Pg 13 0 R +/S /P +>> +endobj +598 0 obj +<< +/Alt (POSPREIS_VF) +/K 283 +/P 1419 0 R +/Pg 13 0 R +/S /P +>> +endobj +599 0 obj +<< +/K 284 +/P 1420 0 R +/Pg 13 0 R +/S /P +>> +endobj +600 0 obj +<< +/K 285 +/P 1421 0 R +/Pg 13 0 R +/S /P +>> +endobj +601 0 obj +<< +/Alt (POSNR_VF) +/K 286 +/P 1421 0 R +/Pg 13 0 R +/S /P +>> +endobj +602 0 obj +<< +/K 287 +/P 1422 0 R +/Pg 13 0 R +/S /P +>> +endobj +603 0 obj +<< +/Alt (MATNR) +/K 288 +/P 1422 0 R +/Pg 13 0 R +/S /P +>> +endobj +604 0 obj +<< +/K 289 +/P 1423 0 R +/Pg 13 0 R +/S /P +>> +endobj +605 0 obj +<< +/Alt (ZZMATTEXT) +/K 290 +/P 1423 0 R +/Pg 13 0 R +/S /P +>> +endobj +606 0 obj +<< +/K 291 +/P 1424 0 R +/Pg 13 0 R +/S /P +>> +endobj +607 0 obj +<< +/Alt (POSNR_VL) +/K 292 +/P 1424 0 R +/Pg 13 0 R +/S /P +>> +endobj +608 0 obj +<< +/K 293 +/P 1425 0 R +/Pg 13 0 R +/S /P +>> +endobj +609 0 obj +<< +/Alt (EAN11) +/K 294 +/P 1425 0 R +/Pg 13 0 R +/S /P +>> +endobj +610 0 obj +<< +/K 295 +/P 1426 0 R +/Pg 13 0 R +/S /P +>> +endobj +611 0 obj +<< +/Alt (BISMT) +/K 296 +/P 1426 0 R +/Pg 13 0 R +/S /P +>> +endobj +612 0 obj +<< +/K 297 +/P 1427 0 R +/Pg 13 0 R +/S /P +>> +endobj +613 0 obj +<< +/Alt (FKIMG) +/K 298 +/P 1427 0 R +/Pg 13 0 R +/S /P +>> +endobj +614 0 obj +<< +/K 299 +/P 1428 0 R +/Pg 13 0 R +/S /P +>> +endobj +615 0 obj +<< +/Alt (VRKME) +/K 300 +/P 1428 0 R +/Pg 13 0 R +/S /P +>> +endobj +616 0 obj +<< +/K 301 +/P 1429 0 R +/Pg 13 0 R +/S /P +>> +endobj +617 0 obj +<< +/Alt (PREIS_VF) +/K 302 +/P 1429 0 R +/Pg 13 0 R +/S /P +>> +endobj +618 0 obj +<< +/K 303 +/P 1430 0 R +/Pg 13 0 R +/S /P +>> +endobj +619 0 obj +<< +/Alt (PEINH_VF) +/K 304 +/P 1430 0 R +/Pg 13 0 R +/S /P +>> +endobj +620 0 obj +<< +/K 305 +/P 1431 0 R +/Pg 13 0 R +/S /P +>> +endobj +621 0 obj +<< +/Alt (POSPREIS_VF) +/K 306 +/P 1431 0 R +/Pg 13 0 R +/S /P +>> +endobj +622 0 obj +<< +/K 307 +/P 1432 0 R +/Pg 13 0 R +/S /P +>> +endobj +623 0 obj +<< +/K 308 +/P 1433 0 R +/Pg 13 0 R +/S /P +>> +endobj +624 0 obj +<< +/Alt (POSNR_VF) +/K 309 +/P 1433 0 R +/Pg 13 0 R +/S /P +>> +endobj +625 0 obj +<< +/K 310 +/P 1434 0 R +/Pg 13 0 R +/S /P +>> +endobj +626 0 obj +<< +/Alt (MATNR) +/K 311 +/P 1434 0 R +/Pg 13 0 R +/S /P +>> +endobj +627 0 obj +<< +/K 312 +/P 1435 0 R +/Pg 13 0 R +/S /P +>> +endobj +628 0 obj +<< +/Alt (ZZMATTEXT) +/K 313 +/P 1435 0 R +/Pg 13 0 R +/S /P +>> +endobj +629 0 obj +<< +/K 314 +/P 1436 0 R +/Pg 13 0 R +/S /P +>> +endobj +630 0 obj +<< +/Alt (POSNR_VL) +/K 315 +/P 1436 0 R +/Pg 13 0 R +/S /P +>> +endobj +631 0 obj +<< +/K 316 +/P 1437 0 R +/Pg 13 0 R +/S /P +>> +endobj +632 0 obj +<< +/Alt (EAN11) +/K 317 +/P 1437 0 R +/Pg 13 0 R +/S /P +>> +endobj +633 0 obj +<< +/K 318 +/P 1438 0 R +/Pg 13 0 R +/S /P +>> +endobj +634 0 obj +<< +/Alt (BISMT) +/K 319 +/P 1438 0 R +/Pg 13 0 R +/S /P +>> +endobj +635 0 obj +<< +/K 320 +/P 1439 0 R +/Pg 13 0 R +/S /P +>> +endobj +636 0 obj +<< +/Alt (FKIMG) +/K 321 +/P 1439 0 R +/Pg 13 0 R +/S /P +>> +endobj +637 0 obj +<< +/K 322 +/P 1440 0 R +/Pg 13 0 R +/S /P +>> +endobj +638 0 obj +<< +/Alt (VRKME) +/K 323 +/P 1440 0 R +/Pg 13 0 R +/S /P +>> +endobj +639 0 obj +<< +/K 324 +/P 1441 0 R +/Pg 13 0 R +/S /P +>> +endobj +640 0 obj +<< +/Alt (PREIS_VF) +/K 325 +/P 1441 0 R +/Pg 13 0 R +/S /P +>> +endobj +641 0 obj +<< +/K 326 +/P 1442 0 R +/Pg 13 0 R +/S /P +>> +endobj +642 0 obj +<< +/Alt (PEINH_VF) +/K 327 +/P 1442 0 R +/Pg 13 0 R +/S /P +>> +endobj +643 0 obj +<< +/K 328 +/P 1443 0 R +/Pg 13 0 R +/S /P +>> +endobj +644 0 obj +<< +/Alt (POSPREIS_VF) +/K 329 +/P 1443 0 R +/Pg 13 0 R +/S /P +>> +endobj +645 0 obj +<< +/K 330 +/P 1444 0 R +/Pg 13 0 R +/S /P +>> +endobj +646 0 obj +<< +/K 331 +/P 1445 0 R +/Pg 13 0 R +/S /P +>> +endobj +647 0 obj +<< +/Alt (POSNR_VF) +/K 332 +/P 1445 0 R +/Pg 13 0 R +/S /P +>> +endobj +648 0 obj +<< +/K 333 +/P 1446 0 R +/Pg 13 0 R +/S /P +>> +endobj +649 0 obj +<< +/Alt (MATNR) +/K 334 +/P 1446 0 R +/Pg 13 0 R +/S /P +>> +endobj +650 0 obj +<< +/K 335 +/P 1447 0 R +/Pg 13 0 R +/S /P +>> +endobj +651 0 obj +<< +/Alt (ZZMATTEXT) +/K 336 +/P 1447 0 R +/Pg 13 0 R +/S /P +>> +endobj +652 0 obj +<< +/K 337 +/P 1448 0 R +/Pg 13 0 R +/S /P +>> +endobj +653 0 obj +<< +/Alt (POSNR_VL) +/K 338 +/P 1448 0 R +/Pg 13 0 R +/S /P +>> +endobj +654 0 obj +<< +/K 339 +/P 1449 0 R +/Pg 13 0 R +/S /P +>> +endobj +655 0 obj +<< +/Alt (EAN11) +/K 340 +/P 1449 0 R +/Pg 13 0 R +/S /P +>> +endobj +656 0 obj +<< +/K 341 +/P 1450 0 R +/Pg 13 0 R +/S /P +>> +endobj +657 0 obj +<< +/Alt (BISMT) +/K 342 +/P 1450 0 R +/Pg 13 0 R +/S /P +>> +endobj +658 0 obj +<< +/K 343 +/P 1451 0 R +/Pg 13 0 R +/S /P +>> +endobj +659 0 obj +<< +/Alt (FKIMG) +/K 344 +/P 1451 0 R +/Pg 13 0 R +/S /P +>> +endobj +660 0 obj +<< +/K 345 +/P 1452 0 R +/Pg 13 0 R +/S /P +>> +endobj +661 0 obj +<< +/Alt (VRKME) +/K 346 +/P 1452 0 R +/Pg 13 0 R +/S /P +>> +endobj +662 0 obj +<< +/K 347 +/P 1453 0 R +/Pg 13 0 R +/S /P +>> +endobj +663 0 obj +<< +/Alt (PREIS_VF) +/K 348 +/P 1453 0 R +/Pg 13 0 R +/S /P +>> +endobj +664 0 obj +<< +/K 349 +/P 1454 0 R +/Pg 13 0 R +/S /P +>> +endobj +665 0 obj +<< +/Alt (PEINH_VF) +/K 350 +/P 1454 0 R +/Pg 13 0 R +/S /P +>> +endobj +666 0 obj +<< +/K 351 +/P 1455 0 R +/Pg 13 0 R +/S /P +>> +endobj +667 0 obj +<< +/Alt (POSPREIS_VF) +/K 352 +/P 1455 0 R +/Pg 13 0 R +/S /P +>> +endobj +668 0 obj +<< +/K 353 +/P 1456 0 R +/Pg 13 0 R +/S /P +>> +endobj +669 0 obj +<< +/K 354 +/P 1457 0 R +/Pg 13 0 R +/S /P +>> +endobj +670 0 obj +<< +/Alt (POSNR_VF) +/K 355 +/P 1457 0 R +/Pg 13 0 R +/S /P +>> +endobj +671 0 obj +<< +/K 356 +/P 1458 0 R +/Pg 13 0 R +/S /P +>> +endobj +672 0 obj +<< +/Alt (MATNR) +/K 357 +/P 1458 0 R +/Pg 13 0 R +/S /P +>> +endobj +673 0 obj +<< +/K 358 +/P 1459 0 R +/Pg 13 0 R +/S /P +>> +endobj +674 0 obj +<< +/Alt (ZZMATTEXT) +/K 359 +/P 1459 0 R +/Pg 13 0 R +/S /P +>> +endobj +675 0 obj +<< +/K 360 +/P 1460 0 R +/Pg 13 0 R +/S /P +>> +endobj +676 0 obj +<< +/Alt (POSNR_VL) +/K 361 +/P 1460 0 R +/Pg 13 0 R +/S /P +>> +endobj +677 0 obj +<< +/K 362 +/P 1461 0 R +/Pg 13 0 R +/S /P +>> +endobj +678 0 obj +<< +/Alt (EAN11) +/K 363 +/P 1461 0 R +/Pg 13 0 R +/S /P +>> +endobj +679 0 obj +<< +/K 364 +/P 1462 0 R +/Pg 13 0 R +/S /P +>> +endobj +680 0 obj +<< +/Alt (BISMT) +/K 365 +/P 1462 0 R +/Pg 13 0 R +/S /P +>> +endobj +681 0 obj +<< +/K 366 +/P 1463 0 R +/Pg 13 0 R +/S /P +>> +endobj +682 0 obj +<< +/Alt (FKIMG) +/K 367 +/P 1463 0 R +/Pg 13 0 R +/S /P +>> +endobj +683 0 obj +<< +/K 368 +/P 1464 0 R +/Pg 13 0 R +/S /P +>> +endobj +684 0 obj +<< +/Alt (VRKME) +/K 369 +/P 1464 0 R +/Pg 13 0 R +/S /P +>> +endobj +685 0 obj +<< +/K 370 +/P 1465 0 R +/Pg 13 0 R +/S /P +>> +endobj +686 0 obj +<< +/Alt (PREIS_VF) +/K 371 +/P 1465 0 R +/Pg 13 0 R +/S /P +>> +endobj +687 0 obj +<< +/K 372 +/P 1466 0 R +/Pg 13 0 R +/S /P +>> +endobj +688 0 obj +<< +/Alt (PEINH_VF) +/K 373 +/P 1466 0 R +/Pg 13 0 R +/S /P +>> +endobj +689 0 obj +<< +/K 374 +/P 1467 0 R +/Pg 13 0 R +/S /P +>> +endobj +690 0 obj +<< +/Alt (POSPREIS_VF) +/K 375 +/P 1467 0 R +/Pg 13 0 R +/S /P +>> +endobj +691 0 obj +<< +/K 376 +/P 1468 0 R +/Pg 13 0 R +/S /P +>> +endobj +692 0 obj +<< +/K 377 +/P 1469 0 R +/Pg 13 0 R +/S /P +>> +endobj +693 0 obj +<< +/Alt (POSNR_VF) +/K 378 +/P 1469 0 R +/Pg 13 0 R +/S /P +>> +endobj +694 0 obj +<< +/K 379 +/P 1470 0 R +/Pg 13 0 R +/S /P +>> +endobj +695 0 obj +<< +/Alt (MATNR) +/K 380 +/P 1470 0 R +/Pg 13 0 R +/S /P +>> +endobj +696 0 obj +<< +/K 381 +/P 1471 0 R +/Pg 13 0 R +/S /P +>> +endobj +697 0 obj +<< +/Alt (ZZMATTEXT) +/K 382 +/P 1471 0 R +/Pg 13 0 R +/S /P +>> +endobj +698 0 obj +<< +/K 383 +/P 1472 0 R +/Pg 13 0 R +/S /P +>> +endobj +699 0 obj +<< +/Alt (POSNR_VL) +/K 384 +/P 1472 0 R +/Pg 13 0 R +/S /P +>> +endobj +700 0 obj +<< +/K 385 +/P 1473 0 R +/Pg 13 0 R +/S /P +>> +endobj +701 0 obj +<< +/Alt (EAN11) +/K 386 +/P 1473 0 R +/Pg 13 0 R +/S /P +>> +endobj +702 0 obj +<< +/K 387 +/P 1474 0 R +/Pg 13 0 R +/S /P +>> +endobj +703 0 obj +<< +/Alt (BISMT) +/K 388 +/P 1474 0 R +/Pg 13 0 R +/S /P +>> +endobj +704 0 obj +<< +/K 389 +/P 1475 0 R +/Pg 13 0 R +/S /P +>> +endobj +705 0 obj +<< +/Alt (FKIMG) +/K 390 +/P 1475 0 R +/Pg 13 0 R +/S /P +>> +endobj +706 0 obj +<< +/K 391 +/P 1476 0 R +/Pg 13 0 R +/S /P +>> +endobj +707 0 obj +<< +/Alt (VRKME) +/K 392 +/P 1476 0 R +/Pg 13 0 R +/S /P +>> +endobj +708 0 obj +<< +/K 393 +/P 1477 0 R +/Pg 13 0 R +/S /P +>> +endobj +709 0 obj +<< +/Alt (PREIS_VF) +/K 394 +/P 1477 0 R +/Pg 13 0 R +/S /P +>> +endobj +710 0 obj +<< +/K 395 +/P 1478 0 R +/Pg 13 0 R +/S /P +>> +endobj +711 0 obj +<< +/Alt (PEINH_VF) +/K 396 +/P 1478 0 R +/Pg 13 0 R +/S /P +>> +endobj +712 0 obj +<< +/K 397 +/P 1479 0 R +/Pg 13 0 R +/S /P +>> +endobj +713 0 obj +<< +/Alt (POSPREIS_VF) +/K 398 +/P 1479 0 R +/Pg 13 0 R +/S /P +>> +endobj +714 0 obj +<< +/K 399 +/P 1480 0 R +/Pg 13 0 R +/S /P +>> +endobj +715 0 obj +<< +/K 400 +/P 1481 0 R +/Pg 13 0 R +/S /P +>> +endobj +716 0 obj +<< +/Alt (POSNR_VF) +/K 401 +/P 1481 0 R +/Pg 13 0 R +/S /P +>> +endobj +717 0 obj +<< +/K 402 +/P 1482 0 R +/Pg 13 0 R +/S /P +>> +endobj +718 0 obj +<< +/Alt (MATNR) +/K 403 +/P 1482 0 R +/Pg 13 0 R +/S /P +>> +endobj +719 0 obj +<< +/K 404 +/P 1483 0 R +/Pg 13 0 R +/S /P +>> +endobj +720 0 obj +<< +/Alt (ZZMATTEXT) +/K 405 +/P 1483 0 R +/Pg 13 0 R +/S /P +>> +endobj +721 0 obj +<< +/K 406 +/P 1484 0 R +/Pg 13 0 R +/S /P +>> +endobj +722 0 obj +<< +/Alt (POSNR_VL) +/K 407 +/P 1484 0 R +/Pg 13 0 R +/S /P +>> +endobj +723 0 obj +<< +/K 408 +/P 1485 0 R +/Pg 13 0 R +/S /P +>> +endobj +724 0 obj +<< +/Alt (EAN11) +/K 409 +/P 1485 0 R +/Pg 13 0 R +/S /P +>> +endobj +725 0 obj +<< +/K 410 +/P 1486 0 R +/Pg 13 0 R +/S /P +>> +endobj +726 0 obj +<< +/Alt (BISMT) +/K 411 +/P 1486 0 R +/Pg 13 0 R +/S /P +>> +endobj +727 0 obj +<< +/K 412 +/P 1487 0 R +/Pg 13 0 R +/S /P +>> +endobj +728 0 obj +<< +/Alt (FKIMG) +/K 413 +/P 1487 0 R +/Pg 13 0 R +/S /P +>> +endobj +729 0 obj +<< +/K 414 +/P 1488 0 R +/Pg 13 0 R +/S /P +>> +endobj +730 0 obj +<< +/Alt (VRKME) +/K 415 +/P 1488 0 R +/Pg 13 0 R +/S /P +>> +endobj +731 0 obj +<< +/K 416 +/P 1489 0 R +/Pg 13 0 R +/S /P +>> +endobj +732 0 obj +<< +/Alt (PREIS_VF) +/K 417 +/P 1489 0 R +/Pg 13 0 R +/S /P +>> +endobj +733 0 obj +<< +/K 418 +/P 1490 0 R +/Pg 13 0 R +/S /P +>> +endobj +734 0 obj +<< +/Alt (PEINH_VF) +/K 419 +/P 1490 0 R +/Pg 13 0 R +/S /P +>> +endobj +735 0 obj +<< +/K 420 +/P 1491 0 R +/Pg 13 0 R +/S /P +>> +endobj +736 0 obj +<< +/Alt (POSPREIS_VF) +/K 421 +/P 1491 0 R +/Pg 13 0 R +/S /P +>> +endobj +737 0 obj +<< +/K 422 +/P 1492 0 R +/Pg 13 0 R +/S /P +>> +endobj +738 0 obj +<< +/K 423 +/P 1493 0 R +/Pg 13 0 R +/S /P +>> +endobj +739 0 obj +<< +/Alt (POSNR_VF) +/K 424 +/P 1493 0 R +/Pg 13 0 R +/S /P +>> +endobj +740 0 obj +<< +/K 425 +/P 1494 0 R +/Pg 13 0 R +/S /P +>> +endobj +741 0 obj +<< +/Alt (MATNR) +/K 426 +/P 1494 0 R +/Pg 13 0 R +/S /P +>> +endobj +742 0 obj +<< +/K 427 +/P 1495 0 R +/Pg 13 0 R +/S /P +>> +endobj +743 0 obj +<< +/Alt (ZZMATTEXT) +/K 428 +/P 1495 0 R +/Pg 13 0 R +/S /P +>> +endobj +744 0 obj +<< +/K 0 +/P 1496 0 R +/Pg 14 0 R +/S /P +>> +endobj +745 0 obj +<< +/Alt (sonepar_text) +/K 1 +/P 1496 0 R +/Pg 14 0 R +/S /P +>> +endobj +746 0 obj +<< +/Alt (IDES LOGO) +/K 2 +/P 1497 0 R +/Pg 14 0 R +/S /Figure +>> +endobj +747 0 obj +<< +/K 3 +/P 1498 0 R +/Pg 14 0 R +/S /P +>> +endobj +748 0 obj +<< +/K 4 +/P 1499 0 R +/Pg 14 0 R +/S /P +>> +endobj +749 0 obj +<< +/K 5 +/P 1500 0 R +/Pg 14 0 R +/S /P +>> +endobj +750 0 obj +<< +/K 6 +/P 1501 0 R +/Pg 14 0 R +/S /P +>> +endobj +751 0 obj +<< +/Alt (Footer Text) +/K 7 +/P 1501 0 R +/Pg 14 0 R +/S /P +>> +endobj +752 0 obj +<< +/K 8 +/P 1502 0 R +/Pg 14 0 R +/S /P +>> +endobj +753 0 obj +<< +/Alt (SUBSIDIARY_INFO) +/K 9 +/P 1502 0 R +/Pg 14 0 R +/S /P +>> +endobj +754 0 obj +<< +/K 10 +/P 1503 0 R +/Pg 14 0 R +/S /P +>> +endobj +755 0 obj +<< +/Alt (POSNR_TXT_1) +/K 11 +/P 1503 0 R +/Pg 14 0 R +/S /P +>> +endobj +756 0 obj +<< +/K 12 +/P 1504 0 R +/Pg 14 0 R +/S /P +>> +endobj +757 0 obj +<< +/K 13 +/P 1505 0 R +/Pg 14 0 R +/S /P +>> +endobj +758 0 obj +<< +/K 14 +/P 1506 0 R +/Pg 14 0 R +/S /P +>> +endobj +759 0 obj +<< +/Alt (POSNR_TXT_2) +/K 15 +/P 1506 0 R +/Pg 14 0 R +/S /P +>> +endobj +760 0 obj +<< +/K 16 +/P 1507 0 R +/Pg 14 0 R +/S /P +>> +endobj +761 0 obj +<< +/K 17 +/P 1508 0 R +/Pg 14 0 R +/S /P +>> +endobj +762 0 obj +<< +/K 18 +/P 1509 0 R +/Pg 14 0 R +/S /P +>> +endobj +763 0 obj +<< +/K 19 +/P 1510 0 R +/Pg 14 0 R +/S /P +>> +endobj +764 0 obj +<< +/K 20 +/P 1511 0 R +/Pg 14 0 R +/S /P +>> +endobj +765 0 obj +<< +/K 21 +/P 1512 0 R +/Pg 14 0 R +/S /P +>> +endobj +766 0 obj +<< +/K 22 +/P 1513 0 R +/Pg 14 0 R +/S /P +>> +endobj +767 0 obj +<< +/K 23 +/P 1514 0 R +/Pg 14 0 R +/S /P +>> +endobj +768 0 obj +<< +/Alt (POSNR_VL) +/K 24 +/P 1514 0 R +/Pg 14 0 R +/S /P +>> +endobj +769 0 obj +<< +/K 25 +/P 1515 0 R +/Pg 14 0 R +/S /P +>> +endobj +770 0 obj +<< +/Alt (EAN11) +/K 26 +/P 1515 0 R +/Pg 14 0 R +/S /P +>> +endobj +771 0 obj +<< +/K 27 +/P 1516 0 R +/Pg 14 0 R +/S /P +>> +endobj +772 0 obj +<< +/Alt (BISMT) +/K 28 +/P 1516 0 R +/Pg 14 0 R +/S /P +>> +endobj +773 0 obj +<< +/K 29 +/P 1517 0 R +/Pg 14 0 R +/S /P +>> +endobj +774 0 obj +<< +/Alt (FKIMG) +/K 30 +/P 1517 0 R +/Pg 14 0 R +/S /P +>> +endobj +775 0 obj +<< +/K 31 +/P 1518 0 R +/Pg 14 0 R +/S /P +>> +endobj +776 0 obj +<< +/Alt (VRKME) +/K 32 +/P 1518 0 R +/Pg 14 0 R +/S /P +>> +endobj +777 0 obj +<< +/K 33 +/P 1519 0 R +/Pg 14 0 R +/S /P +>> +endobj +778 0 obj +<< +/Alt (PREIS_VF) +/K 34 +/P 1519 0 R +/Pg 14 0 R +/S /P +>> +endobj +779 0 obj +<< +/K 35 +/P 1520 0 R +/Pg 14 0 R +/S /P +>> +endobj +780 0 obj +<< +/Alt (PEINH_VF) +/K 36 +/P 1520 0 R +/Pg 14 0 R +/S /P +>> +endobj +781 0 obj +<< +/K 37 +/P 1521 0 R +/Pg 14 0 R +/S /P +>> +endobj +782 0 obj +<< +/Alt (POSPREIS_VF) +/K 38 +/P 1521 0 R +/Pg 14 0 R +/S /P +>> +endobj +783 0 obj +<< +/K 39 +/P 1522 0 R +/Pg 14 0 R +/S /P +>> +endobj +784 0 obj +<< +/K 40 +/P 1523 0 R +/Pg 14 0 R +/S /P +>> +endobj +785 0 obj +<< +/Alt (POSNR_VF) +/K 41 +/P 1523 0 R +/Pg 14 0 R +/S /P +>> +endobj +786 0 obj +<< +/K 42 +/P 1524 0 R +/Pg 14 0 R +/S /P +>> +endobj +787 0 obj +<< +/Alt (MATNR) +/K 43 +/P 1524 0 R +/Pg 14 0 R +/S /P +>> +endobj +788 0 obj +<< +/K 44 +/P 1525 0 R +/Pg 14 0 R +/S /P +>> +endobj +789 0 obj +<< +/Alt (ZZMATTEXT) +/K 45 +/P 1525 0 R +/Pg 14 0 R +/S /P +>> +endobj +790 0 obj +<< +/K 46 +/P 1526 0 R +/Pg 14 0 R +/S /P +>> +endobj +791 0 obj +<< +/Alt (POSNR_VL) +/K 47 +/P 1526 0 R +/Pg 14 0 R +/S /P +>> +endobj +792 0 obj +<< +/K 48 +/P 1527 0 R +/Pg 14 0 R +/S /P +>> +endobj +793 0 obj +<< +/Alt (EAN11) +/K 49 +/P 1527 0 R +/Pg 14 0 R +/S /P +>> +endobj +794 0 obj +<< +/K 50 +/P 1528 0 R +/Pg 14 0 R +/S /P +>> +endobj +795 0 obj +<< +/Alt (BISMT) +/K 51 +/P 1528 0 R +/Pg 14 0 R +/S /P +>> +endobj +796 0 obj +<< +/K 52 +/P 1529 0 R +/Pg 14 0 R +/S /P +>> +endobj +797 0 obj +<< +/Alt (FKIMG) +/K 53 +/P 1529 0 R +/Pg 14 0 R +/S /P +>> +endobj +798 0 obj +<< +/K 54 +/P 1530 0 R +/Pg 14 0 R +/S /P +>> +endobj +799 0 obj +<< +/Alt (VRKME) +/K 55 +/P 1530 0 R +/Pg 14 0 R +/S /P +>> +endobj +800 0 obj +<< +/K 56 +/P 1531 0 R +/Pg 14 0 R +/S /P +>> +endobj +801 0 obj +<< +/Alt (PREIS_VF) +/K 57 +/P 1531 0 R +/Pg 14 0 R +/S /P +>> +endobj +802 0 obj +<< +/K 58 +/P 1532 0 R +/Pg 14 0 R +/S /P +>> +endobj +803 0 obj +<< +/Alt (PEINH_VF) +/K 59 +/P 1532 0 R +/Pg 14 0 R +/S /P +>> +endobj +804 0 obj +<< +/K 60 +/P 1533 0 R +/Pg 14 0 R +/S /P +>> +endobj +805 0 obj +<< +/Alt (POSPREIS_VF) +/K 61 +/P 1533 0 R +/Pg 14 0 R +/S /P +>> +endobj +806 0 obj +<< +/K 62 +/P 1534 0 R +/Pg 14 0 R +/S /P +>> +endobj +807 0 obj +<< +/K 63 +/P 1535 0 R +/Pg 14 0 R +/S /P +>> +endobj +808 0 obj +<< +/Alt (POSNR_VF) +/K 64 +/P 1535 0 R +/Pg 14 0 R +/S /P +>> +endobj +809 0 obj +<< +/K 65 +/P 1536 0 R +/Pg 14 0 R +/S /P +>> +endobj +810 0 obj +<< +/Alt (MATNR) +/K 66 +/P 1536 0 R +/Pg 14 0 R +/S /P +>> +endobj +811 0 obj +<< +/K 67 +/P 1537 0 R +/Pg 14 0 R +/S /P +>> +endobj +812 0 obj +<< +/Alt (ZZMATTEXT) +/K 68 +/P 1537 0 R +/Pg 14 0 R +/S /P +>> +endobj +813 0 obj +<< +/K 69 +/P 1538 0 R +/Pg 14 0 R +/S /P +>> +endobj +814 0 obj +<< +/Alt (POSNR_VL) +/K 70 +/P 1538 0 R +/Pg 14 0 R +/S /P +>> +endobj +815 0 obj +<< +/K 71 +/P 1539 0 R +/Pg 14 0 R +/S /P +>> +endobj +816 0 obj +<< +/Alt (EAN11) +/K 72 +/P 1539 0 R +/Pg 14 0 R +/S /P +>> +endobj +817 0 obj +<< +/K 73 +/P 1540 0 R +/Pg 14 0 R +/S /P +>> +endobj +818 0 obj +<< +/Alt (BISMT) +/K 74 +/P 1540 0 R +/Pg 14 0 R +/S /P +>> +endobj +819 0 obj +<< +/K 75 +/P 1541 0 R +/Pg 14 0 R +/S /P +>> +endobj +820 0 obj +<< +/Alt (FKIMG) +/K 76 +/P 1541 0 R +/Pg 14 0 R +/S /P +>> +endobj +821 0 obj +<< +/K 77 +/P 1542 0 R +/Pg 14 0 R +/S /P +>> +endobj +822 0 obj +<< +/Alt (VRKME) +/K 78 +/P 1542 0 R +/Pg 14 0 R +/S /P +>> +endobj +823 0 obj +<< +/K 79 +/P 1543 0 R +/Pg 14 0 R +/S /P +>> +endobj +824 0 obj +<< +/Alt (PREIS_VF) +/K 80 +/P 1543 0 R +/Pg 14 0 R +/S /P +>> +endobj +825 0 obj +<< +/K 81 +/P 1544 0 R +/Pg 14 0 R +/S /P +>> +endobj +826 0 obj +<< +/Alt (PEINH_VF) +/K 82 +/P 1544 0 R +/Pg 14 0 R +/S /P +>> +endobj +827 0 obj +<< +/K 83 +/P 1545 0 R +/Pg 14 0 R +/S /P +>> +endobj +828 0 obj +<< +/Alt (POSPREIS_VF) +/K 84 +/P 1545 0 R +/Pg 14 0 R +/S /P +>> +endobj +829 0 obj +<< +/K 85 +/P 1546 0 R +/Pg 14 0 R +/S /P +>> +endobj +830 0 obj +<< +/K 86 +/P 1547 0 R +/Pg 14 0 R +/S /P +>> +endobj +831 0 obj +<< +/Alt (POSNR_VF) +/K 87 +/P 1547 0 R +/Pg 14 0 R +/S /P +>> +endobj +832 0 obj +<< +/K 88 +/P 1548 0 R +/Pg 14 0 R +/S /P +>> +endobj +833 0 obj +<< +/Alt (MATNR) +/K 89 +/P 1548 0 R +/Pg 14 0 R +/S /P +>> +endobj +834 0 obj +<< +/K 90 +/P 1549 0 R +/Pg 14 0 R +/S /P +>> +endobj +835 0 obj +<< +/Alt (ZZMATTEXT) +/K 91 +/P 1549 0 R +/Pg 14 0 R +/S /P +>> +endobj +836 0 obj +<< +/K 92 +/P 1550 0 R +/Pg 14 0 R +/S /P +>> +endobj +837 0 obj +<< +/Alt (POSNR_VL) +/K 93 +/P 1550 0 R +/Pg 14 0 R +/S /P +>> +endobj +838 0 obj +<< +/K 94 +/P 1551 0 R +/Pg 14 0 R +/S /P +>> +endobj +839 0 obj +<< +/Alt (EAN11) +/K 95 +/P 1551 0 R +/Pg 14 0 R +/S /P +>> +endobj +840 0 obj +<< +/K 96 +/P 1552 0 R +/Pg 14 0 R +/S /P +>> +endobj +841 0 obj +<< +/Alt (BISMT) +/K 97 +/P 1552 0 R +/Pg 14 0 R +/S /P +>> +endobj +842 0 obj +<< +/K 98 +/P 1553 0 R +/Pg 14 0 R +/S /P +>> +endobj +843 0 obj +<< +/Alt (FKIMG) +/K 99 +/P 1553 0 R +/Pg 14 0 R +/S /P +>> +endobj +844 0 obj +<< +/K 100 +/P 1554 0 R +/Pg 14 0 R +/S /P +>> +endobj +845 0 obj +<< +/Alt (VRKME) +/K 101 +/P 1554 0 R +/Pg 14 0 R +/S /P +>> +endobj +846 0 obj +<< +/K 102 +/P 1555 0 R +/Pg 14 0 R +/S /P +>> +endobj +847 0 obj +<< +/Alt (PREIS_VF) +/K 103 +/P 1555 0 R +/Pg 14 0 R +/S /P +>> +endobj +848 0 obj +<< +/K 104 +/P 1556 0 R +/Pg 14 0 R +/S /P +>> +endobj +849 0 obj +<< +/Alt (PEINH_VF) +/K 105 +/P 1556 0 R +/Pg 14 0 R +/S /P +>> +endobj +850 0 obj +<< +/K 106 +/P 1557 0 R +/Pg 14 0 R +/S /P +>> +endobj +851 0 obj +<< +/Alt (POSPREIS_VF) +/K 107 +/P 1557 0 R +/Pg 14 0 R +/S /P +>> +endobj +852 0 obj +<< +/K 108 +/P 1558 0 R +/Pg 14 0 R +/S /P +>> +endobj +853 0 obj +<< +/K 109 +/P 1559 0 R +/Pg 14 0 R +/S /P +>> +endobj +854 0 obj +<< +/Alt (POSNR_VF) +/K 110 +/P 1559 0 R +/Pg 14 0 R +/S /P +>> +endobj +855 0 obj +<< +/K 111 +/P 1560 0 R +/Pg 14 0 R +/S /P +>> +endobj +856 0 obj +<< +/Alt (MATNR) +/K 112 +/P 1560 0 R +/Pg 14 0 R +/S /P +>> +endobj +857 0 obj +<< +/K 113 +/P 1561 0 R +/Pg 14 0 R +/S /P +>> +endobj +858 0 obj +<< +/Alt (ZZMATTEXT) +/K 114 +/P 1561 0 R +/Pg 14 0 R +/S /P +>> +endobj +859 0 obj +<< +/K 115 +/P 1562 0 R +/Pg 14 0 R +/S /P +>> +endobj +860 0 obj +<< +/Alt (POSNR_VL) +/K 116 +/P 1562 0 R +/Pg 14 0 R +/S /P +>> +endobj +861 0 obj +<< +/K 117 +/P 1563 0 R +/Pg 14 0 R +/S /P +>> +endobj +862 0 obj +<< +/Alt (EAN11) +/K 118 +/P 1563 0 R +/Pg 14 0 R +/S /P +>> +endobj +863 0 obj +<< +/K 119 +/P 1564 0 R +/Pg 14 0 R +/S /P +>> +endobj +864 0 obj +<< +/Alt (BISMT) +/K 120 +/P 1564 0 R +/Pg 14 0 R +/S /P +>> +endobj +865 0 obj +<< +/K 121 +/P 1565 0 R +/Pg 14 0 R +/S /P +>> +endobj +866 0 obj +<< +/Alt (FKIMG) +/K 122 +/P 1565 0 R +/Pg 14 0 R +/S /P +>> +endobj +867 0 obj +<< +/K 123 +/P 1566 0 R +/Pg 14 0 R +/S /P +>> +endobj +868 0 obj +<< +/Alt (VRKME) +/K 124 +/P 1566 0 R +/Pg 14 0 R +/S /P +>> +endobj +869 0 obj +<< +/K 125 +/P 1567 0 R +/Pg 14 0 R +/S /P +>> +endobj +870 0 obj +<< +/Alt (PREIS_VF) +/K 126 +/P 1567 0 R +/Pg 14 0 R +/S /P +>> +endobj +871 0 obj +<< +/K 127 +/P 1568 0 R +/Pg 14 0 R +/S /P +>> +endobj +872 0 obj +<< +/Alt (PEINH_VF) +/K 128 +/P 1568 0 R +/Pg 14 0 R +/S /P +>> +endobj +873 0 obj +<< +/K 129 +/P 1569 0 R +/Pg 14 0 R +/S /P +>> +endobj +874 0 obj +<< +/Alt (POSPREIS_VF) +/K 130 +/P 1569 0 R +/Pg 14 0 R +/S /P +>> +endobj +875 0 obj +<< +/K 131 +/P 1570 0 R +/Pg 14 0 R +/S /P +>> +endobj +876 0 obj +<< +/K 132 +/P 1571 0 R +/Pg 14 0 R +/S /P +>> +endobj +877 0 obj +<< +/Alt (POSNR_VF) +/K 133 +/P 1571 0 R +/Pg 14 0 R +/S /P +>> +endobj +878 0 obj +<< +/K 134 +/P 1572 0 R +/Pg 14 0 R +/S /P +>> +endobj +879 0 obj +<< +/Alt (MATNR) +/K 135 +/P 1572 0 R +/Pg 14 0 R +/S /P +>> +endobj +880 0 obj +<< +/K 136 +/P 1573 0 R +/Pg 14 0 R +/S /P +>> +endobj +881 0 obj +<< +/Alt (ZZMATTEXT) +/K 137 +/P 1573 0 R +/Pg 14 0 R +/S /P +>> +endobj +882 0 obj +<< +/K 138 +/P 1574 0 R +/Pg 14 0 R +/S /P +>> +endobj +883 0 obj +<< +/Alt (POSNR_VL) +/K 139 +/P 1574 0 R +/Pg 14 0 R +/S /P +>> +endobj +884 0 obj +<< +/K 140 +/P 1575 0 R +/Pg 14 0 R +/S /P +>> +endobj +885 0 obj +<< +/Alt (EAN11) +/K 141 +/P 1575 0 R +/Pg 14 0 R +/S /P +>> +endobj +886 0 obj +<< +/K 142 +/P 1576 0 R +/Pg 14 0 R +/S /P +>> +endobj +887 0 obj +<< +/Alt (BISMT) +/K 143 +/P 1576 0 R +/Pg 14 0 R +/S /P +>> +endobj +888 0 obj +<< +/K 144 +/P 1577 0 R +/Pg 14 0 R +/S /P +>> +endobj +889 0 obj +<< +/Alt (FKIMG) +/K 145 +/P 1577 0 R +/Pg 14 0 R +/S /P +>> +endobj +890 0 obj +<< +/K 146 +/P 1578 0 R +/Pg 14 0 R +/S /P +>> +endobj +891 0 obj +<< +/Alt (VRKME) +/K 147 +/P 1578 0 R +/Pg 14 0 R +/S /P +>> +endobj +892 0 obj +<< +/K 148 +/P 1579 0 R +/Pg 14 0 R +/S /P +>> +endobj +893 0 obj +<< +/Alt (PREIS_VF) +/K 149 +/P 1579 0 R +/Pg 14 0 R +/S /P +>> +endobj +894 0 obj +<< +/K 150 +/P 1580 0 R +/Pg 14 0 R +/S /P +>> +endobj +895 0 obj +<< +/Alt (PEINH_VF) +/K 151 +/P 1580 0 R +/Pg 14 0 R +/S /P +>> +endobj +896 0 obj +<< +/K 152 +/P 1581 0 R +/Pg 14 0 R +/S /P +>> +endobj +897 0 obj +<< +/Alt (POSPREIS_VF) +/K 153 +/P 1581 0 R +/Pg 14 0 R +/S /P +>> +endobj +898 0 obj +<< +/K 154 +/P 1582 0 R +/Pg 14 0 R +/S /P +>> +endobj +899 0 obj +<< +/K 155 +/P 1583 0 R +/Pg 14 0 R +/S /P +>> +endobj +900 0 obj +<< +/Alt (POSNR_VF) +/K 156 +/P 1583 0 R +/Pg 14 0 R +/S /P +>> +endobj +901 0 obj +<< +/K 157 +/P 1584 0 R +/Pg 14 0 R +/S /P +>> +endobj +902 0 obj +<< +/Alt (MATNR) +/K 158 +/P 1584 0 R +/Pg 14 0 R +/S /P +>> +endobj +903 0 obj +<< +/K 159 +/P 1585 0 R +/Pg 14 0 R +/S /P +>> +endobj +904 0 obj +<< +/Alt (ZZMATTEXT) +/K 160 +/P 1585 0 R +/Pg 14 0 R +/S /P +>> +endobj +905 0 obj +<< +/K 161 +/P 1586 0 R +/Pg 14 0 R +/S /P +>> +endobj +906 0 obj +<< +/Alt (POSNR_VL) +/K 162 +/P 1586 0 R +/Pg 14 0 R +/S /P +>> +endobj +907 0 obj +<< +/K 163 +/P 1587 0 R +/Pg 14 0 R +/S /P +>> +endobj +908 0 obj +<< +/Alt (EAN11) +/K 164 +/P 1587 0 R +/Pg 14 0 R +/S /P +>> +endobj +909 0 obj +<< +/K 165 +/P 1588 0 R +/Pg 14 0 R +/S /P +>> +endobj +910 0 obj +<< +/Alt (BISMT) +/K 166 +/P 1588 0 R +/Pg 14 0 R +/S /P +>> +endobj +911 0 obj +<< +/K 167 +/P 1589 0 R +/Pg 14 0 R +/S /P +>> +endobj +912 0 obj +<< +/Alt (FKIMG) +/K 168 +/P 1589 0 R +/Pg 14 0 R +/S /P +>> +endobj +913 0 obj +<< +/K 169 +/P 1590 0 R +/Pg 14 0 R +/S /P +>> +endobj +914 0 obj +<< +/Alt (VRKME) +/K 170 +/P 1590 0 R +/Pg 14 0 R +/S /P +>> +endobj +915 0 obj +<< +/K 171 +/P 1591 0 R +/Pg 14 0 R +/S /P +>> +endobj +916 0 obj +<< +/Alt (PREIS_VF) +/K 172 +/P 1591 0 R +/Pg 14 0 R +/S /P +>> +endobj +917 0 obj +<< +/K 173 +/P 1592 0 R +/Pg 14 0 R +/S /P +>> +endobj +918 0 obj +<< +/Alt (PEINH_VF) +/K 174 +/P 1592 0 R +/Pg 14 0 R +/S /P +>> +endobj +919 0 obj +<< +/K 175 +/P 1593 0 R +/Pg 14 0 R +/S /P +>> +endobj +920 0 obj +<< +/Alt (POSPREIS_VF) +/K 176 +/P 1593 0 R +/Pg 14 0 R +/S /P +>> +endobj +921 0 obj +<< +/K 177 +/P 1594 0 R +/Pg 14 0 R +/S /P +>> +endobj +922 0 obj +<< +/K 178 +/P 1595 0 R +/Pg 14 0 R +/S /P +>> +endobj +923 0 obj +<< +/Alt (POSNR_VF) +/K 179 +/P 1595 0 R +/Pg 14 0 R +/S /P +>> +endobj +924 0 obj +<< +/K 180 +/P 1596 0 R +/Pg 14 0 R +/S /P +>> +endobj +925 0 obj +<< +/Alt (MATNR) +/K 181 +/P 1596 0 R +/Pg 14 0 R +/S /P +>> +endobj +926 0 obj +<< +/K 182 +/P 1597 0 R +/Pg 14 0 R +/S /P +>> +endobj +927 0 obj +<< +/Alt (ZZMATTEXT) +/K 183 +/P 1597 0 R +/Pg 14 0 R +/S /P +>> +endobj +928 0 obj +<< +/K 184 +/P 1598 0 R +/Pg 14 0 R +/S /P +>> +endobj +929 0 obj +<< +/Alt (POSNR_VL) +/K 185 +/P 1598 0 R +/Pg 14 0 R +/S /P +>> +endobj +930 0 obj +<< +/K 186 +/P 1599 0 R +/Pg 14 0 R +/S /P +>> +endobj +931 0 obj +<< +/Alt (EAN11) +/K 187 +/P 1599 0 R +/Pg 14 0 R +/S /P +>> +endobj +932 0 obj +<< +/K 188 +/P 1600 0 R +/Pg 14 0 R +/S /P +>> +endobj +933 0 obj +<< +/Alt (BISMT) +/K 189 +/P 1600 0 R +/Pg 14 0 R +/S /P +>> +endobj +934 0 obj +<< +/K 190 +/P 1601 0 R +/Pg 14 0 R +/S /P +>> +endobj +935 0 obj +<< +/Alt (FKIMG) +/K 191 +/P 1601 0 R +/Pg 14 0 R +/S /P +>> +endobj +936 0 obj +<< +/K 192 +/P 1602 0 R +/Pg 14 0 R +/S /P +>> +endobj +937 0 obj +<< +/Alt (VRKME) +/K 193 +/P 1602 0 R +/Pg 14 0 R +/S /P +>> +endobj +938 0 obj +<< +/K 194 +/P 1603 0 R +/Pg 14 0 R +/S /P +>> +endobj +939 0 obj +<< +/Alt (PREIS_VF) +/K 195 +/P 1603 0 R +/Pg 14 0 R +/S /P +>> +endobj +940 0 obj +<< +/K 196 +/P 1604 0 R +/Pg 14 0 R +/S /P +>> +endobj +941 0 obj +<< +/Alt (PEINH_VF) +/K 197 +/P 1604 0 R +/Pg 14 0 R +/S /P +>> +endobj +942 0 obj +<< +/K 198 +/P 1605 0 R +/Pg 14 0 R +/S /P +>> +endobj +943 0 obj +<< +/Alt (POSPREIS_VF) +/K 199 +/P 1605 0 R +/Pg 14 0 R +/S /P +>> +endobj +944 0 obj +<< +/K 200 +/P 1606 0 R +/Pg 14 0 R +/S /P +>> +endobj +945 0 obj +<< +/K 201 +/P 1607 0 R +/Pg 14 0 R +/S /P +>> +endobj +946 0 obj +<< +/Alt (POSNR_VF) +/K 202 +/P 1607 0 R +/Pg 14 0 R +/S /P +>> +endobj +947 0 obj +<< +/K 203 +/P 1608 0 R +/Pg 14 0 R +/S /P +>> +endobj +948 0 obj +<< +/Alt (MATNR) +/K 204 +/P 1608 0 R +/Pg 14 0 R +/S /P +>> +endobj +949 0 obj +<< +/K 205 +/P 1609 0 R +/Pg 14 0 R +/S /P +>> +endobj +950 0 obj +<< +/Alt (ZZMATTEXT) +/K 206 +/P 1609 0 R +/Pg 14 0 R +/S /P +>> +endobj +951 0 obj +<< +/K 207 +/P 1610 0 R +/Pg 14 0 R +/S /P +>> +endobj +952 0 obj +<< +/Alt (POSNR_VL) +/K 208 +/P 1610 0 R +/Pg 14 0 R +/S /P +>> +endobj +953 0 obj +<< +/K 209 +/P 1611 0 R +/Pg 14 0 R +/S /P +>> +endobj +954 0 obj +<< +/Alt (EAN11) +/K 210 +/P 1611 0 R +/Pg 14 0 R +/S /P +>> +endobj +955 0 obj +<< +/K 211 +/P 1612 0 R +/Pg 14 0 R +/S /P +>> +endobj +956 0 obj +<< +/Alt (BISMT) +/K 212 +/P 1612 0 R +/Pg 14 0 R +/S /P +>> +endobj +957 0 obj +<< +/K 213 +/P 1613 0 R +/Pg 14 0 R +/S /P +>> +endobj +958 0 obj +<< +/Alt (FKIMG) +/K 214 +/P 1613 0 R +/Pg 14 0 R +/S /P +>> +endobj +959 0 obj +<< +/K 215 +/P 1614 0 R +/Pg 14 0 R +/S /P +>> +endobj +960 0 obj +<< +/Alt (VRKME) +/K 216 +/P 1614 0 R +/Pg 14 0 R +/S /P +>> +endobj +961 0 obj +<< +/K 217 +/P 1615 0 R +/Pg 14 0 R +/S /P +>> +endobj +962 0 obj +<< +/Alt (PREIS_VF) +/K 218 +/P 1615 0 R +/Pg 14 0 R +/S /P +>> +endobj +963 0 obj +<< +/K 219 +/P 1616 0 R +/Pg 14 0 R +/S /P +>> +endobj +964 0 obj +<< +/Alt (PEINH_VF) +/K 220 +/P 1616 0 R +/Pg 14 0 R +/S /P +>> +endobj +965 0 obj +<< +/K 221 +/P 1617 0 R +/Pg 14 0 R +/S /P +>> +endobj +966 0 obj +<< +/Alt (POSPREIS_VF) +/K 222 +/P 1617 0 R +/Pg 14 0 R +/S /P +>> +endobj +967 0 obj +<< +/K 223 +/P 1618 0 R +/Pg 14 0 R +/S /P +>> +endobj +968 0 obj +<< +/K 224 +/P 1619 0 R +/Pg 14 0 R +/S /P +>> +endobj +969 0 obj +<< +/Alt (POSNR_VF) +/K 225 +/P 1619 0 R +/Pg 14 0 R +/S /P +>> +endobj +970 0 obj +<< +/K 226 +/P 1620 0 R +/Pg 14 0 R +/S /P +>> +endobj +971 0 obj +<< +/Alt (MATNR) +/K 227 +/P 1620 0 R +/Pg 14 0 R +/S /P +>> +endobj +972 0 obj +<< +/K 228 +/P 1621 0 R +/Pg 14 0 R +/S /P +>> +endobj +973 0 obj +<< +/Alt (ZZMATTEXT) +/K 229 +/P 1621 0 R +/Pg 14 0 R +/S /P +>> +endobj +974 0 obj +<< +/K 230 +/P 1622 0 R +/Pg 14 0 R +/S /P +>> +endobj +975 0 obj +<< +/Alt (POSNR_VL) +/K 231 +/P 1622 0 R +/Pg 14 0 R +/S /P +>> +endobj +976 0 obj +<< +/K 232 +/P 1623 0 R +/Pg 14 0 R +/S /P +>> +endobj +977 0 obj +<< +/Alt (EAN11) +/K 233 +/P 1623 0 R +/Pg 14 0 R +/S /P +>> +endobj +978 0 obj +<< +/K 234 +/P 1624 0 R +/Pg 14 0 R +/S /P +>> +endobj +979 0 obj +<< +/Alt (BISMT) +/K 235 +/P 1624 0 R +/Pg 14 0 R +/S /P +>> +endobj +980 0 obj +<< +/K 236 +/P 1625 0 R +/Pg 14 0 R +/S /P +>> +endobj +981 0 obj +<< +/Alt (FKIMG) +/K 237 +/P 1625 0 R +/Pg 14 0 R +/S /P +>> +endobj +982 0 obj +<< +/K 238 +/P 1626 0 R +/Pg 14 0 R +/S /P +>> +endobj +983 0 obj +<< +/Alt (VRKME) +/K 239 +/P 1626 0 R +/Pg 14 0 R +/S /P +>> +endobj +984 0 obj +<< +/K 240 +/P 1627 0 R +/Pg 14 0 R +/S /P +>> +endobj +985 0 obj +<< +/Alt (PREIS_VF) +/K 241 +/P 1627 0 R +/Pg 14 0 R +/S /P +>> +endobj +986 0 obj +<< +/K 242 +/P 1628 0 R +/Pg 14 0 R +/S /P +>> +endobj +987 0 obj +<< +/Alt (PEINH_VF) +/K 243 +/P 1628 0 R +/Pg 14 0 R +/S /P +>> +endobj +988 0 obj +<< +/K 244 +/P 1629 0 R +/Pg 14 0 R +/S /P +>> +endobj +989 0 obj +<< +/Alt (POSPREIS_VF) +/K 245 +/P 1629 0 R +/Pg 14 0 R +/S /P +>> +endobj +990 0 obj +<< +/K 246 +/P 1630 0 R +/Pg 14 0 R +/S /P +>> +endobj +991 0 obj +<< +/K 247 +/P 1631 0 R +/Pg 14 0 R +/S /P +>> +endobj +992 0 obj +<< +/Alt (VTEXT) +/K 248 +/P 1631 0 R +/Pg 14 0 R +/S /P +>> +endobj +993 0 obj +<< +/Alt (KBETR) +/K 249 +/P 1632 0 R +/Pg 14 0 R +/S /P +>> +endobj +994 0 obj +<< +/Alt (KOEIN) +/K 250 +/P 1633 0 R +/Pg 14 0 R +/S /P +>> +endobj +995 0 obj +<< +/Alt (KWERT) +/K 251 +/P 1634 0 R +/Pg 14 0 R +/S /P +>> +endobj +996 0 obj +<< +/K 252 +/P 1635 0 R +/Pg 14 0 R +/S /P +>> +endobj +997 0 obj +<< +/Alt (POSNR_VF) +/K 253 +/P 1635 0 R +/Pg 14 0 R +/S /P +>> +endobj +998 0 obj +<< +/K 254 +/P 1636 0 R +/Pg 14 0 R +/S /P +>> +endobj +999 0 obj +<< +/Alt (MATNR) +/K 255 +/P 1636 0 R +/Pg 14 0 R +/S /P +>> +endobj +1000 0 obj +<< +/K 256 +/P 1637 0 R +/Pg 14 0 R +/S /P +>> +endobj +1001 0 obj +<< +/Alt (ZZMATTEXT) +/K 257 +/P 1637 0 R +/Pg 14 0 R +/S /P +>> +endobj +1002 0 obj +<< +/K 258 +/P 1638 0 R +/Pg 14 0 R +/S /P +>> +endobj +1003 0 obj +<< +/Alt (POSNR_VL) +/K 259 +/P 1638 0 R +/Pg 14 0 R +/S /P +>> +endobj +1004 0 obj +<< +/K 260 +/P 1639 0 R +/Pg 14 0 R +/S /P +>> +endobj +1005 0 obj +<< +/Alt (EAN11) +/K 261 +/P 1639 0 R +/Pg 14 0 R +/S /P +>> +endobj +1006 0 obj +<< +/K 262 +/P 1640 0 R +/Pg 14 0 R +/S /P +>> +endobj +1007 0 obj +<< +/Alt (BISMT) +/K 263 +/P 1640 0 R +/Pg 14 0 R +/S /P +>> +endobj +1008 0 obj +<< +/K 264 +/P 1641 0 R +/Pg 14 0 R +/S /P +>> +endobj +1009 0 obj +<< +/Alt (FKIMG) +/K 265 +/P 1641 0 R +/Pg 14 0 R +/S /P +>> +endobj +1010 0 obj +<< +/K 266 +/P 1642 0 R +/Pg 14 0 R +/S /P +>> +endobj +1011 0 obj +<< +/Alt (VRKME) +/K 267 +/P 1642 0 R +/Pg 14 0 R +/S /P +>> +endobj +1012 0 obj +<< +/K 268 +/P 1643 0 R +/Pg 14 0 R +/S /P +>> +endobj +1013 0 obj +<< +/Alt (PREIS_VF) +/K 269 +/P 1643 0 R +/Pg 14 0 R +/S /P +>> +endobj +1014 0 obj +<< +/K 270 +/P 1644 0 R +/Pg 14 0 R +/S /P +>> +endobj +1015 0 obj +<< +/Alt (PEINH_VF) +/K 271 +/P 1644 0 R +/Pg 14 0 R +/S /P +>> +endobj +1016 0 obj +<< +/K 272 +/P 1645 0 R +/Pg 14 0 R +/S /P +>> +endobj +1017 0 obj +<< +/Alt (POSPREIS_VF) +/K 273 +/P 1645 0 R +/Pg 14 0 R +/S /P +>> +endobj +1018 0 obj +<< +/K 274 +/P 1646 0 R +/Pg 14 0 R +/S /P +>> +endobj +1019 0 obj +<< +/K 275 +/P 1647 0 R +/Pg 14 0 R +/S /P +>> +endobj +1020 0 obj +<< +/Alt (POSNR_VF) +/K 276 +/P 1647 0 R +/Pg 14 0 R +/S /P +>> +endobj +1021 0 obj +<< +/K 277 +/P 1648 0 R +/Pg 14 0 R +/S /P +>> +endobj +1022 0 obj +<< +/Alt (MATNR) +/K 278 +/P 1648 0 R +/Pg 14 0 R +/S /P +>> +endobj +1023 0 obj +<< +/K 279 +/P 1649 0 R +/Pg 14 0 R +/S /P +>> +endobj +1024 0 obj +<< +/Alt (ZZMATTEXT) +/K 280 +/P 1649 0 R +/Pg 14 0 R +/S /P +>> +endobj +1025 0 obj +<< +/K 281 +/P 1650 0 R +/Pg 14 0 R +/S /P +>> +endobj +1026 0 obj +<< +/Alt (POSNR_VL) +/K 282 +/P 1650 0 R +/Pg 14 0 R +/S /P +>> +endobj +1027 0 obj +<< +/K 283 +/P 1651 0 R +/Pg 14 0 R +/S /P +>> +endobj +1028 0 obj +<< +/Alt (EAN11) +/K 284 +/P 1651 0 R +/Pg 14 0 R +/S /P +>> +endobj +1029 0 obj +<< +/K 285 +/P 1652 0 R +/Pg 14 0 R +/S /P +>> +endobj +1030 0 obj +<< +/Alt (BISMT) +/K 286 +/P 1652 0 R +/Pg 14 0 R +/S /P +>> +endobj +1031 0 obj +<< +/K 287 +/P 1653 0 R +/Pg 14 0 R +/S /P +>> +endobj +1032 0 obj +<< +/Alt (FKIMG) +/K 288 +/P 1653 0 R +/Pg 14 0 R +/S /P +>> +endobj +1033 0 obj +<< +/K 289 +/P 1654 0 R +/Pg 14 0 R +/S /P +>> +endobj +1034 0 obj +<< +/Alt (VRKME) +/K 290 +/P 1654 0 R +/Pg 14 0 R +/S /P +>> +endobj +1035 0 obj +<< +/K 291 +/P 1655 0 R +/Pg 14 0 R +/S /P +>> +endobj +1036 0 obj +<< +/Alt (PREIS_VF) +/K 292 +/P 1655 0 R +/Pg 14 0 R +/S /P +>> +endobj +1037 0 obj +<< +/K 293 +/P 1656 0 R +/Pg 14 0 R +/S /P +>> +endobj +1038 0 obj +<< +/Alt (PEINH_VF) +/K 294 +/P 1656 0 R +/Pg 14 0 R +/S /P +>> +endobj +1039 0 obj +<< +/K 295 +/P 1657 0 R +/Pg 14 0 R +/S /P +>> +endobj +1040 0 obj +<< +/Alt (POSPREIS_VF) +/K 296 +/P 1657 0 R +/Pg 14 0 R +/S /P +>> +endobj +1041 0 obj +<< +/K 297 +/P 1658 0 R +/Pg 14 0 R +/S /P +>> +endobj +1042 0 obj +<< +/K 298 +/P 1659 0 R +/Pg 14 0 R +/S /P +>> +endobj +1043 0 obj +<< +/Alt (POSNR_VF) +/K 299 +/P 1659 0 R +/Pg 14 0 R +/S /P +>> +endobj +1044 0 obj +<< +/K 300 +/P 1660 0 R +/Pg 14 0 R +/S /P +>> +endobj +1045 0 obj +<< +/Alt (MATNR) +/K 301 +/P 1660 0 R +/Pg 14 0 R +/S /P +>> +endobj +1046 0 obj +<< +/K 302 +/P 1661 0 R +/Pg 14 0 R +/S /P +>> +endobj +1047 0 obj +<< +/Alt (ZZMATTEXT) +/K 303 +/P 1661 0 R +/Pg 14 0 R +/S /P +>> +endobj +1048 0 obj +<< +/K 304 +/P 1662 0 R +/Pg 14 0 R +/S /P +>> +endobj +1049 0 obj +<< +/Alt (POSNR_VL) +/K 305 +/P 1662 0 R +/Pg 14 0 R +/S /P +>> +endobj +1050 0 obj +<< +/K 306 +/P 1663 0 R +/Pg 14 0 R +/S /P +>> +endobj +1051 0 obj +<< +/Alt (EAN11) +/K 307 +/P 1663 0 R +/Pg 14 0 R +/S /P +>> +endobj +1052 0 obj +<< +/K 308 +/P 1664 0 R +/Pg 14 0 R +/S /P +>> +endobj +1053 0 obj +<< +/Alt (BISMT) +/K 309 +/P 1664 0 R +/Pg 14 0 R +/S /P +>> +endobj +1054 0 obj +<< +/K 310 +/P 1665 0 R +/Pg 14 0 R +/S /P +>> +endobj +1055 0 obj +<< +/Alt (FKIMG) +/K 311 +/P 1665 0 R +/Pg 14 0 R +/S /P +>> +endobj +1056 0 obj +<< +/K 312 +/P 1666 0 R +/Pg 14 0 R +/S /P +>> +endobj +1057 0 obj +<< +/Alt (VRKME) +/K 313 +/P 1666 0 R +/Pg 14 0 R +/S /P +>> +endobj +1058 0 obj +<< +/K 314 +/P 1667 0 R +/Pg 14 0 R +/S /P +>> +endobj +1059 0 obj +<< +/Alt (PREIS_VF) +/K 315 +/P 1667 0 R +/Pg 14 0 R +/S /P +>> +endobj +1060 0 obj +<< +/K 316 +/P 1668 0 R +/Pg 14 0 R +/S /P +>> +endobj +1061 0 obj +<< +/Alt (PEINH_VF) +/K 317 +/P 1668 0 R +/Pg 14 0 R +/S /P +>> +endobj +1062 0 obj +<< +/K 318 +/P 1669 0 R +/Pg 14 0 R +/S /P +>> +endobj +1063 0 obj +<< +/Alt (POSPREIS_VF) +/K 319 +/P 1669 0 R +/Pg 14 0 R +/S /P +>> +endobj +1064 0 obj +<< +/K 320 +/P 1670 0 R +/Pg 14 0 R +/S /P +>> +endobj +1065 0 obj +<< +/K 321 +/P 1671 0 R +/Pg 14 0 R +/S /P +>> +endobj +1066 0 obj +<< +/Alt (TAB_UOM) +/K 322 +/P 1671 0 R +/Pg 14 0 R +/S /P +>> +endobj +1067 0 obj +<< +/K 323 +/P 1672 0 R +/Pg 14 0 R +/S /P +>> +endobj +1068 0 obj +<< +/K 324 +/P 1673 0 R +/Pg 14 0 R +/S /P +>> +endobj +1069 0 obj +<< +/Alt (G_WARENWERT) +/K 325 +/P 1673 0 R +/Pg 14 0 R +/S /P +>> +endobj +1070 0 obj +<< +/K 326 +/P 1674 0 R +/Pg 14 0 R +/S /P +>> +endobj +1071 0 obj +<< +/Alt (VTEXT) +/K 327 +/P 1674 0 R +/Pg 14 0 R +/S /P +>> +endobj +1072 0 obj +<< +/K 328 +/P 1675 0 R +/Pg 14 0 R +/S /P +>> +endobj +1073 0 obj +<< +/Alt (KBETR) +/K 329 +/P 1675 0 R +/Pg 14 0 R +/S /P +>> +endobj +1074 0 obj +<< +/K 330 +/P 1676 0 R +/Pg 14 0 R +/S /P +>> +endobj +1075 0 obj +<< +/Alt (KOEIN) +/K 331 +/P 1676 0 R +/Pg 14 0 R +/S /P +>> +endobj +1076 0 obj +<< +/K 332 +/P 1677 0 R +/Pg 14 0 R +/S /P +>> +endobj +1077 0 obj +<< +/Alt (KWERT) +/K 333 +/P 1677 0 R +/Pg 14 0 R +/S /P +>> +endobj +1078 0 obj +<< +/K 334 +/P 1678 0 R +/Pg 14 0 R +/S /P +>> +endobj +1079 0 obj +<< +/K 335 +/P 1679 0 R +/Pg 14 0 R +/S /P +>> +endobj +1080 0 obj +<< +/Alt (GROSS_VALUE) +/K 336 +/P 1679 0 R +/Pg 14 0 R +/S /P +>> +endobj +1081 0 obj +<< +/K 337 +/P 1680 0 R +/Pg 14 0 R +/S /P +>> +endobj +1082 0 obj +<< +/Alt (TXT_NON_DISCOUNT) +/K 338 +/P 1680 0 R +/Pg 14 0 R +/S /P +>> +endobj +1083 0 obj +<< +/K 339 +/P 1681 0 R +/Pg 14 0 R +/S /P +>> +endobj +1084 0 obj +<< +/Type /EmbeddedFile +/Subtype /text#2Fxml +/Params 1682 0 R +/Length 1683 0 R +>> +stream +urn:ferd:CrossIndustryDocument:invoice:1p0:extended9010548449RECHNUNG38020260121false202601211001844017363120012Sonepar Deutschland Region Nord-Ost GmbH30179Vahrenwalder Straße 238HannoverDEDE811251715105/5843/2799100184Eduard Wisch Alles Watt läuft25764Todtenhemmer Weg 116WesselburenDE2026-01-19T00:00:00AER1026285296 WischEduard Wisch Alles Watt läuft25764Todtenhemmer Weg 116WesselburenDE202601202026-01-20T00:00:0072420474EURDE64250800200107008300Sonepar Deutschland Region Nord-Ost GmbHDRESDEFF250Commerzbank AG571.81VAT3009.503009.50S19.00Netto20260204Skonto202602040.003009.500.000.003009.50571.813581.313581.3112026-01-19T00:00:000000011026285296 WischAER0.92001.00000.92001.00008.00002026-01-20T00:00:001724204741.40VATS19.007.3640160323214914582568ASSMANN DK-1644-0025/BL Patchkabel ASSMANN DK-1644-0025/BL Patchkabel CAT 6 S/FTP 0,25m,sw 22026-01-19T00:00:000000021026285296 WischAER1.03001.00001.03001.000010.00002026-01-20T00:00:002724204741.96VATS19.0010.3040160323215764544583ASSMANN DK-1644-005/BL Patchkabel CASSMANN DK-1644-005/BL Patchkabel Cat6 S/FTP LSZH AWG27/7 0,5m sw 32026-01-19T00:00:000000031026285296 WischAER1.24001.00001.24001.00005.00002026-01-20T00:00:003724204741.18VATS19.006.2040160323216444544587ASSMANN DK-1644-010/BL Patchkabel CASSMANN DK-1644-010/BL Patchkabel Cat6 S/FTP LSZH AWG27/7 1m sw 42026-01-19T00:00:000000041026285296 WischAER1.84001.00001.84001.00002.00002026-01-20T00:00:004724204740.70VATS19.003.6840160323217434544592ASSMANN DK-1644-020/BL Patchkabel CASSMANN DK-1644-020/BL Patchkabel Cat6 S/FTP LSZH AWG27/7 2m sw 52026-01-19T00:00:000000051026285296 WischAER3.59001.00003.59001.00001.00002026-01-20T00:00:005724204740.68VATS19.003.5940160323220094544602ASSMANN DK-1644-050/BL Patchkabel CASSMANN DK-1644-050/BL Patchkabel Cat6 S/FTP LSZH AWG27/7 5m sw 62026-01-19T00:00:000000061026285296 WischAER28.5200100.0000true22.5000100.000022.5000Zuschlag Kupfer51.0200100.0000100.00002026-01-20T00:00:006724204749.69VATS19.0051.020140070JY(ST)Y 2x2x0,8Eca Ri100 Fernmelde JY(ST)Y 2x2x0,8Eca Ri100 Fernmelde PVC TRADING_UNITZuschlag Kupfer22.5072026-01-19T00:00:000000071026285296 WischAER45.0500100.0000true20.4300100.000020.4300Zuschlag Kupfer65.4800100.0000100.00002026-01-20T00:00:0077242047412.44VATS19.0065.4840632420027951913719KATHREIN LCL 100/100m Cca NetzwerkkKATHREIN LCL 100/100m Cca Netzwerkkabel Cat7, S/FTP TRADING_UNITZuschlag Kupfer20.4382026-01-19T00:00:000000081026285296 WischAER24.50001.000024.50001.00001.00002026-01-20T00:00:008724204744.66VATS19.0024.5040150823677630658160Eaton PXF-40/4/003-A FI-SchutzschalEaton PXF-40/4/003-A FI-Schutzschalter 40A 4p, 30mA 92026-01-19T00:00:000000091026285296 WischAER28.68001.000028.68001.00001.00002026-01-20T00:00:009724204745.45VATS19.0028.6840150823642740633677Eaton PXL-C20/3 LS-Schalter m.BeschEaton PXL-C20/3 LS-Schalter m.Beschrift. C 20A, 3p 102026-01-19T00:00:000000101026285296 WischAER20.56001.000020.56001.00001.00002026-01-20T00:00:0010724204743.91VATS19.0020.5632506155102285709088Hager SBN363 Ausschalter 3P 63AHager SBN363 Ausschalter 3P 63A 112026-01-19T00:00:000000111026285296 WischAER3.79001.0000true0.44001.00000.4400Zuschlag Kupfer CU14.23001.00001.00002026-01-20T00:00:0011724204740.80VATS19.004.2390102381403180658492Eaton EVG-3PHAS/9MODUL SammelschienEaton EVG-3PHAS/9MODUL Sammelschiene Euro-Vario 63A TRADING_UNITZuschlag Kupfer CU10.44122026-01-19T00:00:000000121026285296 WischAER10.95001.000010.95001.00001.00002026-01-20T00:00:0012724204742.08VATS19.0010.9573307010300004598083Enoc KM 06 (VE50) Muttern und SchraEnoc KM 06 (VE50) Muttern und Schrauben Set 132026-01-19T00:00:000000131026285296 WischAER29.0000100.0000true73.5500100.000073.5500Zuschlag Kupfer102.5500100.0000100.00002026-01-20T00:00:00137242047419.48VATS19.00102.550110328NYM-J 3x2,5 Eca Ri100 Mantelltg FeuNYM-J 3x2,5 Eca Ri100 Mantelltg Feuchtraum TRADING_UNITZuschlag Kupfer73.55142026-01-19T00:00:000000141026285296 WischAER49.2000100.0000true122.5800100.0000122.5800Zuschlag Kupfer171.7800100.0000100.00002026-01-20T00:00:00147242047432.64VATS19.00171.780110358NYM-J 5x2,5 Eca Ri100 Mantelltg FeuNYM-J 5x2,5 Eca Ri100 Mantelltg Feuchtraum TRADING_UNITZuschlag Kupfer122.58152026-01-19T00:00:000000151026285296 WischAER168.5000100.0000true245.160050.0000490.3200Zuschlag Kupfer658.8200100.000050.00002026-01-20T00:00:00157242047462.59VATS19.00329.410110354NYM-J 5x10 Eca Ri.50 Mantelltg FeucNYM-J 5x10 Eca Ri.50 Mantelltg Feuchtraum TRADING_UNITZuschlag Kupfer245.16162026-01-19T00:00:000000161026285296 WischAER10.32001.000010.32001.000036.00002026-01-20T00:00:00167242047470.59VATS19.00371.5240121953908795402293OBO BETT. RKSM 610 FS Kabelrinne m.OBO BETT. RKSM 610 FS Kabelrinne m.Verbinder 60x100mm 172026-01-19T00:00:000000171026285296 WischAER485.26001.0000485.26001.00001.00002026-01-20T00:00:00177242047492.21VATS19.00485.2642605589502955012149KOSTAL 10532947 Wandladestation ENEKOSTAL 10532947 Wandladestation ENECTOR AC 3.7/11 182026-01-19T00:00:000000181026285296 WischAER17.3700100.000017.3700100.0000100.00002026-01-20T00:00:0018724204743.30VATS19.0017.3740121961998150410195OBO BETT. FRSB 6x12 F FlachrundschrOBO BETT. FRSB 6x12 F Flachrundschraube vz 192026-01-19T00:00:000000191026285296 WischAER5.26001.00005.26001.000036.00002026-01-20T00:00:00197242047435.98VATS19.00189.3640121962071900410077OBO BETT. AW 15 21 FT Wandausleger OBO BETT. AW 15 21 FT Wandausleger tauchf.vz 202026-01-19T00:00:000000201026285296 WischAER7.75001.00007.75001.000011.00002026-01-20T00:00:00207242047416.20VATS19.0085.2540121962072510410078OBO BETT. AW 15 31 FT Wandausleger OBO BETT. AW 15 31 FT Wandausleger tauchf.vz 212026-01-19T00:00:000000211026285296 WischAER0.65001.00000.65001.000020.00002026-01-20T00:00:0021724204742.47VATS19.0013.0040018690957900657414Siemens 5SH4362 Neozed-SchraubkappeSiemens 5SH4362 Neozed-Schraubkappe 63A D02 m.Prüfloch 222026-01-19T00:00:000000221026285296 WischAER0.37001.00000.37001.000012.00002026-01-20T00:00:0022724204740.84VATS19.004.4440865000109980630461MERSEN 01706.025000 Passeinsatz NEOMERSEN 01706.025000 Passeinsatz NEOZED D02 25A gelb 232026-01-19T00:00:000000231026285296 WischAER0.37001.00000.37001.000012.00002026-01-20T00:00:0023724204740.84VATS19.004.4440865000110490630462MERSEN 01706.035000 Passeinsatz NEOMERSEN 01706.035000 Passeinsatz NEOZED D02 35A schwarz 242026-01-19T00:00:000000241026285296 WischAER0.37001.00000.37001.000012.00002026-01-20T00:00:0024724204740.84VATS19.004.4440865000110940630463MERSEN 01706.050000 Passeinsatz NEOMERSEN 01706.050000 Passeinsatz NEOZED D02 50A weiss 252026-01-19T00:00:000000251026285296 WischAER0.37001.00000.37001.000012.00002026-01-20T00:00:0025724204740.84VATS19.004.4440865000109980630461MERSEN 01706.025000 Passeinsatz NEOMERSEN 01706.025000 Passeinsatz NEOZED D02 25A gelb 262026-01-19T00:00:000000261026285296 WischAER0.37001.00000.37001.000012.00002026-01-20T00:00:0026724204740.84VATS19.004.4440865000109430630460MERSEN 01706.020000 Passeinsatz NEOMERSEN 01706.020000 Passeinsatz NEOZED D02 20A blau 272026-01-19T00:00:000000271026285296 WischAER6.67001.00006.67001.00001.00002026-01-20T00:00:0027724204741.27VATS19.006.6740865000111860630492MERSEN 01708.000000 PaßeinsatzschlüMERSEN 01708.000000 Paßeinsatzschlüssel NEOZED D01-D03 282026-01-19T00:00:000000281026285296 WischAER0.39001.00000.39001.000024.00002026-01-20T00:00:0028724204741.78VATS19.009.3640865000114070630490MERSEN 01713.000000 Spezial-HaltefeMERSEN 01713.000000 Spezial-Haltefeder NEOZED D01/D02 292026-01-19T00:00:000000291026285296 WischAER194.26001.0000194.26001.00001.00002026-01-20T00:00:00297242047436.91VATS19.00194.2632506164577060626165Hager VE412DN Kleinverteiler, VectoHager VE412DN Kleinverteiler, Vector IP65,48PLE 302026-01-19T00:00:000000301026285296 WischAER116.81001.0000116.81001.00001.00002026-01-20T00:00:00307242047422.19VATS19.00116.8132506110126580646621Hager ARC910D Fehlerlichtb.-SchutzeHager ARC910D Fehlerlichtb.-Schutzeinr. 1P+N,6kA,B-10A,2M 312026-01-19T00:00:000000311026285296 WischAER20.56001.000020.56001.00002.00002026-01-20T00:00:0031724204747.81VATS19.0041.1232506155102285709088Hager SBN363 Ausschalter 3P 63AHager SBN363 Ausschalter 3P 63A 322026-01-19T00:00:000000321026285296 WischAER36.99001.000036.99001.00001.00002026-01-20T00:00:0032724204747.03VATS19.0036.9932506116100760606656Hager CDA440D FI-Schutzschalter 4poHager CDA440D FI-Schutzschalter 4pol. 40A/30mA,6kA 332026-01-19T00:00:000000331026285296 WischAER12.14001.000012.14001.00006.00002026-01-20T00:00:00337242047413.84VATS19.0072.8436053405374375801813MERSEN 04735.000000 SicherungssockeMERSEN 04735.000000 Sicherungssockel NEOZED D02 63A/230/440V 3p. 342026-01-19T00:00:000000341026285296 WischAER26.69001.000026.69001.00001.00002026-01-20T00:00:0034724204745.07VATS19.0026.6940114594417911203829Grothe GONG 569-230V Zweiklang-GongGrothe GONG 569-230V Zweiklang-Gong 352026-01-19T00:00:000000351026285296 WischAER12.43001.000012.43001.000010.00002026-01-20T00:00:00357242047423.62VATS19.00124.3087101633660433709862Signify WT050C 1xTLED L1500 FeuchtrSignify WT050C 1xTLED L1500 Feuchtraumleuchte f. 1 LED-Tube 362026-01-19T00:00:000000361026285296 WischAER9.92001.00009.92001.000010.00002026-01-20T00:00:00367242047418.85VATS19.0099.2087195143166212511528Signify MASLEDtube #31662100 LED-TuSignify MASLEDtube #31662100 LED-Tube T8 f. KVG/VVG 372026-01-19T00:00:000000371026285296 WischAER208.97001.0000208.97001.00001.00002026-01-20T00:00:00377242047439.70VATS19.00208.9732506155149985630665Hager SPA701Z Kombiableiter 4P T1+THager SPA701Z Kombiableiter 4P T1+T2+T3 382026-01-19T00:00:000000381026285296 WischAER22.53001.000022.53001.00001.00002026-01-20T00:00:0038724204744.28VATS19.0022.5332506155116455709097Hager SBT116 Ausschalter 1P 16AHager SBT116 Ausschalter 1P 16A 392026-01-19T00:00:000000391026285296 WischAER25.51001.000025.51001.00001.00002026-01-20T00:00:0039724204744.85VATS19.0025.5140150815037285609476Eaton ZSD-BPKT/T/31 TSG-BestückungsEaton ZSD-BPKT/T/31 TSG-Bestückungspaket 31 +endstream +endobj +1085 0 obj +<< +/BitsPerComponent 8 +/ColorSpace /DeviceGray +/Decode [0.0 1.0] +/Filter /FlateDecode +/Height 413 +/Length 427 +/Name /X +/Subtype /Image +/Type /XObject +/Width 1004 +>> +stream +H1 gQ +endstream +endobj +1086 0 obj +<< +/K 27 0 R +/P 1684 0 R +/S /TR +>> +endobj +1087 0 obj +<< +/K [1102 0 R 1101 0 R] +/P 28 0 R +/S /Sect +>> +endobj +1088 0 obj +<< +/K 31 0 R +/P 28 0 R +/S /Div +>> +endobj +1089 0 obj +<< +/K 1103 0 R +/P 28 0 R +/S /Sect +>> +endobj +1090 0 obj +<< +/K 1685 0 R +/P 28 0 R +/S /Sect +>> +endobj +1091 0 obj +<< +/K 1686 0 R +/P 28 0 R +/S /Sect +>> +endobj +1092 0 obj +<< +/K [1104 0 R 1687 0 R] +/P 28 0 R +/S /Sect +>> +endobj +1093 0 obj +<< +/K [1264 0 R 1263 0 R 1688 0 R] +/P 29 0 R +/S /Sect +>> +endobj +1094 0 obj +<< +/K 1267 0 R +/P 29 0 R +/S /Sect +>> +endobj +1095 0 obj +<< +/K 1689 0 R +/P 29 0 R +/S /Sect +>> +endobj +1096 0 obj +<< +/K [1268 0 R 1690 0 R] +/P 29 0 R +/S /Sect +>> +endobj +1097 0 obj +<< +/K [1497 0 R 1496 0 R 1691 0 R] +/P 30 0 R +/S /Sect +>> +endobj +1098 0 obj +<< +/K 1500 0 R +/P 30 0 R +/S /Sect +>> +endobj +1099 0 obj +<< +/K [1692 0 R 1693 0 R] +/P 30 0 R +/S /Sect +>> +endobj +1100 0 obj +<< +/K [1501 0 R 1694 0 R] +/P 30 0 R +/S /Sect +>> +endobj +1101 0 obj +<< +/K [33 0 R 32 0 R] +/P 1087 0 R +/S /Div +>> +endobj +1102 0 obj +<< +/K 34 0 R +/P 1087 0 R +/S /Div +>> +endobj +1103 0 obj +<< +/K [36 0 R 35 0 R] +/P 1089 0 R +/S /Div +>> +endobj +1104 0 obj +<< +/K 37 0 R +/P 1092 0 R +/S /Div +>> +endobj +1105 0 obj +<< +/K [39 0 R 38 0 R] +/P 1687 0 R +/S /Div +>> +endobj +1106 0 obj +<< +/K [41 0 R 40 0 R] +/P 1695 0 R +/S /Div +>> +endobj +1107 0 obj +<< +/K [43 0 R 42 0 R] +/P 1696 0 R +/S /Div +>> +endobj +1108 0 obj +<< +/K 44 0 R +/P 1697 0 R +/S /Div +>> +endobj +1109 0 obj +<< +/K [46 0 R 45 0 R] +/P 1697 0 R +/S /Div +>> +endobj +1110 0 obj +<< +/K 47 0 R +/P 1698 0 R +/S /Div +>> +endobj +1111 0 obj +<< +/K 48 0 R +/P 1698 0 R +/S /Div +>> +endobj +1112 0 obj +<< +/K 49 0 R +/P 1699 0 R +/S /Div +>> +endobj +1113 0 obj +<< +/K 51 0 R +/P 1700 0 R +/S /TD +>> +endobj +1114 0 obj +<< +/K 52 0 R +/P 1701 0 R +/S /Div +>> +endobj +1115 0 obj +<< +/K 53 0 R +/P 1701 0 R +/S /Div +>> +endobj +1116 0 obj +<< +/K 54 0 R +/P 1702 0 R +/S /Div +>> +endobj +1117 0 obj +<< +/K 55 0 R +/P 1702 0 R +/S /Div +>> +endobj +1118 0 obj +<< +/K 56 0 R +/P 1702 0 R +/S /Div +>> +endobj +1119 0 obj +<< +/K 57 0 R +/P 1702 0 R +/S /Div +>> +endobj +1120 0 obj +<< +/K 58 0 R +/P 1703 0 R +/S /Div +>> +endobj +1121 0 obj +<< +/K [60 0 R 59 0 R] +/P 1704 0 R +/S /Div +>> +endobj +1122 0 obj +<< +/K 61 0 R +/P 1704 0 R +/S /Div +>> +endobj +1123 0 obj +<< +/K [63 0 R 62 0 R] +/P 1704 0 R +/S /Div +>> +endobj +1124 0 obj +<< +/K 64 0 R +/P 1705 0 R +/S /Div +>> +endobj +1125 0 obj +<< +/K 65 0 R +/P 1706 0 R +/S /Div +>> +endobj +1126 0 obj +<< +/K 66 0 R +/P 1706 0 R +/S /Div +>> +endobj +1127 0 obj +<< +/K [68 0 R 67 0 R] +/P 1707 0 R +/S /Div +>> +endobj +1128 0 obj +<< +/K [70 0 R 69 0 R] +/P 1708 0 R +/S /Div +>> +endobj +1129 0 obj +<< +/K 71 0 R +/P 1709 0 R +/S /Div +>> +endobj +1130 0 obj +<< +/K [73 0 R 72 0 R] +/P 1709 0 R +/S /Div +>> +endobj +1131 0 obj +<< +/K [75 0 R 74 0 R] +/P 1709 0 R +/S /Div +>> +endobj +1132 0 obj +<< +/K [77 0 R 76 0 R] +/P 1710 0 R +/S /Div +>> +endobj +1133 0 obj +<< +/K 78 0 R +/P 1710 0 R +/S /Div +>> +endobj +1134 0 obj +<< +/K 79 0 R +/P 1710 0 R +/S /Div +>> +endobj +1135 0 obj +<< +/K [81 0 R 80 0 R] +/P 1711 0 R +/S /Div +>> +endobj +1136 0 obj +<< +/K 82 0 R +/P 1711 0 R +/S /Div +>> +endobj +1137 0 obj +<< +/K 83 0 R +/P 1711 0 R +/S /Div +>> +endobj +1138 0 obj +<< +/K 84 0 R +/P 1711 0 R +/S /Div +>> +endobj +1139 0 obj +<< +/K 85 0 R +/P 1711 0 R +/S /Div +>> +endobj +1140 0 obj +<< +/K 86 0 R +/P 1711 0 R +/S /Div +>> +endobj +1141 0 obj +<< +/K 87 0 R +/P 1711 0 R +/S /Div +>> +endobj +1142 0 obj +<< +/K 88 0 R +/P 1711 0 R +/S /Div +>> +endobj +1143 0 obj +<< +/K [90 0 R 89 0 R] +/P 1712 0 R +/S /Div +>> +endobj +1144 0 obj +<< +/K [92 0 R 91 0 R] +/P 1712 0 R +/S /Div +>> +endobj +1145 0 obj +<< +/K [94 0 R 93 0 R] +/P 1712 0 R +/S /Div +>> +endobj +1146 0 obj +<< +/K [96 0 R 95 0 R] +/P 1713 0 R +/S /Div +>> +endobj +1147 0 obj +<< +/K 97 0 R +/P 1714 0 R +/S /Div +>> +endobj +1148 0 obj +<< +/K [99 0 R 98 0 R] +/P 1714 0 R +/S /Div +>> +endobj +1149 0 obj +<< +/K [101 0 R 100 0 R] +/P 1714 0 R +/S /Div +>> +endobj +1150 0 obj +<< +/K 102 0 R +/P 1715 0 R +/S /Div +>> +endobj +1151 0 obj +<< +/K [104 0 R 103 0 R] +/P 1716 0 R +/S /Div +>> +endobj +1152 0 obj +<< +/K [106 0 R 105 0 R] +/P 1716 0 R +/S /Div +>> +endobj +1153 0 obj +<< +/K [108 0 R 107 0 R] +/P 1717 0 R +/S /Div +>> +endobj +1154 0 obj +<< +/K [110 0 R 109 0 R] +/P 1718 0 R +/S /Div +>> +endobj +1155 0 obj +<< +/K [112 0 R 111 0 R] +/P 1719 0 R +/S /Div +>> +endobj +1156 0 obj +<< +/K [114 0 R 113 0 R] +/P 1720 0 R +/S /Div +>> +endobj +1157 0 obj +<< +/K [116 0 R 115 0 R] +/P 1718 0 R +/S /Div +>> +endobj +1158 0 obj +<< +/K [118 0 R 117 0 R] +/P 1718 0 R +/S /Div +>> +endobj +1159 0 obj +<< +/K [120 0 R 119 0 R] +/P 1718 0 R +/S /Div +>> +endobj +1160 0 obj +<< +/K [122 0 R 121 0 R] +/P 1718 0 R +/S /Div +>> +endobj +1161 0 obj +<< +/K [124 0 R 123 0 R] +/P 1718 0 R +/S /Div +>> +endobj +1162 0 obj +<< +/K 125 0 R +/P 1721 0 R +/S /Div +>> +endobj +1163 0 obj +<< +/K [127 0 R 126 0 R] +/P 1722 0 R +/S /Div +>> +endobj +1164 0 obj +<< +/K [129 0 R 128 0 R] +/P 1722 0 R +/S /Div +>> +endobj +1165 0 obj +<< +/K [131 0 R 130 0 R] +/P 1723 0 R +/S /Div +>> +endobj +1166 0 obj +<< +/K [133 0 R 132 0 R] +/P 1724 0 R +/S /Div +>> +endobj +1167 0 obj +<< +/K [135 0 R 134 0 R] +/P 1725 0 R +/S /Div +>> +endobj +1168 0 obj +<< +/K [137 0 R 136 0 R] +/P 1726 0 R +/S /Div +>> +endobj +1169 0 obj +<< +/K [139 0 R 138 0 R] +/P 1724 0 R +/S /Div +>> +endobj +1170 0 obj +<< +/K [141 0 R 140 0 R] +/P 1724 0 R +/S /Div +>> +endobj +1171 0 obj +<< +/K [143 0 R 142 0 R] +/P 1724 0 R +/S /Div +>> +endobj +1172 0 obj +<< +/K [145 0 R 144 0 R] +/P 1724 0 R +/S /Div +>> +endobj +1173 0 obj +<< +/K [147 0 R 146 0 R] +/P 1724 0 R +/S /Div +>> +endobj +1174 0 obj +<< +/K 148 0 R +/P 1727 0 R +/S /Div +>> +endobj +1175 0 obj +<< +/K [150 0 R 149 0 R] +/P 1728 0 R +/S /Div +>> +endobj +1176 0 obj +<< +/K [152 0 R 151 0 R] +/P 1728 0 R +/S /Div +>> +endobj +1177 0 obj +<< +/K [154 0 R 153 0 R] +/P 1729 0 R +/S /Div +>> +endobj +1178 0 obj +<< +/K [156 0 R 155 0 R] +/P 1730 0 R +/S /Div +>> +endobj +1179 0 obj +<< +/K [158 0 R 157 0 R] +/P 1731 0 R +/S /Div +>> +endobj +1180 0 obj +<< +/K [160 0 R 159 0 R] +/P 1732 0 R +/S /Div +>> +endobj +1181 0 obj +<< +/K [162 0 R 161 0 R] +/P 1730 0 R +/S /Div +>> +endobj +1182 0 obj +<< +/K [164 0 R 163 0 R] +/P 1730 0 R +/S /Div +>> +endobj +1183 0 obj +<< +/K [166 0 R 165 0 R] +/P 1730 0 R +/S /Div +>> +endobj +1184 0 obj +<< +/K [168 0 R 167 0 R] +/P 1730 0 R +/S /Div +>> +endobj +1185 0 obj +<< +/K [170 0 R 169 0 R] +/P 1730 0 R +/S /Div +>> +endobj +1186 0 obj +<< +/K 171 0 R +/P 1733 0 R +/S /Div +>> +endobj +1187 0 obj +<< +/K [173 0 R 172 0 R] +/P 1734 0 R +/S /Div +>> +endobj +1188 0 obj +<< +/K [175 0 R 174 0 R] +/P 1734 0 R +/S /Div +>> +endobj +1189 0 obj +<< +/K [177 0 R 176 0 R] +/P 1735 0 R +/S /Div +>> +endobj +1190 0 obj +<< +/K [179 0 R 178 0 R] +/P 1736 0 R +/S /Div +>> +endobj +1191 0 obj +<< +/K [181 0 R 180 0 R] +/P 1737 0 R +/S /Div +>> +endobj +1192 0 obj +<< +/K [183 0 R 182 0 R] +/P 1738 0 R +/S /Div +>> +endobj +1193 0 obj +<< +/K [185 0 R 184 0 R] +/P 1736 0 R +/S /Div +>> +endobj +1194 0 obj +<< +/K [187 0 R 186 0 R] +/P 1736 0 R +/S /Div +>> +endobj +1195 0 obj +<< +/K [189 0 R 188 0 R] +/P 1736 0 R +/S /Div +>> +endobj +1196 0 obj +<< +/K [191 0 R 190 0 R] +/P 1736 0 R +/S /Div +>> +endobj +1197 0 obj +<< +/K [193 0 R 192 0 R] +/P 1736 0 R +/S /Div +>> +endobj +1198 0 obj +<< +/K 194 0 R +/P 1739 0 R +/S /Div +>> +endobj +1199 0 obj +<< +/K [196 0 R 195 0 R] +/P 1740 0 R +/S /Div +>> +endobj +1200 0 obj +<< +/K [198 0 R 197 0 R] +/P 1740 0 R +/S /Div +>> +endobj +1201 0 obj +<< +/K [200 0 R 199 0 R] +/P 1741 0 R +/S /Div +>> +endobj +1202 0 obj +<< +/K [202 0 R 201 0 R] +/P 1742 0 R +/S /Div +>> +endobj +1203 0 obj +<< +/K [204 0 R 203 0 R] +/P 1743 0 R +/S /Div +>> +endobj +1204 0 obj +<< +/K [206 0 R 205 0 R] +/P 1744 0 R +/S /Div +>> +endobj +1205 0 obj +<< +/K [208 0 R 207 0 R] +/P 1742 0 R +/S /Div +>> +endobj +1206 0 obj +<< +/K [210 0 R 209 0 R] +/P 1742 0 R +/S /Div +>> +endobj +1207 0 obj +<< +/K [212 0 R 211 0 R] +/P 1742 0 R +/S /Div +>> +endobj +1208 0 obj +<< +/K [214 0 R 213 0 R] +/P 1742 0 R +/S /Div +>> +endobj +1209 0 obj +<< +/K [216 0 R 215 0 R] +/P 1742 0 R +/S /Div +>> +endobj +1210 0 obj +<< +/K 217 0 R +/P 1745 0 R +/S /Div +>> +endobj +1211 0 obj +<< +/K [219 0 R 218 0 R] +/P 1746 0 R +/S /Div +>> +endobj +1212 0 obj +<< +/K [221 0 R 220 0 R] +/P 1746 0 R +/S /Div +>> +endobj +1213 0 obj +<< +/K [223 0 R 222 0 R] +/P 1747 0 R +/S /Div +>> +endobj +1214 0 obj +<< +/K [225 0 R 224 0 R] +/P 1748 0 R +/S /Div +>> +endobj +1215 0 obj +<< +/K 226 0 R +/P 1749 0 R +/S /Div +>> +endobj +1216 0 obj +<< +/K [228 0 R 227 0 R] +/P 1750 0 R +/S /Div +>> +endobj +1217 0 obj +<< +/K [230 0 R 229 0 R] +/P 1748 0 R +/S /Div +>> +endobj +1218 0 obj +<< +/K [232 0 R 231 0 R] +/P 1748 0 R +/S /Div +>> +endobj +1219 0 obj +<< +/K [234 0 R 233 0 R] +/P 1748 0 R +/S /Div +>> +endobj +1220 0 obj +<< +/K [236 0 R 235 0 R] +/P 1748 0 R +/S /Div +>> +endobj +1221 0 obj +<< +/K [238 0 R 237 0 R] +/P 1748 0 R +/S /Div +>> +endobj +1222 0 obj +<< +/K 239 0 R +/P 1751 0 R +/S /Div +>> +endobj +1223 0 obj +<< +/K 240 0 R +/P 1752 0 R +/S /Div +>> +endobj +1224 0 obj +<< +/K [242 0 R 241 0 R] +/P 1752 0 R +/S /Div +>> +endobj +1225 0 obj +<< +/K [244 0 R 243 0 R] +/P 1753 0 R +/S /Div +>> +endobj +1226 0 obj +<< +/K [246 0 R 245 0 R] +/P 1753 0 R +/S /Div +>> +endobj +1227 0 obj +<< +/K [248 0 R 247 0 R] +/P 1754 0 R +/S /Div +>> +endobj +1228 0 obj +<< +/K [250 0 R 249 0 R] +/P 1755 0 R +/S /Div +>> +endobj +1229 0 obj +<< +/K [252 0 R 251 0 R] +/P 1756 0 R +/S /Div +>> +endobj +1230 0 obj +<< +/K [254 0 R 253 0 R] +/P 1757 0 R +/S /Div +>> +endobj +1231 0 obj +<< +/K [256 0 R 255 0 R] +/P 1755 0 R +/S /Div +>> +endobj +1232 0 obj +<< +/K [258 0 R 257 0 R] +/P 1755 0 R +/S /Div +>> +endobj +1233 0 obj +<< +/K [260 0 R 259 0 R] +/P 1755 0 R +/S /Div +>> +endobj +1234 0 obj +<< +/K [262 0 R 261 0 R] +/P 1755 0 R +/S /Div +>> +endobj +1235 0 obj +<< +/K [264 0 R 263 0 R] +/P 1755 0 R +/S /Div +>> +endobj +1236 0 obj +<< +/K 265 0 R +/P 1758 0 R +/S /Div +>> +endobj +1237 0 obj +<< +/K 266 0 R +/P 1759 0 R +/S /Div +>> +endobj +1238 0 obj +<< +/K [268 0 R 267 0 R] +/P 1759 0 R +/S /Div +>> +endobj +1239 0 obj +<< +/K [270 0 R 269 0 R] +/P 1760 0 R +/S /Div +>> +endobj +1240 0 obj +<< +/K [272 0 R 271 0 R] +/P 1760 0 R +/S /Div +>> +endobj +1241 0 obj +<< +/K [274 0 R 273 0 R] +/P 1761 0 R +/S /Div +>> +endobj +1242 0 obj +<< +/K [276 0 R 275 0 R] +/P 1762 0 R +/S /Div +>> +endobj +1243 0 obj +<< +/K [278 0 R 277 0 R] +/P 1763 0 R +/S /Div +>> +endobj +1244 0 obj +<< +/K [280 0 R 279 0 R] +/P 1764 0 R +/S /Div +>> +endobj +1245 0 obj +<< +/K [282 0 R 281 0 R] +/P 1762 0 R +/S /Div +>> +endobj +1246 0 obj +<< +/K [284 0 R 283 0 R] +/P 1762 0 R +/S /Div +>> +endobj +1247 0 obj +<< +/K [286 0 R 285 0 R] +/P 1762 0 R +/S /Div +>> +endobj +1248 0 obj +<< +/K [288 0 R 287 0 R] +/P 1762 0 R +/S /Div +>> +endobj +1249 0 obj +<< +/K [290 0 R 289 0 R] +/P 1762 0 R +/S /Div +>> +endobj +1250 0 obj +<< +/K 291 0 R +/P 1765 0 R +/S /Div +>> +endobj +1251 0 obj +<< +/K [293 0 R 292 0 R] +/P 1766 0 R +/S /Div +>> +endobj +1252 0 obj +<< +/K [295 0 R 294 0 R] +/P 1766 0 R +/S /Div +>> +endobj +1253 0 obj +<< +/K [297 0 R 296 0 R] +/P 1767 0 R +/S /Div +>> +endobj +1254 0 obj +<< +/K [299 0 R 298 0 R] +/P 1768 0 R +/S /Div +>> +endobj +1255 0 obj +<< +/K [301 0 R 300 0 R] +/P 1769 0 R +/S /Div +>> +endobj +1256 0 obj +<< +/K [303 0 R 302 0 R] +/P 1770 0 R +/S /Div +>> +endobj +1257 0 obj +<< +/K [305 0 R 304 0 R] +/P 1768 0 R +/S /Div +>> +endobj +1258 0 obj +<< +/K [307 0 R 306 0 R] +/P 1768 0 R +/S /Div +>> +endobj +1259 0 obj +<< +/K [309 0 R 308 0 R] +/P 1768 0 R +/S /Div +>> +endobj +1260 0 obj +<< +/K [311 0 R 310 0 R] +/P 1768 0 R +/S /Div +>> +endobj +1261 0 obj +<< +/K [313 0 R 312 0 R] +/P 1768 0 R +/S /Div +>> +endobj +1262 0 obj +<< +/K 314 0 R +/P 1771 0 R +/S /Div +>> +endobj +1263 0 obj +<< +/K [316 0 R 315 0 R] +/P 1093 0 R +/S /Div +>> +endobj +1264 0 obj +<< +/K 317 0 R +/P 1093 0 R +/S /Div +>> +endobj +1265 0 obj +<< +/K 318 0 R +/P 1688 0 R +/S /Div +>> +endobj +1266 0 obj +<< +/K 319 0 R +/P 1688 0 R +/S /Div +>> +endobj +1267 0 obj +<< +/K 320 0 R +/P 1094 0 R +/S /Div +>> +endobj +1268 0 obj +<< +/K [322 0 R 321 0 R] +/P 1096 0 R +/S /Div +>> +endobj +1269 0 obj +<< +/K [324 0 R 323 0 R] +/P 1690 0 R +/S /Div +>> +endobj +1270 0 obj +<< +/K [326 0 R 325 0 R] +/P 1772 0 R +/S /Div +>> +endobj +1271 0 obj +<< +/K 327 0 R +/P 1772 0 R +/S /Div +>> +endobj +1272 0 obj +<< +/K 328 0 R +/P 1772 0 R +/S /Div +>> +endobj +1273 0 obj +<< +/K [330 0 R 329 0 R] +/P 1773 0 R +/S /Div +>> +endobj +1274 0 obj +<< +/K 331 0 R +/P 1773 0 R +/S /Div +>> +endobj +1275 0 obj +<< +/K 332 0 R +/P 1773 0 R +/S /Div +>> +endobj +1276 0 obj +<< +/K 333 0 R +/P 1773 0 R +/S /Div +>> +endobj +1277 0 obj +<< +/K 334 0 R +/P 1773 0 R +/S /Div +>> +endobj +1278 0 obj +<< +/K 335 0 R +/P 1773 0 R +/S /Div +>> +endobj +1279 0 obj +<< +/K 336 0 R +/P 1773 0 R +/S /Div +>> +endobj +1280 0 obj +<< +/K 337 0 R +/P 1773 0 R +/S /Div +>> +endobj +1281 0 obj +<< +/K [339 0 R 338 0 R] +/P 1774 0 R +/S /Div +>> +endobj +1282 0 obj +<< +/K [341 0 R 340 0 R] +/P 1774 0 R +/S /Div +>> +endobj +1283 0 obj +<< +/K [343 0 R 342 0 R] +/P 1775 0 R +/S /Div +>> +endobj +1284 0 obj +<< +/K [345 0 R 344 0 R] +/P 1776 0 R +/S /Div +>> +endobj +1285 0 obj +<< +/K [347 0 R 346 0 R] +/P 1777 0 R +/S /Div +>> +endobj +1286 0 obj +<< +/K [349 0 R 348 0 R] +/P 1778 0 R +/S /Div +>> +endobj +1287 0 obj +<< +/K [351 0 R 350 0 R] +/P 1776 0 R +/S /Div +>> +endobj +1288 0 obj +<< +/K [353 0 R 352 0 R] +/P 1776 0 R +/S /Div +>> +endobj +1289 0 obj +<< +/K [355 0 R 354 0 R] +/P 1776 0 R +/S /Div +>> +endobj +1290 0 obj +<< +/K [357 0 R 356 0 R] +/P 1776 0 R +/S /Div +>> +endobj +1291 0 obj +<< +/K [359 0 R 358 0 R] +/P 1776 0 R +/S /Div +>> +endobj +1292 0 obj +<< +/K 360 0 R +/P 1779 0 R +/S /Div +>> +endobj +1293 0 obj +<< +/K [362 0 R 361 0 R] +/P 1780 0 R +/S /Div +>> +endobj +1294 0 obj +<< +/K [364 0 R 363 0 R] +/P 1780 0 R +/S /Div +>> +endobj +1295 0 obj +<< +/K [366 0 R 365 0 R] +/P 1781 0 R +/S /Div +>> +endobj +1296 0 obj +<< +/K [368 0 R 367 0 R] +/P 1782 0 R +/S /Div +>> +endobj +1297 0 obj +<< +/K [370 0 R 369 0 R] +/P 1783 0 R +/S /Div +>> +endobj +1298 0 obj +<< +/K [372 0 R 371 0 R] +/P 1784 0 R +/S /Div +>> +endobj +1299 0 obj +<< +/K [374 0 R 373 0 R] +/P 1782 0 R +/S /Div +>> +endobj +1300 0 obj +<< +/K [376 0 R 375 0 R] +/P 1782 0 R +/S /Div +>> +endobj +1301 0 obj +<< +/K [378 0 R 377 0 R] +/P 1782 0 R +/S /Div +>> +endobj +1302 0 obj +<< +/K [380 0 R 379 0 R] +/P 1782 0 R +/S /Div +>> +endobj +1303 0 obj +<< +/K [382 0 R 381 0 R] +/P 1782 0 R +/S /Div +>> +endobj +1304 0 obj +<< +/K 383 0 R +/P 1785 0 R +/S /Div +>> +endobj +1305 0 obj +<< +/K 384 0 R +/P 1786 0 R +/S /Div +>> +endobj +1306 0 obj +<< +/K [386 0 R 385 0 R] +/P 1786 0 R +/S /Div +>> +endobj +1307 0 obj +<< +/K [388 0 R 387 0 R] +/P 1787 0 R +/S /Div +>> +endobj +1308 0 obj +<< +/K [390 0 R 389 0 R] +/P 1787 0 R +/S /Div +>> +endobj +1309 0 obj +<< +/K [392 0 R 391 0 R] +/P 1788 0 R +/S /Div +>> +endobj +1310 0 obj +<< +/K [394 0 R 393 0 R] +/P 1789 0 R +/S /Div +>> +endobj +1311 0 obj +<< +/K [396 0 R 395 0 R] +/P 1790 0 R +/S /Div +>> +endobj +1312 0 obj +<< +/K [398 0 R 397 0 R] +/P 1791 0 R +/S /Div +>> +endobj +1313 0 obj +<< +/K [400 0 R 399 0 R] +/P 1789 0 R +/S /Div +>> +endobj +1314 0 obj +<< +/K [402 0 R 401 0 R] +/P 1789 0 R +/S /Div +>> +endobj +1315 0 obj +<< +/K [404 0 R 403 0 R] +/P 1789 0 R +/S /Div +>> +endobj +1316 0 obj +<< +/K [406 0 R 405 0 R] +/P 1789 0 R +/S /Div +>> +endobj +1317 0 obj +<< +/K [408 0 R 407 0 R] +/P 1789 0 R +/S /Div +>> +endobj +1318 0 obj +<< +/K 409 0 R +/P 1792 0 R +/S /Div +>> +endobj +1319 0 obj +<< +/K [411 0 R 410 0 R] +/P 1793 0 R +/S /Div +>> +endobj +1320 0 obj +<< +/K [413 0 R 412 0 R] +/P 1793 0 R +/S /Div +>> +endobj +1321 0 obj +<< +/K [415 0 R 414 0 R] +/P 1794 0 R +/S /Div +>> +endobj +1322 0 obj +<< +/K [417 0 R 416 0 R] +/P 1795 0 R +/S /Div +>> +endobj +1323 0 obj +<< +/K 418 0 R +/P 1796 0 R +/S /Div +>> +endobj +1324 0 obj +<< +/K [420 0 R 419 0 R] +/P 1797 0 R +/S /Div +>> +endobj +1325 0 obj +<< +/K [422 0 R 421 0 R] +/P 1795 0 R +/S /Div +>> +endobj +1326 0 obj +<< +/K [424 0 R 423 0 R] +/P 1795 0 R +/S /Div +>> +endobj +1327 0 obj +<< +/K [426 0 R 425 0 R] +/P 1795 0 R +/S /Div +>> +endobj +1328 0 obj +<< +/K [428 0 R 427 0 R] +/P 1795 0 R +/S /Div +>> +endobj +1329 0 obj +<< +/K [430 0 R 429 0 R] +/P 1795 0 R +/S /Div +>> +endobj +1330 0 obj +<< +/K 431 0 R +/P 1798 0 R +/S /Div +>> +endobj +1331 0 obj +<< +/K 432 0 R +/P 1799 0 R +/S /Div +>> +endobj +1332 0 obj +<< +/K [434 0 R 433 0 R] +/P 1799 0 R +/S /Div +>> +endobj +1333 0 obj +<< +/K [436 0 R 435 0 R] +/P 1800 0 R +/S /Div +>> +endobj +1334 0 obj +<< +/K [438 0 R 437 0 R] +/P 1800 0 R +/S /Div +>> +endobj +1335 0 obj +<< +/K [440 0 R 439 0 R] +/P 1801 0 R +/S /Div +>> +endobj +1336 0 obj +<< +/K [442 0 R 441 0 R] +/P 1802 0 R +/S /Div +>> +endobj +1337 0 obj +<< +/K 443 0 R +/P 1803 0 R +/S /Div +>> +endobj +1338 0 obj +<< +/K [445 0 R 444 0 R] +/P 1804 0 R +/S /Div +>> +endobj +1339 0 obj +<< +/K [447 0 R 446 0 R] +/P 1802 0 R +/S /Div +>> +endobj +1340 0 obj +<< +/K [449 0 R 448 0 R] +/P 1802 0 R +/S /Div +>> +endobj +1341 0 obj +<< +/K [451 0 R 450 0 R] +/P 1802 0 R +/S /Div +>> +endobj +1342 0 obj +<< +/K [453 0 R 452 0 R] +/P 1802 0 R +/S /Div +>> +endobj +1343 0 obj +<< +/K [455 0 R 454 0 R] +/P 1802 0 R +/S /Div +>> +endobj +1344 0 obj +<< +/K 456 0 R +/P 1805 0 R +/S /Div +>> +endobj +1345 0 obj +<< +/K 457 0 R +/P 1806 0 R +/S /Div +>> +endobj +1346 0 obj +<< +/K [459 0 R 458 0 R] +/P 1806 0 R +/S /Div +>> +endobj +1347 0 obj +<< +/K [461 0 R 460 0 R] +/P 1807 0 R +/S /Div +>> +endobj +1348 0 obj +<< +/K [463 0 R 462 0 R] +/P 1807 0 R +/S /Div +>> +endobj +1349 0 obj +<< +/K [465 0 R 464 0 R] +/P 1808 0 R +/S /Div +>> +endobj +1350 0 obj +<< +/K [467 0 R 466 0 R] +/P 1809 0 R +/S /Div +>> +endobj +1351 0 obj +<< +/K 468 0 R +/P 1810 0 R +/S /Div +>> +endobj +1352 0 obj +<< +/K [470 0 R 469 0 R] +/P 1811 0 R +/S /Div +>> +endobj +1353 0 obj +<< +/K [472 0 R 471 0 R] +/P 1809 0 R +/S /Div +>> +endobj +1354 0 obj +<< +/K [474 0 R 473 0 R] +/P 1809 0 R +/S /Div +>> +endobj +1355 0 obj +<< +/K [476 0 R 475 0 R] +/P 1809 0 R +/S /Div +>> +endobj +1356 0 obj +<< +/K [478 0 R 477 0 R] +/P 1809 0 R +/S /Div +>> +endobj +1357 0 obj +<< +/K [480 0 R 479 0 R] +/P 1809 0 R +/S /Div +>> +endobj +1358 0 obj +<< +/K 481 0 R +/P 1812 0 R +/S /Div +>> +endobj +1359 0 obj +<< +/K 482 0 R +/P 1813 0 R +/S /Div +>> +endobj +1360 0 obj +<< +/K [484 0 R 483 0 R] +/P 1813 0 R +/S /Div +>> +endobj +1361 0 obj +<< +/K [486 0 R 485 0 R] +/P 1814 0 R +/S /Div +>> +endobj +1362 0 obj +<< +/K [488 0 R 487 0 R] +/P 1814 0 R +/S /Div +>> +endobj +1363 0 obj +<< +/K [490 0 R 489 0 R] +/P 1815 0 R +/S /Div +>> +endobj +1364 0 obj +<< +/K [492 0 R 491 0 R] +/P 1816 0 R +/S /Div +>> +endobj +1365 0 obj +<< +/K [494 0 R 493 0 R] +/P 1817 0 R +/S /Div +>> +endobj +1366 0 obj +<< +/K [496 0 R 495 0 R] +/P 1818 0 R +/S /Div +>> +endobj +1367 0 obj +<< +/K [498 0 R 497 0 R] +/P 1816 0 R +/S /Div +>> +endobj +1368 0 obj +<< +/K [500 0 R 499 0 R] +/P 1816 0 R +/S /Div +>> +endobj +1369 0 obj +<< +/K [502 0 R 501 0 R] +/P 1816 0 R +/S /Div +>> +endobj +1370 0 obj +<< +/K [504 0 R 503 0 R] +/P 1816 0 R +/S /Div +>> +endobj +1371 0 obj +<< +/K [506 0 R 505 0 R] +/P 1816 0 R +/S /Div +>> +endobj +1372 0 obj +<< +/K 507 0 R +/P 1819 0 R +/S /Div +>> +endobj +1373 0 obj +<< +/K [509 0 R 508 0 R] +/P 1820 0 R +/S /Div +>> +endobj +1374 0 obj +<< +/K [511 0 R 510 0 R] +/P 1820 0 R +/S /Div +>> +endobj +1375 0 obj +<< +/K [513 0 R 512 0 R] +/P 1821 0 R +/S /Div +>> +endobj +1376 0 obj +<< +/K [515 0 R 514 0 R] +/P 1822 0 R +/S /Div +>> +endobj +1377 0 obj +<< +/K [517 0 R 516 0 R] +/P 1823 0 R +/S /Div +>> +endobj +1378 0 obj +<< +/K [519 0 R 518 0 R] +/P 1824 0 R +/S /Div +>> +endobj +1379 0 obj +<< +/K [521 0 R 520 0 R] +/P 1822 0 R +/S /Div +>> +endobj +1380 0 obj +<< +/K [523 0 R 522 0 R] +/P 1822 0 R +/S /Div +>> +endobj +1381 0 obj +<< +/K [525 0 R 524 0 R] +/P 1822 0 R +/S /Div +>> +endobj +1382 0 obj +<< +/K [527 0 R 526 0 R] +/P 1822 0 R +/S /Div +>> +endobj +1383 0 obj +<< +/K [529 0 R 528 0 R] +/P 1822 0 R +/S /Div +>> +endobj +1384 0 obj +<< +/K 530 0 R +/P 1825 0 R +/S /Div +>> +endobj +1385 0 obj +<< +/K [532 0 R 531 0 R] +/P 1826 0 R +/S /Div +>> +endobj +1386 0 obj +<< +/K [534 0 R 533 0 R] +/P 1826 0 R +/S /Div +>> +endobj +1387 0 obj +<< +/K [536 0 R 535 0 R] +/P 1827 0 R +/S /Div +>> +endobj +1388 0 obj +<< +/K [538 0 R 537 0 R] +/P 1828 0 R +/S /Div +>> +endobj +1389 0 obj +<< +/K [540 0 R 539 0 R] +/P 1829 0 R +/S /Div +>> +endobj +1390 0 obj +<< +/K [542 0 R 541 0 R] +/P 1830 0 R +/S /Div +>> +endobj +1391 0 obj +<< +/K [544 0 R 543 0 R] +/P 1828 0 R +/S /Div +>> +endobj +1392 0 obj +<< +/K [546 0 R 545 0 R] +/P 1828 0 R +/S /Div +>> +endobj +1393 0 obj +<< +/K [548 0 R 547 0 R] +/P 1828 0 R +/S /Div +>> +endobj +1394 0 obj +<< +/K [550 0 R 549 0 R] +/P 1828 0 R +/S /Div +>> +endobj +1395 0 obj +<< +/K [552 0 R 551 0 R] +/P 1828 0 R +/S /Div +>> +endobj +1396 0 obj +<< +/K 553 0 R +/P 1831 0 R +/S /Div +>> +endobj +1397 0 obj +<< +/K [555 0 R 554 0 R] +/P 1832 0 R +/S /Div +>> +endobj +1398 0 obj +<< +/K [557 0 R 556 0 R] +/P 1832 0 R +/S /Div +>> +endobj +1399 0 obj +<< +/K [559 0 R 558 0 R] +/P 1833 0 R +/S /Div +>> +endobj +1400 0 obj +<< +/K [561 0 R 560 0 R] +/P 1834 0 R +/S /Div +>> +endobj +1401 0 obj +<< +/K [563 0 R 562 0 R] +/P 1835 0 R +/S /Div +>> +endobj +1402 0 obj +<< +/K [565 0 R 564 0 R] +/P 1836 0 R +/S /Div +>> +endobj +1403 0 obj +<< +/K [567 0 R 566 0 R] +/P 1834 0 R +/S /Div +>> +endobj +1404 0 obj +<< +/K [569 0 R 568 0 R] +/P 1834 0 R +/S /Div +>> +endobj +1405 0 obj +<< +/K [571 0 R 570 0 R] +/P 1834 0 R +/S /Div +>> +endobj +1406 0 obj +<< +/K [573 0 R 572 0 R] +/P 1834 0 R +/S /Div +>> +endobj +1407 0 obj +<< +/K [575 0 R 574 0 R] +/P 1834 0 R +/S /Div +>> +endobj +1408 0 obj +<< +/K 576 0 R +/P 1837 0 R +/S /Div +>> +endobj +1409 0 obj +<< +/K [578 0 R 577 0 R] +/P 1838 0 R +/S /Div +>> +endobj +1410 0 obj +<< +/K [580 0 R 579 0 R] +/P 1838 0 R +/S /Div +>> +endobj +1411 0 obj +<< +/K [582 0 R 581 0 R] +/P 1839 0 R +/S /Div +>> +endobj +1412 0 obj +<< +/K [584 0 R 583 0 R] +/P 1840 0 R +/S /Div +>> +endobj +1413 0 obj +<< +/K [586 0 R 585 0 R] +/P 1841 0 R +/S /Div +>> +endobj +1414 0 obj +<< +/K [588 0 R 587 0 R] +/P 1842 0 R +/S /Div +>> +endobj +1415 0 obj +<< +/K [590 0 R 589 0 R] +/P 1840 0 R +/S /Div +>> +endobj +1416 0 obj +<< +/K [592 0 R 591 0 R] +/P 1840 0 R +/S /Div +>> +endobj +1417 0 obj +<< +/K [594 0 R 593 0 R] +/P 1840 0 R +/S /Div +>> +endobj +1418 0 obj +<< +/K [596 0 R 595 0 R] +/P 1840 0 R +/S /Div +>> +endobj +1419 0 obj +<< +/K [598 0 R 597 0 R] +/P 1840 0 R +/S /Div +>> +endobj +1420 0 obj +<< +/K 599 0 R +/P 1843 0 R +/S /Div +>> +endobj +1421 0 obj +<< +/K [601 0 R 600 0 R] +/P 1844 0 R +/S /Div +>> +endobj +1422 0 obj +<< +/K [603 0 R 602 0 R] +/P 1844 0 R +/S /Div +>> +endobj +1423 0 obj +<< +/K [605 0 R 604 0 R] +/P 1845 0 R +/S /Div +>> +endobj +1424 0 obj +<< +/K [607 0 R 606 0 R] +/P 1846 0 R +/S /Div +>> +endobj +1425 0 obj +<< +/K [609 0 R 608 0 R] +/P 1847 0 R +/S /Div +>> +endobj +1426 0 obj +<< +/K [611 0 R 610 0 R] +/P 1848 0 R +/S /Div +>> +endobj +1427 0 obj +<< +/K [613 0 R 612 0 R] +/P 1846 0 R +/S /Div +>> +endobj +1428 0 obj +<< +/K [615 0 R 614 0 R] +/P 1846 0 R +/S /Div +>> +endobj +1429 0 obj +<< +/K [617 0 R 616 0 R] +/P 1846 0 R +/S /Div +>> +endobj +1430 0 obj +<< +/K [619 0 R 618 0 R] +/P 1846 0 R +/S /Div +>> +endobj +1431 0 obj +<< +/K [621 0 R 620 0 R] +/P 1846 0 R +/S /Div +>> +endobj +1432 0 obj +<< +/K 622 0 R +/P 1849 0 R +/S /Div +>> +endobj +1433 0 obj +<< +/K [624 0 R 623 0 R] +/P 1850 0 R +/S /Div +>> +endobj +1434 0 obj +<< +/K [626 0 R 625 0 R] +/P 1850 0 R +/S /Div +>> +endobj +1435 0 obj +<< +/K [628 0 R 627 0 R] +/P 1851 0 R +/S /Div +>> +endobj +1436 0 obj +<< +/K [630 0 R 629 0 R] +/P 1852 0 R +/S /Div +>> +endobj +1437 0 obj +<< +/K [632 0 R 631 0 R] +/P 1853 0 R +/S /Div +>> +endobj +1438 0 obj +<< +/K [634 0 R 633 0 R] +/P 1854 0 R +/S /Div +>> +endobj +1439 0 obj +<< +/K [636 0 R 635 0 R] +/P 1852 0 R +/S /Div +>> +endobj +1440 0 obj +<< +/K [638 0 R 637 0 R] +/P 1852 0 R +/S /Div +>> +endobj +1441 0 obj +<< +/K [640 0 R 639 0 R] +/P 1852 0 R +/S /Div +>> +endobj +1442 0 obj +<< +/K [642 0 R 641 0 R] +/P 1852 0 R +/S /Div +>> +endobj +1443 0 obj +<< +/K [644 0 R 643 0 R] +/P 1852 0 R +/S /Div +>> +endobj +1444 0 obj +<< +/K 645 0 R +/P 1855 0 R +/S /Div +>> +endobj +1445 0 obj +<< +/K [647 0 R 646 0 R] +/P 1856 0 R +/S /Div +>> +endobj +1446 0 obj +<< +/K [649 0 R 648 0 R] +/P 1856 0 R +/S /Div +>> +endobj +1447 0 obj +<< +/K [651 0 R 650 0 R] +/P 1857 0 R +/S /Div +>> +endobj +1448 0 obj +<< +/K [653 0 R 652 0 R] +/P 1858 0 R +/S /Div +>> +endobj +1449 0 obj +<< +/K [655 0 R 654 0 R] +/P 1859 0 R +/S /Div +>> +endobj +1450 0 obj +<< +/K [657 0 R 656 0 R] +/P 1860 0 R +/S /Div +>> +endobj +1451 0 obj +<< +/K [659 0 R 658 0 R] +/P 1858 0 R +/S /Div +>> +endobj +1452 0 obj +<< +/K [661 0 R 660 0 R] +/P 1858 0 R +/S /Div +>> +endobj +1453 0 obj +<< +/K [663 0 R 662 0 R] +/P 1858 0 R +/S /Div +>> +endobj +1454 0 obj +<< +/K [665 0 R 664 0 R] +/P 1858 0 R +/S /Div +>> +endobj +1455 0 obj +<< +/K [667 0 R 666 0 R] +/P 1858 0 R +/S /Div +>> +endobj +1456 0 obj +<< +/K 668 0 R +/P 1861 0 R +/S /Div +>> +endobj +1457 0 obj +<< +/K [670 0 R 669 0 R] +/P 1862 0 R +/S /Div +>> +endobj +1458 0 obj +<< +/K [672 0 R 671 0 R] +/P 1862 0 R +/S /Div +>> +endobj +1459 0 obj +<< +/K [674 0 R 673 0 R] +/P 1863 0 R +/S /Div +>> +endobj +1460 0 obj +<< +/K [676 0 R 675 0 R] +/P 1864 0 R +/S /Div +>> +endobj +1461 0 obj +<< +/K [678 0 R 677 0 R] +/P 1865 0 R +/S /Div +>> +endobj +1462 0 obj +<< +/K [680 0 R 679 0 R] +/P 1866 0 R +/S /Div +>> +endobj +1463 0 obj +<< +/K [682 0 R 681 0 R] +/P 1864 0 R +/S /Div +>> +endobj +1464 0 obj +<< +/K [684 0 R 683 0 R] +/P 1864 0 R +/S /Div +>> +endobj +1465 0 obj +<< +/K [686 0 R 685 0 R] +/P 1864 0 R +/S /Div +>> +endobj +1466 0 obj +<< +/K [688 0 R 687 0 R] +/P 1864 0 R +/S /Div +>> +endobj +1467 0 obj +<< +/K [690 0 R 689 0 R] +/P 1864 0 R +/S /Div +>> +endobj +1468 0 obj +<< +/K 691 0 R +/P 1867 0 R +/S /Div +>> +endobj +1469 0 obj +<< +/K [693 0 R 692 0 R] +/P 1868 0 R +/S /Div +>> +endobj +1470 0 obj +<< +/K [695 0 R 694 0 R] +/P 1868 0 R +/S /Div +>> +endobj +1471 0 obj +<< +/K [697 0 R 696 0 R] +/P 1869 0 R +/S /Div +>> +endobj +1472 0 obj +<< +/K [699 0 R 698 0 R] +/P 1870 0 R +/S /Div +>> +endobj +1473 0 obj +<< +/K [701 0 R 700 0 R] +/P 1871 0 R +/S /Div +>> +endobj +1474 0 obj +<< +/K [703 0 R 702 0 R] +/P 1872 0 R +/S /Div +>> +endobj +1475 0 obj +<< +/K [705 0 R 704 0 R] +/P 1870 0 R +/S /Div +>> +endobj +1476 0 obj +<< +/K [707 0 R 706 0 R] +/P 1870 0 R +/S /Div +>> +endobj +1477 0 obj +<< +/K [709 0 R 708 0 R] +/P 1870 0 R +/S /Div +>> +endobj +1478 0 obj +<< +/K [711 0 R 710 0 R] +/P 1870 0 R +/S /Div +>> +endobj +1479 0 obj +<< +/K [713 0 R 712 0 R] +/P 1870 0 R +/S /Div +>> +endobj +1480 0 obj +<< +/K 714 0 R +/P 1873 0 R +/S /Div +>> +endobj +1481 0 obj +<< +/K [716 0 R 715 0 R] +/P 1874 0 R +/S /Div +>> +endobj +1482 0 obj +<< +/K [718 0 R 717 0 R] +/P 1874 0 R +/S /Div +>> +endobj +1483 0 obj +<< +/K [720 0 R 719 0 R] +/P 1875 0 R +/S /Div +>> +endobj +1484 0 obj +<< +/K [722 0 R 721 0 R] +/P 1876 0 R +/S /Div +>> +endobj +1485 0 obj +<< +/K [724 0 R 723 0 R] +/P 1877 0 R +/S /Div +>> +endobj +1486 0 obj +<< +/K [726 0 R 725 0 R] +/P 1878 0 R +/S /Div +>> +endobj +1487 0 obj +<< +/K [728 0 R 727 0 R] +/P 1876 0 R +/S /Div +>> +endobj +1488 0 obj +<< +/K [730 0 R 729 0 R] +/P 1876 0 R +/S /Div +>> +endobj +1489 0 obj +<< +/K [732 0 R 731 0 R] +/P 1876 0 R +/S /Div +>> +endobj +1490 0 obj +<< +/K [734 0 R 733 0 R] +/P 1876 0 R +/S /Div +>> +endobj +1491 0 obj +<< +/K [736 0 R 735 0 R] +/P 1876 0 R +/S /Div +>> +endobj +1492 0 obj +<< +/K 737 0 R +/P 1879 0 R +/S /Div +>> +endobj +1493 0 obj +<< +/K [739 0 R 738 0 R] +/P 1880 0 R +/S /Div +>> +endobj +1494 0 obj +<< +/K [741 0 R 740 0 R] +/P 1880 0 R +/S /Div +>> +endobj +1495 0 obj +<< +/K [743 0 R 742 0 R] +/P 1881 0 R +/S /Div +>> +endobj +1496 0 obj +<< +/K [745 0 R 744 0 R] +/P 1097 0 R +/S /Div +>> +endobj +1497 0 obj +<< +/K 746 0 R +/P 1097 0 R +/S /Div +>> +endobj +1498 0 obj +<< +/K 747 0 R +/P 1691 0 R +/S /Div +>> +endobj +1499 0 obj +<< +/K 748 0 R +/P 1691 0 R +/S /Div +>> +endobj +1500 0 obj +<< +/K 749 0 R +/P 1098 0 R +/S /Div +>> +endobj +1501 0 obj +<< +/K [751 0 R 750 0 R] +/P 1100 0 R +/S /Div +>> +endobj +1502 0 obj +<< +/K [753 0 R 752 0 R] +/P 1694 0 R +/S /Div +>> +endobj +1503 0 obj +<< +/K [755 0 R 754 0 R] +/P 1882 0 R +/S /Div +>> +endobj +1504 0 obj +<< +/K 756 0 R +/P 1882 0 R +/S /Div +>> +endobj +1505 0 obj +<< +/K 757 0 R +/P 1882 0 R +/S /Div +>> +endobj +1506 0 obj +<< +/K [759 0 R 758 0 R] +/P 1883 0 R +/S /Div +>> +endobj +1507 0 obj +<< +/K 760 0 R +/P 1883 0 R +/S /Div +>> +endobj +1508 0 obj +<< +/K 761 0 R +/P 1883 0 R +/S /Div +>> +endobj +1509 0 obj +<< +/K 762 0 R +/P 1883 0 R +/S /Div +>> +endobj +1510 0 obj +<< +/K 763 0 R +/P 1883 0 R +/S /Div +>> +endobj +1511 0 obj +<< +/K 764 0 R +/P 1883 0 R +/S /Div +>> +endobj +1512 0 obj +<< +/K 765 0 R +/P 1883 0 R +/S /Div +>> +endobj +1513 0 obj +<< +/K 766 0 R +/P 1883 0 R +/S /Div +>> +endobj +1514 0 obj +<< +/K [768 0 R 767 0 R] +/P 1884 0 R +/S /Div +>> +endobj +1515 0 obj +<< +/K [770 0 R 769 0 R] +/P 1885 0 R +/S /Div +>> +endobj +1516 0 obj +<< +/K [772 0 R 771 0 R] +/P 1886 0 R +/S /Div +>> +endobj +1517 0 obj +<< +/K [774 0 R 773 0 R] +/P 1884 0 R +/S /Div +>> +endobj +1518 0 obj +<< +/K [776 0 R 775 0 R] +/P 1884 0 R +/S /Div +>> +endobj +1519 0 obj +<< +/K [778 0 R 777 0 R] +/P 1884 0 R +/S /Div +>> +endobj +1520 0 obj +<< +/K [780 0 R 779 0 R] +/P 1884 0 R +/S /Div +>> +endobj +1521 0 obj +<< +/K [782 0 R 781 0 R] +/P 1884 0 R +/S /Div +>> +endobj +1522 0 obj +<< +/K 783 0 R +/P 1887 0 R +/S /Div +>> +endobj +1523 0 obj +<< +/K [785 0 R 784 0 R] +/P 1888 0 R +/S /Div +>> +endobj +1524 0 obj +<< +/K [787 0 R 786 0 R] +/P 1888 0 R +/S /Div +>> +endobj +1525 0 obj +<< +/K [789 0 R 788 0 R] +/P 1889 0 R +/S /Div +>> +endobj +1526 0 obj +<< +/K [791 0 R 790 0 R] +/P 1890 0 R +/S /Div +>> +endobj +1527 0 obj +<< +/K [793 0 R 792 0 R] +/P 1891 0 R +/S /Div +>> +endobj +1528 0 obj +<< +/K [795 0 R 794 0 R] +/P 1892 0 R +/S /Div +>> +endobj +1529 0 obj +<< +/K [797 0 R 796 0 R] +/P 1890 0 R +/S /Div +>> +endobj +1530 0 obj +<< +/K [799 0 R 798 0 R] +/P 1890 0 R +/S /Div +>> +endobj +1531 0 obj +<< +/K [801 0 R 800 0 R] +/P 1890 0 R +/S /Div +>> +endobj +1532 0 obj +<< +/K [803 0 R 802 0 R] +/P 1890 0 R +/S /Div +>> +endobj +1533 0 obj +<< +/K [805 0 R 804 0 R] +/P 1890 0 R +/S /Div +>> +endobj +1534 0 obj +<< +/K 806 0 R +/P 1893 0 R +/S /Div +>> +endobj +1535 0 obj +<< +/K [808 0 R 807 0 R] +/P 1894 0 R +/S /Div +>> +endobj +1536 0 obj +<< +/K [810 0 R 809 0 R] +/P 1894 0 R +/S /Div +>> +endobj +1537 0 obj +<< +/K [812 0 R 811 0 R] +/P 1895 0 R +/S /Div +>> +endobj +1538 0 obj +<< +/K [814 0 R 813 0 R] +/P 1896 0 R +/S /Div +>> +endobj +1539 0 obj +<< +/K [816 0 R 815 0 R] +/P 1897 0 R +/S /Div +>> +endobj +1540 0 obj +<< +/K [818 0 R 817 0 R] +/P 1898 0 R +/S /Div +>> +endobj +1541 0 obj +<< +/K [820 0 R 819 0 R] +/P 1896 0 R +/S /Div +>> +endobj +1542 0 obj +<< +/K [822 0 R 821 0 R] +/P 1896 0 R +/S /Div +>> +endobj +1543 0 obj +<< +/K [824 0 R 823 0 R] +/P 1896 0 R +/S /Div +>> +endobj +1544 0 obj +<< +/K [826 0 R 825 0 R] +/P 1896 0 R +/S /Div +>> +endobj +1545 0 obj +<< +/K [828 0 R 827 0 R] +/P 1896 0 R +/S /Div +>> +endobj +1546 0 obj +<< +/K 829 0 R +/P 1899 0 R +/S /Div +>> +endobj +1547 0 obj +<< +/K [831 0 R 830 0 R] +/P 1900 0 R +/S /Div +>> +endobj +1548 0 obj +<< +/K [833 0 R 832 0 R] +/P 1900 0 R +/S /Div +>> +endobj +1549 0 obj +<< +/K [835 0 R 834 0 R] +/P 1901 0 R +/S /Div +>> +endobj +1550 0 obj +<< +/K [837 0 R 836 0 R] +/P 1902 0 R +/S /Div +>> +endobj +1551 0 obj +<< +/K [839 0 R 838 0 R] +/P 1903 0 R +/S /Div +>> +endobj +1552 0 obj +<< +/K [841 0 R 840 0 R] +/P 1904 0 R +/S /Div +>> +endobj +1553 0 obj +<< +/K [843 0 R 842 0 R] +/P 1902 0 R +/S /Div +>> +endobj +1554 0 obj +<< +/K [845 0 R 844 0 R] +/P 1902 0 R +/S /Div +>> +endobj +1555 0 obj +<< +/K [847 0 R 846 0 R] +/P 1902 0 R +/S /Div +>> +endobj +1556 0 obj +<< +/K [849 0 R 848 0 R] +/P 1902 0 R +/S /Div +>> +endobj +1557 0 obj +<< +/K [851 0 R 850 0 R] +/P 1902 0 R +/S /Div +>> +endobj +1558 0 obj +<< +/K 852 0 R +/P 1905 0 R +/S /Div +>> +endobj +1559 0 obj +<< +/K [854 0 R 853 0 R] +/P 1906 0 R +/S /Div +>> +endobj +1560 0 obj +<< +/K [856 0 R 855 0 R] +/P 1906 0 R +/S /Div +>> +endobj +1561 0 obj +<< +/K [858 0 R 857 0 R] +/P 1907 0 R +/S /Div +>> +endobj +1562 0 obj +<< +/K [860 0 R 859 0 R] +/P 1908 0 R +/S /Div +>> +endobj +1563 0 obj +<< +/K [862 0 R 861 0 R] +/P 1909 0 R +/S /Div +>> +endobj +1564 0 obj +<< +/K [864 0 R 863 0 R] +/P 1910 0 R +/S /Div +>> +endobj +1565 0 obj +<< +/K [866 0 R 865 0 R] +/P 1908 0 R +/S /Div +>> +endobj +1566 0 obj +<< +/K [868 0 R 867 0 R] +/P 1908 0 R +/S /Div +>> +endobj +1567 0 obj +<< +/K [870 0 R 869 0 R] +/P 1908 0 R +/S /Div +>> +endobj +1568 0 obj +<< +/K [872 0 R 871 0 R] +/P 1908 0 R +/S /Div +>> +endobj +1569 0 obj +<< +/K [874 0 R 873 0 R] +/P 1908 0 R +/S /Div +>> +endobj +1570 0 obj +<< +/K 875 0 R +/P 1911 0 R +/S /Div +>> +endobj +1571 0 obj +<< +/K [877 0 R 876 0 R] +/P 1912 0 R +/S /Div +>> +endobj +1572 0 obj +<< +/K [879 0 R 878 0 R] +/P 1912 0 R +/S /Div +>> +endobj +1573 0 obj +<< +/K [881 0 R 880 0 R] +/P 1913 0 R +/S /Div +>> +endobj +1574 0 obj +<< +/K [883 0 R 882 0 R] +/P 1914 0 R +/S /Div +>> +endobj +1575 0 obj +<< +/K [885 0 R 884 0 R] +/P 1915 0 R +/S /Div +>> +endobj +1576 0 obj +<< +/K [887 0 R 886 0 R] +/P 1916 0 R +/S /Div +>> +endobj +1577 0 obj +<< +/K [889 0 R 888 0 R] +/P 1914 0 R +/S /Div +>> +endobj +1578 0 obj +<< +/K [891 0 R 890 0 R] +/P 1914 0 R +/S /Div +>> +endobj +1579 0 obj +<< +/K [893 0 R 892 0 R] +/P 1914 0 R +/S /Div +>> +endobj +1580 0 obj +<< +/K [895 0 R 894 0 R] +/P 1914 0 R +/S /Div +>> +endobj +1581 0 obj +<< +/K [897 0 R 896 0 R] +/P 1914 0 R +/S /Div +>> +endobj +1582 0 obj +<< +/K 898 0 R +/P 1917 0 R +/S /Div +>> +endobj +1583 0 obj +<< +/K [900 0 R 899 0 R] +/P 1918 0 R +/S /Div +>> +endobj +1584 0 obj +<< +/K [902 0 R 901 0 R] +/P 1918 0 R +/S /Div +>> +endobj +1585 0 obj +<< +/K [904 0 R 903 0 R] +/P 1919 0 R +/S /Div +>> +endobj +1586 0 obj +<< +/K [906 0 R 905 0 R] +/P 1920 0 R +/S /Div +>> +endobj +1587 0 obj +<< +/K [908 0 R 907 0 R] +/P 1921 0 R +/S /Div +>> +endobj +1588 0 obj +<< +/K [910 0 R 909 0 R] +/P 1922 0 R +/S /Div +>> +endobj +1589 0 obj +<< +/K [912 0 R 911 0 R] +/P 1920 0 R +/S /Div +>> +endobj +1590 0 obj +<< +/K [914 0 R 913 0 R] +/P 1920 0 R +/S /Div +>> +endobj +1591 0 obj +<< +/K [916 0 R 915 0 R] +/P 1920 0 R +/S /Div +>> +endobj +1592 0 obj +<< +/K [918 0 R 917 0 R] +/P 1920 0 R +/S /Div +>> +endobj +1593 0 obj +<< +/K [920 0 R 919 0 R] +/P 1920 0 R +/S /Div +>> +endobj +1594 0 obj +<< +/K 921 0 R +/P 1923 0 R +/S /Div +>> +endobj +1595 0 obj +<< +/K [923 0 R 922 0 R] +/P 1924 0 R +/S /Div +>> +endobj +1596 0 obj +<< +/K [925 0 R 924 0 R] +/P 1924 0 R +/S /Div +>> +endobj +1597 0 obj +<< +/K [927 0 R 926 0 R] +/P 1925 0 R +/S /Div +>> +endobj +1598 0 obj +<< +/K [929 0 R 928 0 R] +/P 1926 0 R +/S /Div +>> +endobj +1599 0 obj +<< +/K [931 0 R 930 0 R] +/P 1927 0 R +/S /Div +>> +endobj +1600 0 obj +<< +/K [933 0 R 932 0 R] +/P 1928 0 R +/S /Div +>> +endobj +1601 0 obj +<< +/K [935 0 R 934 0 R] +/P 1926 0 R +/S /Div +>> +endobj +1602 0 obj +<< +/K [937 0 R 936 0 R] +/P 1926 0 R +/S /Div +>> +endobj +1603 0 obj +<< +/K [939 0 R 938 0 R] +/P 1926 0 R +/S /Div +>> +endobj +1604 0 obj +<< +/K [941 0 R 940 0 R] +/P 1926 0 R +/S /Div +>> +endobj +1605 0 obj +<< +/K [943 0 R 942 0 R] +/P 1926 0 R +/S /Div +>> +endobj +1606 0 obj +<< +/K 944 0 R +/P 1929 0 R +/S /Div +>> +endobj +1607 0 obj +<< +/K [946 0 R 945 0 R] +/P 1930 0 R +/S /Div +>> +endobj +1608 0 obj +<< +/K [948 0 R 947 0 R] +/P 1930 0 R +/S /Div +>> +endobj +1609 0 obj +<< +/K [950 0 R 949 0 R] +/P 1931 0 R +/S /Div +>> +endobj +1610 0 obj +<< +/K [952 0 R 951 0 R] +/P 1932 0 R +/S /Div +>> +endobj +1611 0 obj +<< +/K [954 0 R 953 0 R] +/P 1933 0 R +/S /Div +>> +endobj +1612 0 obj +<< +/K [956 0 R 955 0 R] +/P 1934 0 R +/S /Div +>> +endobj +1613 0 obj +<< +/K [958 0 R 957 0 R] +/P 1932 0 R +/S /Div +>> +endobj +1614 0 obj +<< +/K [960 0 R 959 0 R] +/P 1932 0 R +/S /Div +>> +endobj +1615 0 obj +<< +/K [962 0 R 961 0 R] +/P 1932 0 R +/S /Div +>> +endobj +1616 0 obj +<< +/K [964 0 R 963 0 R] +/P 1932 0 R +/S /Div +>> +endobj +1617 0 obj +<< +/K [966 0 R 965 0 R] +/P 1932 0 R +/S /Div +>> +endobj +1618 0 obj +<< +/K 967 0 R +/P 1935 0 R +/S /Div +>> +endobj +1619 0 obj +<< +/K [969 0 R 968 0 R] +/P 1936 0 R +/S /Div +>> +endobj +1620 0 obj +<< +/K [971 0 R 970 0 R] +/P 1936 0 R +/S /Div +>> +endobj +1621 0 obj +<< +/K [973 0 R 972 0 R] +/P 1937 0 R +/S /Div +>> +endobj +1622 0 obj +<< +/K [975 0 R 974 0 R] +/P 1938 0 R +/S /Div +>> +endobj +1623 0 obj +<< +/K [977 0 R 976 0 R] +/P 1939 0 R +/S /Div +>> +endobj +1624 0 obj +<< +/K [979 0 R 978 0 R] +/P 1940 0 R +/S /Div +>> +endobj +1625 0 obj +<< +/K [981 0 R 980 0 R] +/P 1938 0 R +/S /Div +>> +endobj +1626 0 obj +<< +/K [983 0 R 982 0 R] +/P 1938 0 R +/S /Div +>> +endobj +1627 0 obj +<< +/K [985 0 R 984 0 R] +/P 1938 0 R +/S /Div +>> +endobj +1628 0 obj +<< +/K [987 0 R 986 0 R] +/P 1938 0 R +/S /Div +>> +endobj +1629 0 obj +<< +/K [989 0 R 988 0 R] +/P 1938 0 R +/S /Div +>> +endobj +1630 0 obj +<< +/K 990 0 R +/P 1941 0 R +/S /Div +>> +endobj +1631 0 obj +<< +/K [992 0 R 991 0 R] +/P 1942 0 R +/S /Div +>> +endobj +1632 0 obj +<< +/K 993 0 R +/P 1942 0 R +/S /Div +>> +endobj +1633 0 obj +<< +/K 994 0 R +/P 1942 0 R +/S /Div +>> +endobj +1634 0 obj +<< +/K 995 0 R +/P 1942 0 R +/S /Div +>> +endobj +1635 0 obj +<< +/K [997 0 R 996 0 R] +/P 1943 0 R +/S /Div +>> +endobj +1636 0 obj +<< +/K [999 0 R 998 0 R] +/P 1943 0 R +/S /Div +>> +endobj +1637 0 obj +<< +/K [1001 0 R 1000 0 R] +/P 1944 0 R +/S /Div +>> +endobj +1638 0 obj +<< +/K [1003 0 R 1002 0 R] +/P 1945 0 R +/S /Div +>> +endobj +1639 0 obj +<< +/K [1005 0 R 1004 0 R] +/P 1946 0 R +/S /Div +>> +endobj +1640 0 obj +<< +/K [1007 0 R 1006 0 R] +/P 1947 0 R +/S /Div +>> +endobj +1641 0 obj +<< +/K [1009 0 R 1008 0 R] +/P 1945 0 R +/S /Div +>> +endobj +1642 0 obj +<< +/K [1011 0 R 1010 0 R] +/P 1945 0 R +/S /Div +>> +endobj +1643 0 obj +<< +/K [1013 0 R 1012 0 R] +/P 1945 0 R +/S /Div +>> +endobj +1644 0 obj +<< +/K [1015 0 R 1014 0 R] +/P 1945 0 R +/S /Div +>> +endobj +1645 0 obj +<< +/K [1017 0 R 1016 0 R] +/P 1945 0 R +/S /Div +>> +endobj +1646 0 obj +<< +/K 1018 0 R +/P 1948 0 R +/S /Div +>> +endobj +1647 0 obj +<< +/K [1020 0 R 1019 0 R] +/P 1949 0 R +/S /Div +>> +endobj +1648 0 obj +<< +/K [1022 0 R 1021 0 R] +/P 1949 0 R +/S /Div +>> +endobj +1649 0 obj +<< +/K [1024 0 R 1023 0 R] +/P 1950 0 R +/S /Div +>> +endobj +1650 0 obj +<< +/K [1026 0 R 1025 0 R] +/P 1951 0 R +/S /Div +>> +endobj +1651 0 obj +<< +/K [1028 0 R 1027 0 R] +/P 1952 0 R +/S /Div +>> +endobj +1652 0 obj +<< +/K [1030 0 R 1029 0 R] +/P 1953 0 R +/S /Div +>> +endobj +1653 0 obj +<< +/K [1032 0 R 1031 0 R] +/P 1951 0 R +/S /Div +>> +endobj +1654 0 obj +<< +/K [1034 0 R 1033 0 R] +/P 1951 0 R +/S /Div +>> +endobj +1655 0 obj +<< +/K [1036 0 R 1035 0 R] +/P 1951 0 R +/S /Div +>> +endobj +1656 0 obj +<< +/K [1038 0 R 1037 0 R] +/P 1951 0 R +/S /Div +>> +endobj +1657 0 obj +<< +/K [1040 0 R 1039 0 R] +/P 1951 0 R +/S /Div +>> +endobj +1658 0 obj +<< +/K 1041 0 R +/P 1954 0 R +/S /Div +>> +endobj +1659 0 obj +<< +/K [1043 0 R 1042 0 R] +/P 1955 0 R +/S /Div +>> +endobj +1660 0 obj +<< +/K [1045 0 R 1044 0 R] +/P 1955 0 R +/S /Div +>> +endobj +1661 0 obj +<< +/K [1047 0 R 1046 0 R] +/P 1956 0 R +/S /Div +>> +endobj +1662 0 obj +<< +/K [1049 0 R 1048 0 R] +/P 1957 0 R +/S /Div +>> +endobj +1663 0 obj +<< +/K [1051 0 R 1050 0 R] +/P 1958 0 R +/S /Div +>> +endobj +1664 0 obj +<< +/K [1053 0 R 1052 0 R] +/P 1959 0 R +/S /Div +>> +endobj +1665 0 obj +<< +/K [1055 0 R 1054 0 R] +/P 1957 0 R +/S /Div +>> +endobj +1666 0 obj +<< +/K [1057 0 R 1056 0 R] +/P 1957 0 R +/S /Div +>> +endobj +1667 0 obj +<< +/K [1059 0 R 1058 0 R] +/P 1957 0 R +/S /Div +>> +endobj +1668 0 obj +<< +/K [1061 0 R 1060 0 R] +/P 1957 0 R +/S /Div +>> +endobj +1669 0 obj +<< +/K [1063 0 R 1062 0 R] +/P 1957 0 R +/S /Div +>> +endobj +1670 0 obj +<< +/K 1064 0 R +/P 1960 0 R +/S /Div +>> +endobj +1671 0 obj +<< +/K [1066 0 R 1065 0 R] +/P 1961 0 R +/S /Div +>> +endobj +1672 0 obj +<< +/K 1067 0 R +/P 1962 0 R +/S /Div +>> +endobj +1673 0 obj +<< +/K [1069 0 R 1068 0 R] +/P 1962 0 R +/S /Div +>> +endobj +1674 0 obj +<< +/K [1071 0 R 1070 0 R] +/P 1963 0 R +/S /Div +>> +endobj +1675 0 obj +<< +/K [1073 0 R 1072 0 R] +/P 1963 0 R +/S /Div +>> +endobj +1676 0 obj +<< +/K [1075 0 R 1074 0 R] +/P 1963 0 R +/S /Div +>> +endobj +1677 0 obj +<< +/K [1077 0 R 1076 0 R] +/P 1963 0 R +/S /Div +>> +endobj +1678 0 obj +<< +/K 1078 0 R +/P 1964 0 R +/S /Div +>> +endobj +1679 0 obj +<< +/K [1080 0 R 1079 0 R] +/P 1964 0 R +/S /Div +>> +endobj +1680 0 obj +<< +/K [1082 0 R 1081 0 R] +/P 1693 0 R +/S /Div +>> +endobj +1681 0 obj +<< +/K 1083 0 R +/P 1693 0 R +/S /Div +>> +endobj +1682 0 obj +<< +/Size 89654 +/CreationDate (D:20260122013740+01'00') +/ModDate (D:20260122013740+01'00') +>> +endobj +1683 0 obj +89654 +endobj +1684 0 obj +<< +/K [1086 0 R 1700 0 R] +/P 1965 0 R +/S /Table +>> +endobj +1685 0 obj +<< +/K [1965 0 R 1966 0 R] +/P 1090 0 R +/S /Sect +>> +endobj +1686 0 obj +<< +/K 1967 0 R +/P 1091 0 R +/S /Sect +>> +endobj +1687 0 obj +<< +/K 1105 0 R +/P 1092 0 R +/S /Sect +>> +endobj +1688 0 obj +<< +/K [1265 0 R 1266 0 R] +/P 1093 0 R +/S /Sect +>> +endobj +1689 0 obj +<< +/K 1968 0 R +/P 1095 0 R +/S /Sect +>> +endobj +1690 0 obj +<< +/K 1269 0 R +/P 1096 0 R +/S /Sect +>> +endobj +1691 0 obj +<< +/K [1498 0 R 1499 0 R] +/P 1097 0 R +/S /Sect +>> +endobj +1692 0 obj +<< +/K [1969 0 R 1970 0 R] +/P 1099 0 R +/S /Sect +>> +endobj +1693 0 obj +<< +/K [1680 0 R 1681 0 R] +/P 1099 0 R +/S /Sect +>> +endobj +1694 0 obj +<< +/K 1502 0 R +/P 1100 0 R +/S /Sect +>> +endobj +1695 0 obj +<< +/K 1106 0 R +/P 1696 0 R +/S /Sect +>> +endobj +1696 0 obj +<< +/K [1695 0 R 1107 0 R] +/P 1965 0 R +/S /Sect +>> +endobj +1697 0 obj +<< +/K [1108 0 R 1109 0 R 1698 0 R 1699 0 R] +/P 1965 0 R +/S /Sect +>> +endobj +1698 0 obj +<< +/K [1110 0 R 1111 0 R] +/P 1697 0 R +/S /Sect +>> +endobj +1699 0 obj +<< +/K 1112 0 R +/P 1697 0 R +/S /Sect +>> +endobj +1700 0 obj +<< +/K 1113 0 R +/P 1684 0 R +/S /TR +>> +endobj +1701 0 obj +<< +/K [1114 0 R 1115 0 R] +/P 1966 0 R +/S /Sect +>> +endobj +1702 0 obj +<< +/K [1116 0 R 1117 0 R 1118 0 R 1119 0 R] +/P 1971 0 R +/S /Sect +>> +endobj +1703 0 obj +<< +/K 1120 0 R +/P 1971 0 R +/S /Sect +>> +endobj +1704 0 obj +<< +/K [1121 0 R 1122 0 R 1123 0 R] +/P 1971 0 R +/S /Sect +>> +endobj +1705 0 obj +<< +/K 1124 0 R +/P 1971 0 R +/S /Sect +>> +endobj +1706 0 obj +<< +/K [1125 0 R 1126 0 R] +/P 1972 0 R +/S /Sect +>> +endobj +1707 0 obj +<< +/K 1127 0 R +/P 1972 0 R +/S /Sect +>> +endobj +1708 0 obj +<< +/K 1128 0 R +/P 1966 0 R +/S /Sect +>> +endobj +1709 0 obj +<< +/K [1129 0 R 1130 0 R 1131 0 R] +/P 1966 0 R +/S /Sect +>> +endobj +1710 0 obj +<< +/K [1132 0 R 1133 0 R 1134 0 R] +/P 1973 0 R +/S /Sect +>> +endobj +1711 0 obj +<< +/K [1135 0 R 1136 0 R 1137 0 R 1138 0 R 1139 0 R 1140 0 R 1141 0 R 1142 0 R] +/P 1973 0 R +/S /Sect +>> +endobj +1712 0 obj +<< +/K [1143 0 R 1144 0 R 1145 0 R] +/P 1974 0 R +/S /Sect +>> +endobj +1713 0 obj +<< +/K 1146 0 R +/P 1974 0 R +/S /Sect +>> +endobj +1714 0 obj +<< +/K [1974 0 R 1147 0 R 1148 0 R 1149 0 R 1715 0 R] +/P 1975 0 R +/S /Sect +>> +endobj +1715 0 obj +<< +/K 1150 0 R +/P 1714 0 R +/S /Sect +>> +endobj +1716 0 obj +<< +/K [1151 0 R 1152 0 R 1717 0 R] +/P 1976 0 R +/S /Sect +>> +endobj +1717 0 obj +<< +/K 1153 0 R +/P 1716 0 R +/S /Sect +>> +endobj +1718 0 obj +<< +/K [1154 0 R 1719 0 R 1720 0 R 1157 0 R 1158 0 R 1159 0 R 1160 0 R 1161 0 R] +/P 1976 0 R +/S /Sect +>> +endobj +1719 0 obj +<< +/K 1155 0 R +/P 1718 0 R +/S /Sect +>> +endobj +1720 0 obj +<< +/K 1156 0 R +/P 1718 0 R +/S /Sect +>> +endobj +1721 0 obj +<< +/K 1162 0 R +/P 1976 0 R +/S /Sect +>> +endobj +1722 0 obj +<< +/K [1163 0 R 1164 0 R 1723 0 R] +/P 1977 0 R +/S /Sect +>> +endobj +1723 0 obj +<< +/K 1165 0 R +/P 1722 0 R +/S /Sect +>> +endobj +1724 0 obj +<< +/K [1166 0 R 1725 0 R 1726 0 R 1169 0 R 1170 0 R 1171 0 R 1172 0 R 1173 0 R] +/P 1977 0 R +/S /Sect +>> +endobj +1725 0 obj +<< +/K 1167 0 R +/P 1724 0 R +/S /Sect +>> +endobj +1726 0 obj +<< +/K 1168 0 R +/P 1724 0 R +/S /Sect +>> +endobj +1727 0 obj +<< +/K 1174 0 R +/P 1977 0 R +/S /Sect +>> +endobj +1728 0 obj +<< +/K [1175 0 R 1176 0 R 1729 0 R] +/P 1978 0 R +/S /Sect +>> +endobj +1729 0 obj +<< +/K 1177 0 R +/P 1728 0 R +/S /Sect +>> +endobj +1730 0 obj +<< +/K [1178 0 R 1731 0 R 1732 0 R 1181 0 R 1182 0 R 1183 0 R 1184 0 R 1185 0 R] +/P 1978 0 R +/S /Sect +>> +endobj +1731 0 obj +<< +/K 1179 0 R +/P 1730 0 R +/S /Sect +>> +endobj +1732 0 obj +<< +/K 1180 0 R +/P 1730 0 R +/S /Sect +>> +endobj +1733 0 obj +<< +/K 1186 0 R +/P 1978 0 R +/S /Sect +>> +endobj +1734 0 obj +<< +/K [1187 0 R 1188 0 R 1735 0 R] +/P 1979 0 R +/S /Sect +>> +endobj +1735 0 obj +<< +/K 1189 0 R +/P 1734 0 R +/S /Sect +>> +endobj +1736 0 obj +<< +/K [1190 0 R 1737 0 R 1738 0 R 1193 0 R 1194 0 R 1195 0 R 1196 0 R 1197 0 R] +/P 1979 0 R +/S /Sect +>> +endobj +1737 0 obj +<< +/K 1191 0 R +/P 1736 0 R +/S /Sect +>> +endobj +1738 0 obj +<< +/K 1192 0 R +/P 1736 0 R +/S /Sect +>> +endobj +1739 0 obj +<< +/K 1198 0 R +/P 1979 0 R +/S /Sect +>> +endobj +1740 0 obj +<< +/K [1199 0 R 1200 0 R 1741 0 R] +/P 1980 0 R +/S /Sect +>> +endobj +1741 0 obj +<< +/K 1201 0 R +/P 1740 0 R +/S /Sect +>> +endobj +1742 0 obj +<< +/K [1202 0 R 1743 0 R 1744 0 R 1205 0 R 1206 0 R 1207 0 R 1208 0 R 1209 0 R] +/P 1980 0 R +/S /Sect +>> +endobj +1743 0 obj +<< +/K 1203 0 R +/P 1742 0 R +/S /Sect +>> +endobj +1744 0 obj +<< +/K 1204 0 R +/P 1742 0 R +/S /Sect +>> +endobj +1745 0 obj +<< +/K 1210 0 R +/P 1980 0 R +/S /Sect +>> +endobj +1746 0 obj +<< +/K [1211 0 R 1212 0 R 1747 0 R] +/P 1981 0 R +/S /Sect +>> +endobj +1747 0 obj +<< +/K 1213 0 R +/P 1746 0 R +/S /Sect +>> +endobj +1748 0 obj +<< +/K [1214 0 R 1749 0 R 1750 0 R 1217 0 R 1218 0 R 1219 0 R 1220 0 R 1221 0 R] +/P 1981 0 R +/S /Sect +>> +endobj +1749 0 obj +<< +/K 1215 0 R +/P 1748 0 R +/S /Sect +>> +endobj +1750 0 obj +<< +/K 1216 0 R +/P 1748 0 R +/S /Sect +>> +endobj +1751 0 obj +<< +/K 1222 0 R +/P 1981 0 R +/S /Sect +>> +endobj +1752 0 obj +<< +/K [1223 0 R 1224 0 R] +/P 1982 0 R +/S /TD +>> +endobj +1753 0 obj +<< +/K [1225 0 R 1226 0 R 1754 0 R] +/P 1983 0 R +/S /Sect +>> +endobj +1754 0 obj +<< +/K 1227 0 R +/P 1753 0 R +/S /Sect +>> +endobj +1755 0 obj +<< +/K [1228 0 R 1756 0 R 1757 0 R 1231 0 R 1232 0 R 1233 0 R 1234 0 R 1235 0 R] +/P 1983 0 R +/S /Sect +>> +endobj +1756 0 obj +<< +/K 1229 0 R +/P 1755 0 R +/S /Sect +>> +endobj +1757 0 obj +<< +/K 1230 0 R +/P 1755 0 R +/S /Sect +>> +endobj +1758 0 obj +<< +/K 1236 0 R +/P 1983 0 R +/S /Sect +>> +endobj +1759 0 obj +<< +/K [1237 0 R 1238 0 R] +/P 1984 0 R +/S /TD +>> +endobj +1760 0 obj +<< +/K [1239 0 R 1240 0 R 1761 0 R] +/P 1985 0 R +/S /Sect +>> +endobj +1761 0 obj +<< +/K 1241 0 R +/P 1760 0 R +/S /Sect +>> +endobj +1762 0 obj +<< +/K [1242 0 R 1763 0 R 1764 0 R 1245 0 R 1246 0 R 1247 0 R 1248 0 R 1249 0 R] +/P 1985 0 R +/S /Sect +>> +endobj +1763 0 obj +<< +/K 1243 0 R +/P 1762 0 R +/S /Sect +>> +endobj +1764 0 obj +<< +/K 1244 0 R +/P 1762 0 R +/S /Sect +>> +endobj +1765 0 obj +<< +/K 1250 0 R +/P 1985 0 R +/S /Sect +>> +endobj +1766 0 obj +<< +/K [1251 0 R 1252 0 R 1767 0 R] +/P 1986 0 R +/S /Sect +>> +endobj +1767 0 obj +<< +/K 1253 0 R +/P 1766 0 R +/S /Sect +>> +endobj +1768 0 obj +<< +/K [1254 0 R 1769 0 R 1770 0 R 1257 0 R 1258 0 R 1259 0 R 1260 0 R 1261 0 R] +/P 1986 0 R +/S /Sect +>> +endobj +1769 0 obj +<< +/K 1255 0 R +/P 1768 0 R +/S /Sect +>> +endobj +1770 0 obj +<< +/K 1256 0 R +/P 1768 0 R +/S /Sect +>> +endobj +1771 0 obj +<< +/K 1262 0 R +/P 1986 0 R +/S /Sect +>> +endobj +1772 0 obj +<< +/K [1270 0 R 1271 0 R 1272 0 R] +/P 1987 0 R +/S /Sect +>> +endobj +1773 0 obj +<< +/K [1273 0 R 1274 0 R 1275 0 R 1276 0 R 1277 0 R 1278 0 R 1279 0 R 1280 0 R] +/P 1987 0 R +/S /Sect +>> +endobj +1774 0 obj +<< +/K [1281 0 R 1282 0 R 1775 0 R] +/P 1988 0 R +/S /Sect +>> +endobj +1775 0 obj +<< +/K 1283 0 R +/P 1774 0 R +/S /Sect +>> +endobj +1776 0 obj +<< +/K [1284 0 R 1777 0 R 1778 0 R 1287 0 R 1288 0 R 1289 0 R 1290 0 R 1291 0 R] +/P 1988 0 R +/S /Sect +>> +endobj +1777 0 obj +<< +/K 1285 0 R +/P 1776 0 R +/S /Sect +>> +endobj +1778 0 obj +<< +/K 1286 0 R +/P 1776 0 R +/S /Sect +>> +endobj +1779 0 obj +<< +/K 1292 0 R +/P 1988 0 R +/S /Sect +>> +endobj +1780 0 obj +<< +/K [1293 0 R 1294 0 R 1781 0 R] +/P 1989 0 R +/S /Sect +>> +endobj +1781 0 obj +<< +/K 1295 0 R +/P 1780 0 R +/S /Sect +>> +endobj +1782 0 obj +<< +/K [1296 0 R 1783 0 R 1784 0 R 1299 0 R 1300 0 R 1301 0 R 1302 0 R 1303 0 R] +/P 1989 0 R +/S /Sect +>> +endobj +1783 0 obj +<< +/K 1297 0 R +/P 1782 0 R +/S /Sect +>> +endobj +1784 0 obj +<< +/K 1298 0 R +/P 1782 0 R +/S /Sect +>> +endobj +1785 0 obj +<< +/K 1304 0 R +/P 1989 0 R +/S /Sect +>> +endobj +1786 0 obj +<< +/K [1305 0 R 1306 0 R] +/P 1990 0 R +/S /TD +>> +endobj +1787 0 obj +<< +/K [1307 0 R 1308 0 R 1788 0 R] +/P 1991 0 R +/S /Sect +>> +endobj +1788 0 obj +<< +/K 1309 0 R +/P 1787 0 R +/S /Sect +>> +endobj +1789 0 obj +<< +/K [1310 0 R 1790 0 R 1791 0 R 1313 0 R 1314 0 R 1315 0 R 1316 0 R 1317 0 R] +/P 1991 0 R +/S /Sect +>> +endobj +1790 0 obj +<< +/K 1311 0 R +/P 1789 0 R +/S /Sect +>> +endobj +1791 0 obj +<< +/K 1312 0 R +/P 1789 0 R +/S /Sect +>> +endobj +1792 0 obj +<< +/K 1318 0 R +/P 1991 0 R +/S /Sect +>> +endobj +1793 0 obj +<< +/K [1319 0 R 1320 0 R 1794 0 R] +/P 1992 0 R +/S /Sect +>> +endobj +1794 0 obj +<< +/K 1321 0 R +/P 1793 0 R +/S /Sect +>> +endobj +1795 0 obj +<< +/K [1322 0 R 1796 0 R 1797 0 R 1325 0 R 1326 0 R 1327 0 R 1328 0 R 1329 0 R] +/P 1992 0 R +/S /Sect +>> +endobj +1796 0 obj +<< +/K 1323 0 R +/P 1795 0 R +/S /Sect +>> +endobj +1797 0 obj +<< +/K 1324 0 R +/P 1795 0 R +/S /Sect +>> +endobj +1798 0 obj +<< +/K 1330 0 R +/P 1992 0 R +/S /Sect +>> +endobj +1799 0 obj +<< +/K [1331 0 R 1332 0 R] +/P 1993 0 R +/S /TD +>> +endobj +1800 0 obj +<< +/K [1333 0 R 1334 0 R 1801 0 R] +/P 1994 0 R +/S /Sect +>> +endobj +1801 0 obj +<< +/K 1335 0 R +/P 1800 0 R +/S /Sect +>> +endobj +1802 0 obj +<< +/K [1336 0 R 1803 0 R 1804 0 R 1339 0 R 1340 0 R 1341 0 R 1342 0 R 1343 0 R] +/P 1994 0 R +/S /Sect +>> +endobj +1803 0 obj +<< +/K 1337 0 R +/P 1802 0 R +/S /Sect +>> +endobj +1804 0 obj +<< +/K 1338 0 R +/P 1802 0 R +/S /Sect +>> +endobj +1805 0 obj +<< +/K 1344 0 R +/P 1994 0 R +/S /Sect +>> +endobj +1806 0 obj +<< +/K [1345 0 R 1346 0 R] +/P 1995 0 R +/S /TD +>> +endobj +1807 0 obj +<< +/K [1347 0 R 1348 0 R 1808 0 R] +/P 1996 0 R +/S /Sect +>> +endobj +1808 0 obj +<< +/K 1349 0 R +/P 1807 0 R +/S /Sect +>> +endobj +1809 0 obj +<< +/K [1350 0 R 1810 0 R 1811 0 R 1353 0 R 1354 0 R 1355 0 R 1356 0 R 1357 0 R] +/P 1996 0 R +/S /Sect +>> +endobj +1810 0 obj +<< +/K 1351 0 R +/P 1809 0 R +/S /Sect +>> +endobj +1811 0 obj +<< +/K 1352 0 R +/P 1809 0 R +/S /Sect +>> +endobj +1812 0 obj +<< +/K 1358 0 R +/P 1996 0 R +/S /Sect +>> +endobj +1813 0 obj +<< +/K [1359 0 R 1360 0 R] +/P 1997 0 R +/S /TD +>> +endobj +1814 0 obj +<< +/K [1361 0 R 1362 0 R 1815 0 R] +/P 1998 0 R +/S /Sect +>> +endobj +1815 0 obj +<< +/K 1363 0 R +/P 1814 0 R +/S /Sect +>> +endobj +1816 0 obj +<< +/K [1364 0 R 1817 0 R 1818 0 R 1367 0 R 1368 0 R 1369 0 R 1370 0 R 1371 0 R] +/P 1998 0 R +/S /Sect +>> +endobj +1817 0 obj +<< +/K 1365 0 R +/P 1816 0 R +/S /Sect +>> +endobj +1818 0 obj +<< +/K 1366 0 R +/P 1816 0 R +/S /Sect +>> +endobj +1819 0 obj +<< +/K 1372 0 R +/P 1998 0 R +/S /Sect +>> +endobj +1820 0 obj +<< +/K [1373 0 R 1374 0 R 1821 0 R] +/P 1999 0 R +/S /Sect +>> +endobj +1821 0 obj +<< +/K 1375 0 R +/P 1820 0 R +/S /Sect +>> +endobj +1822 0 obj +<< +/K [1376 0 R 1823 0 R 1824 0 R 1379 0 R 1380 0 R 1381 0 R 1382 0 R 1383 0 R] +/P 1999 0 R +/S /Sect +>> +endobj +1823 0 obj +<< +/K 1377 0 R +/P 1822 0 R +/S /Sect +>> +endobj +1824 0 obj +<< +/K 1378 0 R +/P 1822 0 R +/S /Sect +>> +endobj +1825 0 obj +<< +/K 1384 0 R +/P 1999 0 R +/S /Sect +>> +endobj +1826 0 obj +<< +/K [1385 0 R 1386 0 R 1827 0 R] +/P 2000 0 R +/S /Sect +>> +endobj +1827 0 obj +<< +/K 1387 0 R +/P 1826 0 R +/S /Sect +>> +endobj +1828 0 obj +<< +/K [1388 0 R 1829 0 R 1830 0 R 1391 0 R 1392 0 R 1393 0 R 1394 0 R 1395 0 R] +/P 2000 0 R +/S /Sect +>> +endobj +1829 0 obj +<< +/K 1389 0 R +/P 1828 0 R +/S /Sect +>> +endobj +1830 0 obj +<< +/K 1390 0 R +/P 1828 0 R +/S /Sect +>> +endobj +1831 0 obj +<< +/K 1396 0 R +/P 2000 0 R +/S /Sect +>> +endobj +1832 0 obj +<< +/K [1397 0 R 1398 0 R 1833 0 R] +/P 2001 0 R +/S /Sect +>> +endobj +1833 0 obj +<< +/K 1399 0 R +/P 1832 0 R +/S /Sect +>> +endobj +1834 0 obj +<< +/K [1400 0 R 1835 0 R 1836 0 R 1403 0 R 1404 0 R 1405 0 R 1406 0 R 1407 0 R] +/P 2001 0 R +/S /Sect +>> +endobj +1835 0 obj +<< +/K 1401 0 R +/P 1834 0 R +/S /Sect +>> +endobj +1836 0 obj +<< +/K 1402 0 R +/P 1834 0 R +/S /Sect +>> +endobj +1837 0 obj +<< +/K 1408 0 R +/P 2001 0 R +/S /Sect +>> +endobj +1838 0 obj +<< +/K [1409 0 R 1410 0 R 1839 0 R] +/P 2002 0 R +/S /Sect +>> +endobj +1839 0 obj +<< +/K 1411 0 R +/P 1838 0 R +/S /Sect +>> +endobj +1840 0 obj +<< +/K [1412 0 R 1841 0 R 1842 0 R 1415 0 R 1416 0 R 1417 0 R 1418 0 R 1419 0 R] +/P 2002 0 R +/S /Sect +>> +endobj +1841 0 obj +<< +/K 1413 0 R +/P 1840 0 R +/S /Sect +>> +endobj +1842 0 obj +<< +/K 1414 0 R +/P 1840 0 R +/S /Sect +>> +endobj +1843 0 obj +<< +/K 1420 0 R +/P 2002 0 R +/S /Sect +>> +endobj +1844 0 obj +<< +/K [1421 0 R 1422 0 R 1845 0 R] +/P 2003 0 R +/S /Sect +>> +endobj +1845 0 obj +<< +/K 1423 0 R +/P 1844 0 R +/S /Sect +>> +endobj +1846 0 obj +<< +/K [1424 0 R 1847 0 R 1848 0 R 1427 0 R 1428 0 R 1429 0 R 1430 0 R 1431 0 R] +/P 2003 0 R +/S /Sect +>> +endobj +1847 0 obj +<< +/K 1425 0 R +/P 1846 0 R +/S /Sect +>> +endobj +1848 0 obj +<< +/K 1426 0 R +/P 1846 0 R +/S /Sect +>> +endobj +1849 0 obj +<< +/K 1432 0 R +/P 2003 0 R +/S /Sect +>> +endobj +1850 0 obj +<< +/K [1433 0 R 1434 0 R 1851 0 R] +/P 2004 0 R +/S /Sect +>> +endobj +1851 0 obj +<< +/K 1435 0 R +/P 1850 0 R +/S /Sect +>> +endobj +1852 0 obj +<< +/K [1436 0 R 1853 0 R 1854 0 R 1439 0 R 1440 0 R 1441 0 R 1442 0 R 1443 0 R] +/P 2004 0 R +/S /Sect +>> +endobj +1853 0 obj +<< +/K 1437 0 R +/P 1852 0 R +/S /Sect +>> +endobj +1854 0 obj +<< +/K 1438 0 R +/P 1852 0 R +/S /Sect +>> +endobj +1855 0 obj +<< +/K 1444 0 R +/P 2004 0 R +/S /Sect +>> +endobj +1856 0 obj +<< +/K [1445 0 R 1446 0 R 1857 0 R] +/P 2005 0 R +/S /Sect +>> +endobj +1857 0 obj +<< +/K 1447 0 R +/P 1856 0 R +/S /Sect +>> +endobj +1858 0 obj +<< +/K [1448 0 R 1859 0 R 1860 0 R 1451 0 R 1452 0 R 1453 0 R 1454 0 R 1455 0 R] +/P 2005 0 R +/S /Sect +>> +endobj +1859 0 obj +<< +/K 1449 0 R +/P 1858 0 R +/S /Sect +>> +endobj +1860 0 obj +<< +/K 1450 0 R +/P 1858 0 R +/S /Sect +>> +endobj +1861 0 obj +<< +/K 1456 0 R +/P 2005 0 R +/S /Sect +>> +endobj +1862 0 obj +<< +/K [1457 0 R 1458 0 R 1863 0 R] +/P 2006 0 R +/S /Sect +>> +endobj +1863 0 obj +<< +/K 1459 0 R +/P 1862 0 R +/S /Sect +>> +endobj +1864 0 obj +<< +/K [1460 0 R 1865 0 R 1866 0 R 1463 0 R 1464 0 R 1465 0 R 1466 0 R 1467 0 R] +/P 2006 0 R +/S /Sect +>> +endobj +1865 0 obj +<< +/K 1461 0 R +/P 1864 0 R +/S /Sect +>> +endobj +1866 0 obj +<< +/K 1462 0 R +/P 1864 0 R +/S /Sect +>> +endobj +1867 0 obj +<< +/K 1468 0 R +/P 2006 0 R +/S /Sect +>> +endobj +1868 0 obj +<< +/K [1469 0 R 1470 0 R 1869 0 R] +/P 2007 0 R +/S /Sect +>> +endobj +1869 0 obj +<< +/K 1471 0 R +/P 1868 0 R +/S /Sect +>> +endobj +1870 0 obj +<< +/K [1472 0 R 1871 0 R 1872 0 R 1475 0 R 1476 0 R 1477 0 R 1478 0 R 1479 0 R] +/P 2007 0 R +/S /Sect +>> +endobj +1871 0 obj +<< +/K 1473 0 R +/P 1870 0 R +/S /Sect +>> +endobj +1872 0 obj +<< +/K 1474 0 R +/P 1870 0 R +/S /Sect +>> +endobj +1873 0 obj +<< +/K 1480 0 R +/P 2007 0 R +/S /Sect +>> +endobj +1874 0 obj +<< +/K [1481 0 R 1482 0 R 1875 0 R] +/P 2008 0 R +/S /Sect +>> +endobj +1875 0 obj +<< +/K 1483 0 R +/P 1874 0 R +/S /Sect +>> +endobj +1876 0 obj +<< +/K [1484 0 R 1877 0 R 1878 0 R 1487 0 R 1488 0 R 1489 0 R 1490 0 R 1491 0 R] +/P 2008 0 R +/S /Sect +>> +endobj +1877 0 obj +<< +/K 1485 0 R +/P 1876 0 R +/S /Sect +>> +endobj +1878 0 obj +<< +/K 1486 0 R +/P 1876 0 R +/S /Sect +>> +endobj +1879 0 obj +<< +/K 1492 0 R +/P 2008 0 R +/S /Sect +>> +endobj +1880 0 obj +<< +/K [1493 0 R 1494 0 R 1881 0 R] +/P 2009 0 R +/S /Sect +>> +endobj +1881 0 obj +<< +/K 1495 0 R +/P 1880 0 R +/S /Sect +>> +endobj +1882 0 obj +<< +/K [1503 0 R 1504 0 R 1505 0 R] +/P 2010 0 R +/S /Sect +>> +endobj +1883 0 obj +<< +/K [1506 0 R 1507 0 R 1508 0 R 1509 0 R 1510 0 R 1511 0 R 1512 0 R 1513 0 R] +/P 2010 0 R +/S /Sect +>> +endobj +1884 0 obj +<< +/K [1514 0 R 1885 0 R 1886 0 R 1517 0 R 1518 0 R 1519 0 R 1520 0 R 1521 0 R] +/P 2011 0 R +/S /Sect +>> +endobj +1885 0 obj +<< +/K 1515 0 R +/P 1884 0 R +/S /Sect +>> +endobj +1886 0 obj +<< +/K 1516 0 R +/P 1884 0 R +/S /Sect +>> +endobj +1887 0 obj +<< +/K 1522 0 R +/P 2011 0 R +/S /Sect +>> +endobj +1888 0 obj +<< +/K [1523 0 R 1524 0 R 1889 0 R] +/P 2012 0 R +/S /Sect +>> +endobj +1889 0 obj +<< +/K 1525 0 R +/P 1888 0 R +/S /Sect +>> +endobj +1890 0 obj +<< +/K [1526 0 R 1891 0 R 1892 0 R 1529 0 R 1530 0 R 1531 0 R 1532 0 R 1533 0 R] +/P 2012 0 R +/S /Sect +>> +endobj +1891 0 obj +<< +/K 1527 0 R +/P 1890 0 R +/S /Sect +>> +endobj +1892 0 obj +<< +/K 1528 0 R +/P 1890 0 R +/S /Sect +>> +endobj +1893 0 obj +<< +/K 1534 0 R +/P 2012 0 R +/S /Sect +>> +endobj +1894 0 obj +<< +/K [1535 0 R 1536 0 R 1895 0 R] +/P 2013 0 R +/S /Sect +>> +endobj +1895 0 obj +<< +/K 1537 0 R +/P 1894 0 R +/S /Sect +>> +endobj +1896 0 obj +<< +/K [1538 0 R 1897 0 R 1898 0 R 1541 0 R 1542 0 R 1543 0 R 1544 0 R 1545 0 R] +/P 2013 0 R +/S /Sect +>> +endobj +1897 0 obj +<< +/K 1539 0 R +/P 1896 0 R +/S /Sect +>> +endobj +1898 0 obj +<< +/K 1540 0 R +/P 1896 0 R +/S /Sect +>> +endobj +1899 0 obj +<< +/K 1546 0 R +/P 2013 0 R +/S /Sect +>> +endobj +1900 0 obj +<< +/K [1547 0 R 1548 0 R 1901 0 R] +/P 2014 0 R +/S /Sect +>> +endobj +1901 0 obj +<< +/K 1549 0 R +/P 1900 0 R +/S /Sect +>> +endobj +1902 0 obj +<< +/K [1550 0 R 1903 0 R 1904 0 R 1553 0 R 1554 0 R 1555 0 R 1556 0 R 1557 0 R] +/P 2014 0 R +/S /Sect +>> +endobj +1903 0 obj +<< +/K 1551 0 R +/P 1902 0 R +/S /Sect +>> +endobj +1904 0 obj +<< +/K 1552 0 R +/P 1902 0 R +/S /Sect +>> +endobj +1905 0 obj +<< +/K 1558 0 R +/P 2014 0 R +/S /Sect +>> +endobj +1906 0 obj +<< +/K [1559 0 R 1560 0 R 1907 0 R] +/P 2015 0 R +/S /Sect +>> +endobj +1907 0 obj +<< +/K 1561 0 R +/P 1906 0 R +/S /Sect +>> +endobj +1908 0 obj +<< +/K [1562 0 R 1909 0 R 1910 0 R 1565 0 R 1566 0 R 1567 0 R 1568 0 R 1569 0 R] +/P 2015 0 R +/S /Sect +>> +endobj +1909 0 obj +<< +/K 1563 0 R +/P 1908 0 R +/S /Sect +>> +endobj +1910 0 obj +<< +/K 1564 0 R +/P 1908 0 R +/S /Sect +>> +endobj +1911 0 obj +<< +/K 1570 0 R +/P 2015 0 R +/S /Sect +>> +endobj +1912 0 obj +<< +/K [1571 0 R 1572 0 R 1913 0 R] +/P 2016 0 R +/S /Sect +>> +endobj +1913 0 obj +<< +/K 1573 0 R +/P 1912 0 R +/S /Sect +>> +endobj +1914 0 obj +<< +/K [1574 0 R 1915 0 R 1916 0 R 1577 0 R 1578 0 R 1579 0 R 1580 0 R 1581 0 R] +/P 2016 0 R +/S /Sect +>> +endobj +1915 0 obj +<< +/K 1575 0 R +/P 1914 0 R +/S /Sect +>> +endobj +1916 0 obj +<< +/K 1576 0 R +/P 1914 0 R +/S /Sect +>> +endobj +1917 0 obj +<< +/K 1582 0 R +/P 2016 0 R +/S /Sect +>> +endobj +1918 0 obj +<< +/K [1583 0 R 1584 0 R 1919 0 R] +/P 2017 0 R +/S /Sect +>> +endobj +1919 0 obj +<< +/K 1585 0 R +/P 1918 0 R +/S /Sect +>> +endobj +1920 0 obj +<< +/K [1586 0 R 1921 0 R 1922 0 R 1589 0 R 1590 0 R 1591 0 R 1592 0 R 1593 0 R] +/P 2017 0 R +/S /Sect +>> +endobj +1921 0 obj +<< +/K 1587 0 R +/P 1920 0 R +/S /Sect +>> +endobj +1922 0 obj +<< +/K 1588 0 R +/P 1920 0 R +/S /Sect +>> +endobj +1923 0 obj +<< +/K 1594 0 R +/P 2017 0 R +/S /Sect +>> +endobj +1924 0 obj +<< +/K [1595 0 R 1596 0 R 1925 0 R] +/P 2018 0 R +/S /Sect +>> +endobj +1925 0 obj +<< +/K 1597 0 R +/P 1924 0 R +/S /Sect +>> +endobj +1926 0 obj +<< +/K [1598 0 R 1927 0 R 1928 0 R 1601 0 R 1602 0 R 1603 0 R 1604 0 R 1605 0 R] +/P 2018 0 R +/S /Sect +>> +endobj +1927 0 obj +<< +/K 1599 0 R +/P 1926 0 R +/S /Sect +>> +endobj +1928 0 obj +<< +/K 1600 0 R +/P 1926 0 R +/S /Sect +>> +endobj +1929 0 obj +<< +/K 1606 0 R +/P 2018 0 R +/S /Sect +>> +endobj +1930 0 obj +<< +/K [1607 0 R 1608 0 R 1931 0 R] +/P 2019 0 R +/S /Sect +>> +endobj +1931 0 obj +<< +/K 1609 0 R +/P 1930 0 R +/S /Sect +>> +endobj +1932 0 obj +<< +/K [1610 0 R 1933 0 R 1934 0 R 1613 0 R 1614 0 R 1615 0 R 1616 0 R 1617 0 R] +/P 2019 0 R +/S /Sect +>> +endobj +1933 0 obj +<< +/K 1611 0 R +/P 1932 0 R +/S /Sect +>> +endobj +1934 0 obj +<< +/K 1612 0 R +/P 1932 0 R +/S /Sect +>> +endobj +1935 0 obj +<< +/K 1618 0 R +/P 2019 0 R +/S /Sect +>> +endobj +1936 0 obj +<< +/K [1619 0 R 1620 0 R 1937 0 R] +/P 2020 0 R +/S /Sect +>> +endobj +1937 0 obj +<< +/K 1621 0 R +/P 1936 0 R +/S /Sect +>> +endobj +1938 0 obj +<< +/K [1622 0 R 1939 0 R 1940 0 R 1625 0 R 1626 0 R 1627 0 R 1628 0 R 1629 0 R] +/P 2020 0 R +/S /Sect +>> +endobj +1939 0 obj +<< +/K 1623 0 R +/P 1938 0 R +/S /Sect +>> +endobj +1940 0 obj +<< +/K 1624 0 R +/P 1938 0 R +/S /Sect +>> +endobj +1941 0 obj +<< +/K 1630 0 R +/P 2020 0 R +/S /Sect +>> +endobj +1942 0 obj +<< +/K [1631 0 R 1632 0 R 1633 0 R 1634 0 R] +/P 2021 0 R +/S /TD +>> +endobj +1943 0 obj +<< +/K [1635 0 R 1636 0 R 1944 0 R] +/P 2022 0 R +/S /Sect +>> +endobj +1944 0 obj +<< +/K 1637 0 R +/P 1943 0 R +/S /Sect +>> +endobj +1945 0 obj +<< +/K [1638 0 R 1946 0 R 1947 0 R 1641 0 R 1642 0 R 1643 0 R 1644 0 R 1645 0 R] +/P 2022 0 R +/S /Sect +>> +endobj +1946 0 obj +<< +/K 1639 0 R +/P 1945 0 R +/S /Sect +>> +endobj +1947 0 obj +<< +/K 1640 0 R +/P 1945 0 R +/S /Sect +>> +endobj +1948 0 obj +<< +/K 1646 0 R +/P 2022 0 R +/S /Sect +>> +endobj +1949 0 obj +<< +/K [1647 0 R 1648 0 R 1950 0 R] +/P 2023 0 R +/S /Sect +>> +endobj +1950 0 obj +<< +/K 1649 0 R +/P 1949 0 R +/S /Sect +>> +endobj +1951 0 obj +<< +/K [1650 0 R 1952 0 R 1953 0 R 1653 0 R 1654 0 R 1655 0 R 1656 0 R 1657 0 R] +/P 2023 0 R +/S /Sect +>> +endobj +1952 0 obj +<< +/K 1651 0 R +/P 1951 0 R +/S /Sect +>> +endobj +1953 0 obj +<< +/K 1652 0 R +/P 1951 0 R +/S /Sect +>> +endobj +1954 0 obj +<< +/K 1658 0 R +/P 2023 0 R +/S /Sect +>> +endobj +1955 0 obj +<< +/K [1659 0 R 1660 0 R 1956 0 R] +/P 2024 0 R +/S /Sect +>> +endobj +1956 0 obj +<< +/K 1661 0 R +/P 1955 0 R +/S /Sect +>> +endobj +1957 0 obj +<< +/K [1662 0 R 1958 0 R 1959 0 R 1665 0 R 1666 0 R 1667 0 R 1668 0 R 1669 0 R] +/P 2024 0 R +/S /Sect +>> +endobj +1958 0 obj +<< +/K 1663 0 R +/P 1957 0 R +/S /Sect +>> +endobj +1959 0 obj +<< +/K 1664 0 R +/P 1957 0 R +/S /Sect +>> +endobj +1960 0 obj +<< +/K 1670 0 R +/P 2024 0 R +/S /Sect +>> +endobj +1961 0 obj +<< +/K 1671 0 R +/P 1970 0 R +/S /Sect +>> +endobj +1962 0 obj +<< +/K [1672 0 R 1673 0 R] +/P 2025 0 R +/S /Sect +>> +endobj +1963 0 obj +<< +/K [1674 0 R 1675 0 R 1676 0 R 1677 0 R] +/P 2026 0 R +/S /TD +>> +endobj +1964 0 obj +<< +/K [1678 0 R 1679 0 R] +/P 2025 0 R +/S /Sect +>> +endobj +1965 0 obj +<< +/K [1696 0 R 1697 0 R 1684 0 R] +/P 1685 0 R +/S /Sect +>> +endobj +1966 0 obj +<< +/K [1701 0 R 1971 0 R 1972 0 R 1708 0 R 1709 0 R] +/P 1685 0 R +/S /Sect +>> +endobj +1967 0 obj +<< +/K [2027 0 R 2028 0 R] +/P 1686 0 R +/S /Table +>> +endobj +1968 0 obj +<< +/K [2029 0 R 2030 0 R] +/P 1689 0 R +/S /Table +>> +endobj +1969 0 obj +<< +/K [2031 0 R 2032 0 R] +/P 1692 0 R +/S /Table +>> +endobj +1970 0 obj +<< +/K [1961 0 R 2025 0 R] +/P 1692 0 R +/S /Sect +>> +endobj +1971 0 obj +<< +/K [1702 0 R 1703 0 R 1704 0 R 1705 0 R] +/P 1966 0 R +/S /Sect +>> +endobj +1972 0 obj +<< +/K [1706 0 R 1707 0 R] +/P 1966 0 R +/S /Sect +>> +endobj +1973 0 obj +<< +/K [1710 0 R 1711 0 R] +/P 2027 0 R +/S /TD +>> +endobj +1974 0 obj +<< +/K [1712 0 R 1713 0 R] +/P 1714 0 R +/S /Sect +>> +endobj +1975 0 obj +<< +/K [1714 0 R 2033 0 R] +/P 2028 0 R +/S /TD +>> +endobj +1976 0 obj +<< +/K [1716 0 R 1718 0 R 1721 0 R] +/P 2034 0 R +/S /TD +>> +endobj +1977 0 obj +<< +/K [1722 0 R 1724 0 R 1727 0 R] +/P 2035 0 R +/S /TD +>> +endobj +1978 0 obj +<< +/K [1728 0 R 1730 0 R 1733 0 R] +/P 2036 0 R +/S /TD +>> +endobj +1979 0 obj +<< +/K [1734 0 R 1736 0 R 1739 0 R] +/P 2037 0 R +/S /TD +>> +endobj +1980 0 obj +<< +/K [1740 0 R 1742 0 R 1745 0 R] +/P 2038 0 R +/S /TD +>> +endobj +1981 0 obj +<< +/K [1746 0 R 1748 0 R 1751 0 R 2039 0 R] +/P 2040 0 R +/S /TD +>> +endobj +1982 0 obj +<< +/K 1752 0 R +/P 2041 0 R +/S /TR +>> +endobj +1983 0 obj +<< +/K [1753 0 R 1755 0 R 1758 0 R 2042 0 R] +/P 2043 0 R +/S /TD +>> +endobj +1984 0 obj +<< +/K 1759 0 R +/P 2044 0 R +/S /TR +>> +endobj +1985 0 obj +<< +/K [1760 0 R 1762 0 R 1765 0 R] +/P 2045 0 R +/S /TD +>> +endobj +1986 0 obj +<< +/K [1766 0 R 1768 0 R 1771 0 R] +/P 2046 0 R +/S /TD +>> +endobj +1987 0 obj +<< +/K [1772 0 R 1773 0 R] +/P 2029 0 R +/S /TD +>> +endobj +1988 0 obj +<< +/K [1774 0 R 1776 0 R 1779 0 R] +/P 2047 0 R +/S /TD +>> +endobj +1989 0 obj +<< +/K [1780 0 R 1782 0 R 1785 0 R 2048 0 R] +/P 2049 0 R +/S /TD +>> +endobj +1990 0 obj +<< +/K 1786 0 R +/P 2050 0 R +/S /TR +>> +endobj +1991 0 obj +<< +/K [1787 0 R 1789 0 R 1792 0 R] +/P 2051 0 R +/S /TD +>> +endobj +1992 0 obj +<< +/K [1793 0 R 1795 0 R 1798 0 R 2052 0 R] +/P 2053 0 R +/S /TD +>> +endobj +1993 0 obj +<< +/K 1799 0 R +/P 2054 0 R +/S /TR +>> +endobj +1994 0 obj +<< +/K [1800 0 R 1802 0 R 1805 0 R 2055 0 R] +/P 2056 0 R +/S /TD +>> +endobj +1995 0 obj +<< +/K 1806 0 R +/P 2057 0 R +/S /TR +>> +endobj +1996 0 obj +<< +/K [1807 0 R 1809 0 R 1812 0 R 2058 0 R] +/P 2059 0 R +/S /TD +>> +endobj +1997 0 obj +<< +/K 1813 0 R +/P 2060 0 R +/S /TR +>> +endobj +1998 0 obj +<< +/K [1814 0 R 1816 0 R 1819 0 R] +/P 2061 0 R +/S /TD +>> +endobj +1999 0 obj +<< +/K [1820 0 R 1822 0 R 1825 0 R] +/P 2062 0 R +/S /TD +>> +endobj +2000 0 obj +<< +/K [1826 0 R 1828 0 R 1831 0 R] +/P 2063 0 R +/S /TD +>> +endobj +2001 0 obj +<< +/K [1832 0 R 1834 0 R 1837 0 R] +/P 2064 0 R +/S /TD +>> +endobj +2002 0 obj +<< +/K [1838 0 R 1840 0 R 1843 0 R] +/P 2065 0 R +/S /TD +>> +endobj +2003 0 obj +<< +/K [1844 0 R 1846 0 R 1849 0 R] +/P 2066 0 R +/S /TD +>> +endobj +2004 0 obj +<< +/K [1850 0 R 1852 0 R 1855 0 R] +/P 2067 0 R +/S /TD +>> +endobj +2005 0 obj +<< +/K [1856 0 R 1858 0 R 1861 0 R] +/P 2068 0 R +/S /TD +>> +endobj +2006 0 obj +<< +/K [1862 0 R 1864 0 R 1867 0 R] +/P 2069 0 R +/S /TD +>> +endobj +2007 0 obj +<< +/K [1868 0 R 1870 0 R 1873 0 R] +/P 2070 0 R +/S /TD +>> +endobj +2008 0 obj +<< +/K [1874 0 R 1876 0 R 1879 0 R] +/P 2071 0 R +/S /TD +>> +endobj +2009 0 obj +<< +/K 1880 0 R +/P 2072 0 R +/S /TD +>> +endobj +2010 0 obj +<< +/K [1882 0 R 1883 0 R] +/P 2031 0 R +/S /TD +>> +endobj +2011 0 obj +<< +/K [1884 0 R 1887 0 R] +/P 2073 0 R +/S /TD +>> +endobj +2012 0 obj +<< +/K [1888 0 R 1890 0 R 1893 0 R] +/P 2074 0 R +/S /TD +>> +endobj +2013 0 obj +<< +/K [1894 0 R 1896 0 R 1899 0 R] +/P 2075 0 R +/S /TD +>> +endobj +2014 0 obj +<< +/K [1900 0 R 1902 0 R 1905 0 R] +/P 2076 0 R +/S /TD +>> +endobj +2015 0 obj +<< +/K [1906 0 R 1908 0 R 1911 0 R] +/P 2077 0 R +/S /TD +>> +endobj +2016 0 obj +<< +/K [1912 0 R 1914 0 R 1917 0 R] +/P 2078 0 R +/S /TD +>> +endobj +2017 0 obj +<< +/K [1918 0 R 1920 0 R 1923 0 R] +/P 2079 0 R +/S /TD +>> +endobj +2018 0 obj +<< +/K [1924 0 R 1926 0 R 1929 0 R] +/P 2080 0 R +/S /TD +>> +endobj +2019 0 obj +<< +/K [1930 0 R 1932 0 R 1935 0 R] +/P 2081 0 R +/S /TD +>> +endobj +2020 0 obj +<< +/K [1936 0 R 1938 0 R 1941 0 R 2082 0 R] +/P 2083 0 R +/S /TD +>> +endobj +2021 0 obj +<< +/K 1942 0 R +/P 2084 0 R +/S /TR +>> +endobj +2022 0 obj +<< +/K [1943 0 R 1945 0 R 1948 0 R] +/P 2085 0 R +/S /TD +>> +endobj +2023 0 obj +<< +/K [1949 0 R 1951 0 R 1954 0 R] +/P 2086 0 R +/S /TD +>> +endobj +2024 0 obj +<< +/K [1955 0 R 1957 0 R 1960 0 R] +/P 2087 0 R +/S /TD +>> +endobj +2025 0 obj +<< +/K [1962 0 R 2088 0 R 1964 0 R] +/P 1970 0 R +/S /Sect +>> +endobj +2026 0 obj +<< +/K 1963 0 R +/P 2089 0 R +/S /TR +>> +endobj +2027 0 obj +<< +/K 1973 0 R +/P 1967 0 R +/S /TR +>> +endobj +2028 0 obj +<< +/K 1975 0 R +/P 1967 0 R +/S /TR +>> +endobj +2029 0 obj +<< +/K 1987 0 R +/P 1968 0 R +/S /TR +>> +endobj +2030 0 obj +<< +/K 2090 0 R +/P 1968 0 R +/S /TR +>> +endobj +2031 0 obj +<< +/K 2010 0 R +/P 1969 0 R +/S /TR +>> +endobj +2032 0 obj +<< +/K 2091 0 R +/P 1969 0 R +/S /TR +>> +endobj +2033 0 obj +<< +/K 2092 0 R +/P 1975 0 R +/S /Sect +>> +endobj +2034 0 obj +<< +/K 1976 0 R +/P 2092 0 R +/S /TR +>> +endobj +2035 0 obj +<< +/K 1977 0 R +/P 2092 0 R +/S /TR +>> +endobj +2036 0 obj +<< +/K 1978 0 R +/P 2092 0 R +/S /TR +>> +endobj +2037 0 obj +<< +/K 1979 0 R +/P 2092 0 R +/S /TR +>> +endobj +2038 0 obj +<< +/K 1980 0 R +/P 2092 0 R +/S /TR +>> +endobj +2039 0 obj +<< +/K 2093 0 R +/P 1981 0 R +/S /Sect +>> +endobj +2040 0 obj +<< +/K 1981 0 R +/P 2092 0 R +/S /TR +>> +endobj +2041 0 obj +<< +/K 1982 0 R +/P 2093 0 R +/S /Table +>> +endobj +2042 0 obj +<< +/K 2094 0 R +/P 1983 0 R +/S /Sect +>> +endobj +2043 0 obj +<< +/K 1983 0 R +/P 2092 0 R +/S /TR +>> +endobj +2044 0 obj +<< +/K 1984 0 R +/P 2094 0 R +/S /Table +>> +endobj +2045 0 obj +<< +/K 1985 0 R +/P 2092 0 R +/S /TR +>> +endobj +2046 0 obj +<< +/K 1986 0 R +/P 2092 0 R +/S /TR +>> +endobj +2047 0 obj +<< +/K 1988 0 R +/P 2095 0 R +/S /TR +>> +endobj +2048 0 obj +<< +/K 2096 0 R +/P 1989 0 R +/S /Sect +>> +endobj +2049 0 obj +<< +/K 1989 0 R +/P 2095 0 R +/S /TR +>> +endobj +2050 0 obj +<< +/K 1990 0 R +/P 2096 0 R +/S /Table +>> +endobj +2051 0 obj +<< +/K 1991 0 R +/P 2095 0 R +/S /TR +>> +endobj +2052 0 obj +<< +/K 2097 0 R +/P 1992 0 R +/S /Sect +>> +endobj +2053 0 obj +<< +/K 1992 0 R +/P 2095 0 R +/S /TR +>> +endobj +2054 0 obj +<< +/K 1993 0 R +/P 2097 0 R +/S /Table +>> +endobj +2055 0 obj +<< +/K 2098 0 R +/P 1994 0 R +/S /Sect +>> +endobj +2056 0 obj +<< +/K 1994 0 R +/P 2095 0 R +/S /TR +>> +endobj +2057 0 obj +<< +/K 1995 0 R +/P 2098 0 R +/S /Table +>> +endobj +2058 0 obj +<< +/K 2099 0 R +/P 1996 0 R +/S /Sect +>> +endobj +2059 0 obj +<< +/K 1996 0 R +/P 2095 0 R +/S /TR +>> +endobj +2060 0 obj +<< +/K 1997 0 R +/P 2099 0 R +/S /Table +>> +endobj +2061 0 obj +<< +/K 1998 0 R +/P 2095 0 R +/S /TR +>> +endobj +2062 0 obj +<< +/K 1999 0 R +/P 2095 0 R +/S /TR +>> +endobj +2063 0 obj +<< +/K 2000 0 R +/P 2095 0 R +/S /TR +>> +endobj +2064 0 obj +<< +/K 2001 0 R +/P 2095 0 R +/S /TR +>> +endobj +2065 0 obj +<< +/K 2002 0 R +/P 2095 0 R +/S /TR +>> +endobj +2066 0 obj +<< +/K 2003 0 R +/P 2095 0 R +/S /TR +>> +endobj +2067 0 obj +<< +/K 2004 0 R +/P 2095 0 R +/S /TR +>> +endobj +2068 0 obj +<< +/K 2005 0 R +/P 2095 0 R +/S /TR +>> +endobj +2069 0 obj +<< +/K 2006 0 R +/P 2095 0 R +/S /TR +>> +endobj +2070 0 obj +<< +/K 2007 0 R +/P 2095 0 R +/S /TR +>> +endobj +2071 0 obj +<< +/K 2008 0 R +/P 2095 0 R +/S /TR +>> +endobj +2072 0 obj +<< +/K 2009 0 R +/P 2095 0 R +/S /TR +>> +endobj +2073 0 obj +<< +/K 2011 0 R +/P 2100 0 R +/S /TR +>> +endobj +2074 0 obj +<< +/K 2012 0 R +/P 2100 0 R +/S /TR +>> +endobj +2075 0 obj +<< +/K 2013 0 R +/P 2100 0 R +/S /TR +>> +endobj +2076 0 obj +<< +/K 2014 0 R +/P 2100 0 R +/S /TR +>> +endobj +2077 0 obj +<< +/K 2015 0 R +/P 2100 0 R +/S /TR +>> +endobj +2078 0 obj +<< +/K 2016 0 R +/P 2100 0 R +/S /TR +>> +endobj +2079 0 obj +<< +/K 2017 0 R +/P 2100 0 R +/S /TR +>> +endobj +2080 0 obj +<< +/K 2018 0 R +/P 2100 0 R +/S /TR +>> +endobj +2081 0 obj +<< +/K 2019 0 R +/P 2100 0 R +/S /TR +>> +endobj +2082 0 obj +<< +/K 2084 0 R +/P 2020 0 R +/S /Sect +>> +endobj +2083 0 obj +<< +/K 2020 0 R +/P 2100 0 R +/S /TR +>> +endobj +2084 0 obj +<< +/K 2021 0 R +/P 2082 0 R +/S /Table +>> +endobj +2085 0 obj +<< +/K 2022 0 R +/P 2100 0 R +/S /TR +>> +endobj +2086 0 obj +<< +/K 2023 0 R +/P 2100 0 R +/S /TR +>> +endobj +2087 0 obj +<< +/K 2024 0 R +/P 2100 0 R +/S /TR +>> +endobj +2088 0 obj +<< +/K 2089 0 R +/P 2025 0 R +/S /Sect +>> +endobj +2089 0 obj +<< +/K 2026 0 R +/P 2088 0 R +/S /Table +>> +endobj +2090 0 obj +<< +/K 2101 0 R +/P 2030 0 R +/S /TD +>> +endobj +2091 0 obj +<< +/K 2102 0 R +/P 2032 0 R +/S /TD +>> +endobj +2092 0 obj +<< +/K [2034 0 R 2035 0 R 2036 0 R 2037 0 R 2038 0 R 2040 0 R 2043 0 R 2045 0 R 2046 0 R] +/P 2033 0 R +/S /Table +>> +endobj +2093 0 obj +<< +/K 2041 0 R +/P 2039 0 R +/S /Sect +>> +endobj +2094 0 obj +<< +/K 2044 0 R +/P 2042 0 R +/S /Sect +>> +endobj +2095 0 obj +<< +/K [2047 0 R 2049 0 R 2051 0 R 2053 0 R 2056 0 R 2059 0 R 2061 0 R 2062 0 R 2063 0 R 2064 0 R +2065 0 R 2066 0 R 2067 0 R 2068 0 R 2069 0 R 2070 0 R 2071 0 R 2072 0 R] +/P 2101 0 R +/S /Table +>> +endobj +2096 0 obj +<< +/K 2050 0 R +/P 2048 0 R +/S /Sect +>> +endobj +2097 0 obj +<< +/K 2054 0 R +/P 2052 0 R +/S /Sect +>> +endobj +2098 0 obj +<< +/K 2057 0 R +/P 2055 0 R +/S /Sect +>> +endobj +2099 0 obj +<< +/K 2060 0 R +/P 2058 0 R +/S /Sect +>> +endobj +2100 0 obj +<< +/K [2073 0 R 2074 0 R 2075 0 R 2076 0 R 2077 0 R 2078 0 R 2079 0 R 2080 0 R 2081 0 R 2083 0 R +2085 0 R 2086 0 R 2087 0 R] +/P 2102 0 R +/S /Table +>> +endobj +2101 0 obj +<< +/K 2095 0 R +/P 2090 0 R +/S /Sect +>> +endobj +2102 0 obj +<< +/K 2100 0 R +/P 2091 0 R +/S /Sect +>> +endobj +xref +0 2103 +0000000000 65535 f +0000000015 00000 n +0000000351 00000 n +0000000430 00000 n +0000002928 00000 n +0000003000 00000 n +0000003124 00000 n +0000003252 00000 n +0000000172 00000 n +0000003295 00000 n +0000004488 00000 n +0000005678 00000 n +0000005699 00000 n +0000005979 00000 n +0000006214 00000 n +0000006449 00000 n +0000006594 00000 n +0000006678 00000 n +0000015162 00000 n +0000015234 00000 n +0000015268 00000 n +0000015327 00000 n +0000015575 00000 n +0000015818 00000 n +0000020023 00000 n +0000093842 00000 n +0000098769 00000 n +0000103434 00000 n +0000103596 00000 n +0000103708 00000 n +0000103802 00000 n +0000103896 00000 n +0000103973 00000 n +0000104029 00000 n +0000104105 00000 n +0000104183 00000 n +0000104239 00000 n +0000104314 00000 n +0000104370 00000 n +0000104426 00000 n +0000104505 00000 n +0000104561 00000 n +0000104637 00000 n +0000104694 00000 n +0000104768 00000 n +0000104825 00000 n +0000104882 00000 n +0000104973 00000 n +0000105030 00000 n +0000105087 00000 n +0000105144 00000 n +0000105199 00000 n +0000105256 00000 n +0000105313 00000 n +0000105370 00000 n +0000105427 00000 n +0000105484 00000 n +0000105541 00000 n +0000105598 00000 n +0000105655 00000 n +0000105712 00000 n +0000105782 00000 n +0000105839 00000 n +0000105896 00000 n +0000105966 00000 n +0000106023 00000 n +0000106080 00000 n +0000106137 00000 n +0000106194 00000 n +0000106264 00000 n +0000106321 00000 n +0000106400 00000 n +0000106457 00000 n +0000106514 00000 n +0000106588 00000 n +0000106645 00000 n +0000106715 00000 n +0000106772 00000 n +0000106848 00000 n +0000106905 00000 n +0000106962 00000 n +0000107019 00000 n +0000107095 00000 n +0000107152 00000 n +0000107209 00000 n +0000107266 00000 n +0000107323 00000 n +0000107380 00000 n +0000107437 00000 n +0000107494 00000 n +0000107551 00000 n +0000107625 00000 n +0000107682 00000 n +0000107750 00000 n +0000107807 00000 n +0000107874 00000 n +0000107931 00000 n +0000108004 00000 n +0000108061 00000 n +0000108118 00000 n +0000108187 00000 n +0000108245 00000 n +0000108325 00000 n +0000108383 00000 n +0000108441 00000 n +0000108515 00000 n +0000108573 00000 n +0000108644 00000 n +0000108702 00000 n +0000108777 00000 n +0000108835 00000 n +0000108909 00000 n +0000108967 00000 n +0000109038 00000 n +0000109096 00000 n +0000109167 00000 n +0000109225 00000 n +0000109296 00000 n +0000109354 00000 n +0000109425 00000 n +0000109483 00000 n +0000109557 00000 n +0000109615 00000 n +0000109689 00000 n +0000109747 00000 n +0000109824 00000 n +0000109882 00000 n +0000109940 00000 n +0000110014 00000 n +0000110072 00000 n +0000110143 00000 n +0000110201 00000 n +0000110277 00000 n +0000110336 00000 n +0000110411 00000 n +0000110470 00000 n +0000110542 00000 n +0000110601 00000 n +0000110673 00000 n +0000110732 00000 n +0000110804 00000 n +0000110863 00000 n +0000110935 00000 n +0000110994 00000 n +0000111069 00000 n +0000111128 00000 n +0000111203 00000 n +0000111262 00000 n +0000111340 00000 n +0000111399 00000 n +0000111458 00000 n +0000111533 00000 n +0000111592 00000 n +0000111664 00000 n +0000111723 00000 n +0000111799 00000 n +0000111858 00000 n +0000111933 00000 n +0000111992 00000 n +0000112064 00000 n +0000112123 00000 n +0000112195 00000 n +0000112254 00000 n +0000112326 00000 n +0000112385 00000 n +0000112457 00000 n +0000112516 00000 n +0000112591 00000 n +0000112650 00000 n +0000112725 00000 n +0000112784 00000 n +0000112862 00000 n +0000112921 00000 n +0000112980 00000 n +0000113055 00000 n +0000113114 00000 n +0000113186 00000 n +0000113245 00000 n +0000113321 00000 n +0000113380 00000 n +0000113455 00000 n +0000113514 00000 n +0000113586 00000 n +0000113645 00000 n +0000113717 00000 n +0000113776 00000 n +0000113848 00000 n +0000113907 00000 n +0000113979 00000 n +0000114038 00000 n +0000114113 00000 n +0000114172 00000 n +0000114247 00000 n +0000114306 00000 n +0000114384 00000 n +0000114443 00000 n +0000114502 00000 n +0000114577 00000 n +0000114636 00000 n +0000114708 00000 n +0000114767 00000 n +0000114843 00000 n +0000114902 00000 n +0000114977 00000 n +0000115036 00000 n +0000115108 00000 n +0000115167 00000 n +0000115239 00000 n +0000115298 00000 n +0000115370 00000 n +0000115429 00000 n +0000115501 00000 n +0000115560 00000 n +0000115635 00000 n +0000115694 00000 n +0000115769 00000 n +0000115828 00000 n +0000115906 00000 n +0000115965 00000 n +0000116024 00000 n +0000116099 00000 n +0000116158 00000 n +0000116230 00000 n +0000116289 00000 n +0000116365 00000 n +0000116424 00000 n +0000116499 00000 n +0000116571 00000 n +0000116630 00000 n +0000116702 00000 n +0000116761 00000 n +0000116833 00000 n +0000116892 00000 n +0000116964 00000 n +0000117023 00000 n +0000117098 00000 n +0000117157 00000 n +0000117232 00000 n +0000117291 00000 n +0000117369 00000 n +0000117428 00000 n +0000117487 00000 n +0000117546 00000 n +0000117626 00000 n +0000117685 00000 n +0000117760 00000 n +0000117819 00000 n +0000117891 00000 n +0000117950 00000 n +0000118026 00000 n +0000118085 00000 n +0000118160 00000 n +0000118219 00000 n +0000118291 00000 n +0000118350 00000 n +0000118422 00000 n +0000118481 00000 n +0000118553 00000 n +0000118612 00000 n +0000118684 00000 n +0000118743 00000 n +0000118818 00000 n +0000118877 00000 n +0000118952 00000 n +0000119011 00000 n +0000119089 00000 n +0000119148 00000 n +0000119207 00000 n +0000119266 00000 n +0000119346 00000 n +0000119405 00000 n +0000119480 00000 n +0000119539 00000 n +0000119611 00000 n +0000119670 00000 n +0000119746 00000 n +0000119805 00000 n +0000119880 00000 n +0000119939 00000 n +0000120011 00000 n +0000120070 00000 n +0000120142 00000 n +0000120201 00000 n +0000120273 00000 n +0000120332 00000 n +0000120404 00000 n +0000120463 00000 n +0000120538 00000 n +0000120597 00000 n +0000120672 00000 n +0000120731 00000 n +0000120809 00000 n +0000120868 00000 n +0000120927 00000 n +0000121002 00000 n +0000121061 00000 n +0000121133 00000 n +0000121192 00000 n +0000121268 00000 n +0000121327 00000 n +0000121402 00000 n +0000121461 00000 n +0000121533 00000 n +0000121592 00000 n +0000121664 00000 n +0000121723 00000 n +0000121795 00000 n +0000121854 00000 n +0000121926 00000 n +0000121985 00000 n +0000122060 00000 n +0000122119 00000 n +0000122194 00000 n +0000122253 00000 n +0000122331 00000 n +0000122390 00000 n +0000122447 00000 n +0000122524 00000 n +0000122603 00000 n +0000122660 00000 n +0000122717 00000 n +0000122774 00000 n +0000122831 00000 n +0000122907 00000 n +0000122964 00000 n +0000123044 00000 n +0000123102 00000 n +0000123179 00000 n +0000123237 00000 n +0000123295 00000 n +0000123353 00000 n +0000123430 00000 n +0000123488 00000 n +0000123546 00000 n +0000123604 00000 n +0000123662 00000 n +0000123720 00000 n +0000123778 00000 n +0000123836 00000 n +0000123894 00000 n +0000123968 00000 n +0000124026 00000 n +0000124097 00000 n +0000124155 00000 n +0000124230 00000 n +0000124288 00000 n +0000124362 00000 n +0000124420 00000 n +0000124491 00000 n +0000124549 00000 n +0000124620 00000 n +0000124678 00000 n +0000124749 00000 n +0000124807 00000 n +0000124878 00000 n +0000124936 00000 n +0000125010 00000 n +0000125068 00000 n +0000125142 00000 n +0000125200 00000 n +0000125277 00000 n +0000125335 00000 n +0000125393 00000 n +0000125467 00000 n +0000125525 00000 n +0000125596 00000 n +0000125654 00000 n +0000125729 00000 n +0000125787 00000 n +0000125861 00000 n +0000125919 00000 n +0000125990 00000 n +0000126048 00000 n +0000126119 00000 n +0000126177 00000 n +0000126248 00000 n +0000126306 00000 n +0000126377 00000 n +0000126435 00000 n +0000126509 00000 n +0000126567 00000 n +0000126641 00000 n +0000126699 00000 n +0000126776 00000 n +0000126834 00000 n +0000126892 00000 n +0000126950 00000 n +0000127029 00000 n +0000127087 00000 n +0000127161 00000 n +0000127219 00000 n +0000127290 00000 n +0000127348 00000 n +0000127423 00000 n +0000127481 00000 n +0000127555 00000 n +0000127613 00000 n +0000127684 00000 n +0000127742 00000 n +0000127813 00000 n +0000127871 00000 n +0000127942 00000 n +0000128000 00000 n +0000128071 00000 n +0000128129 00000 n +0000128203 00000 n +0000128261 00000 n +0000128335 00000 n +0000128393 00000 n +0000128470 00000 n +0000128528 00000 n +0000128586 00000 n +0000128660 00000 n +0000128718 00000 n +0000128789 00000 n +0000128847 00000 n +0000128923 00000 n +0000128982 00000 n +0000129057 00000 n +0000129129 00000 n +0000129188 00000 n +0000129260 00000 n +0000129319 00000 n +0000129391 00000 n +0000129450 00000 n +0000129522 00000 n +0000129581 00000 n +0000129656 00000 n +0000129715 00000 n +0000129790 00000 n +0000129849 00000 n +0000129927 00000 n +0000129986 00000 n +0000130045 00000 n +0000130104 00000 n +0000130184 00000 n +0000130243 00000 n +0000130318 00000 n +0000130377 00000 n +0000130449 00000 n +0000130508 00000 n +0000130584 00000 n +0000130643 00000 n +0000130718 00000 n +0000130790 00000 n +0000130849 00000 n +0000130921 00000 n +0000130980 00000 n +0000131052 00000 n +0000131111 00000 n +0000131183 00000 n +0000131242 00000 n +0000131317 00000 n +0000131376 00000 n +0000131451 00000 n +0000131510 00000 n +0000131588 00000 n +0000131647 00000 n +0000131706 00000 n +0000131765 00000 n +0000131845 00000 n +0000131904 00000 n +0000131979 00000 n +0000132038 00000 n +0000132110 00000 n +0000132169 00000 n +0000132245 00000 n +0000132304 00000 n +0000132379 00000 n +0000132451 00000 n +0000132510 00000 n +0000132582 00000 n +0000132641 00000 n +0000132713 00000 n +0000132772 00000 n +0000132844 00000 n +0000132903 00000 n +0000132978 00000 n +0000133037 00000 n +0000133112 00000 n +0000133171 00000 n +0000133249 00000 n +0000133308 00000 n +0000133367 00000 n +0000133426 00000 n +0000133506 00000 n +0000133565 00000 n +0000133640 00000 n +0000133699 00000 n +0000133771 00000 n +0000133830 00000 n +0000133906 00000 n +0000133965 00000 n +0000134040 00000 n +0000134099 00000 n +0000134171 00000 n +0000134230 00000 n +0000134302 00000 n +0000134361 00000 n +0000134433 00000 n +0000134492 00000 n +0000134564 00000 n +0000134623 00000 n +0000134698 00000 n +0000134757 00000 n +0000134832 00000 n +0000134891 00000 n +0000134969 00000 n +0000135028 00000 n +0000135087 00000 n +0000135162 00000 n +0000135221 00000 n +0000135293 00000 n +0000135352 00000 n +0000135428 00000 n +0000135487 00000 n +0000135562 00000 n +0000135621 00000 n +0000135693 00000 n +0000135752 00000 n +0000135824 00000 n +0000135883 00000 n +0000135955 00000 n +0000136014 00000 n +0000136086 00000 n +0000136145 00000 n +0000136220 00000 n +0000136279 00000 n +0000136354 00000 n +0000136413 00000 n +0000136491 00000 n +0000136550 00000 n +0000136609 00000 n +0000136684 00000 n +0000136743 00000 n +0000136815 00000 n +0000136874 00000 n +0000136950 00000 n +0000137009 00000 n +0000137084 00000 n +0000137143 00000 n +0000137215 00000 n +0000137274 00000 n +0000137346 00000 n +0000137405 00000 n +0000137477 00000 n +0000137536 00000 n +0000137608 00000 n +0000137667 00000 n +0000137742 00000 n +0000137801 00000 n +0000137876 00000 n +0000137935 00000 n +0000138013 00000 n +0000138072 00000 n +0000138131 00000 n +0000138206 00000 n +0000138265 00000 n +0000138337 00000 n +0000138396 00000 n +0000138472 00000 n +0000138531 00000 n +0000138606 00000 n +0000138665 00000 n +0000138737 00000 n +0000138796 00000 n +0000138868 00000 n +0000138927 00000 n +0000138999 00000 n +0000139058 00000 n +0000139130 00000 n +0000139189 00000 n +0000139264 00000 n +0000139323 00000 n +0000139398 00000 n +0000139457 00000 n +0000139535 00000 n +0000139594 00000 n +0000139653 00000 n +0000139728 00000 n +0000139787 00000 n +0000139859 00000 n +0000139918 00000 n +0000139994 00000 n +0000140053 00000 n +0000140128 00000 n +0000140187 00000 n +0000140259 00000 n +0000140318 00000 n +0000140390 00000 n +0000140449 00000 n +0000140521 00000 n +0000140580 00000 n +0000140652 00000 n +0000140711 00000 n +0000140786 00000 n +0000140845 00000 n +0000140920 00000 n +0000140979 00000 n +0000141057 00000 n +0000141116 00000 n +0000141175 00000 n +0000141250 00000 n +0000141309 00000 n +0000141381 00000 n +0000141440 00000 n +0000141516 00000 n +0000141575 00000 n +0000141650 00000 n +0000141709 00000 n +0000141781 00000 n +0000141840 00000 n +0000141912 00000 n +0000141971 00000 n +0000142043 00000 n +0000142102 00000 n +0000142174 00000 n +0000142233 00000 n +0000142308 00000 n +0000142367 00000 n +0000142442 00000 n +0000142501 00000 n +0000142579 00000 n +0000142638 00000 n +0000142697 00000 n +0000142772 00000 n +0000142831 00000 n +0000142903 00000 n +0000142962 00000 n +0000143038 00000 n +0000143097 00000 n +0000143172 00000 n +0000143231 00000 n +0000143303 00000 n +0000143362 00000 n +0000143434 00000 n +0000143493 00000 n +0000143565 00000 n +0000143624 00000 n +0000143696 00000 n +0000143755 00000 n +0000143830 00000 n +0000143889 00000 n +0000143964 00000 n +0000144023 00000 n +0000144101 00000 n +0000144160 00000 n +0000144219 00000 n +0000144294 00000 n +0000144353 00000 n +0000144425 00000 n +0000144484 00000 n +0000144560 00000 n +0000144619 00000 n +0000144694 00000 n +0000144753 00000 n +0000144825 00000 n +0000144884 00000 n +0000144956 00000 n +0000145015 00000 n +0000145087 00000 n +0000145146 00000 n +0000145218 00000 n +0000145277 00000 n +0000145352 00000 n +0000145411 00000 n +0000145486 00000 n +0000145545 00000 n +0000145623 00000 n +0000145682 00000 n +0000145741 00000 n +0000145816 00000 n +0000145875 00000 n +0000145947 00000 n +0000146006 00000 n +0000146082 00000 n +0000146141 00000 n +0000146216 00000 n +0000146275 00000 n +0000146347 00000 n +0000146406 00000 n +0000146478 00000 n +0000146537 00000 n +0000146609 00000 n +0000146668 00000 n +0000146740 00000 n +0000146799 00000 n +0000146874 00000 n +0000146933 00000 n +0000147008 00000 n +0000147067 00000 n +0000147145 00000 n +0000147204 00000 n +0000147263 00000 n +0000147338 00000 n +0000147397 00000 n +0000147469 00000 n +0000147528 00000 n +0000147604 00000 n +0000147663 00000 n +0000147738 00000 n +0000147797 00000 n +0000147869 00000 n +0000147928 00000 n +0000148000 00000 n +0000148059 00000 n +0000148131 00000 n +0000148190 00000 n +0000148262 00000 n +0000148321 00000 n +0000148396 00000 n +0000148455 00000 n +0000148530 00000 n +0000148589 00000 n +0000148667 00000 n +0000148726 00000 n +0000148785 00000 n +0000148860 00000 n +0000148919 00000 n +0000148991 00000 n +0000149050 00000 n +0000149126 00000 n +0000149185 00000 n +0000149260 00000 n +0000149319 00000 n +0000149391 00000 n +0000149450 00000 n +0000149522 00000 n +0000149581 00000 n +0000149653 00000 n +0000149712 00000 n +0000149784 00000 n +0000149843 00000 n +0000149918 00000 n +0000149977 00000 n +0000150052 00000 n +0000150111 00000 n +0000150189 00000 n +0000150248 00000 n +0000150307 00000 n +0000150382 00000 n +0000150441 00000 n +0000150513 00000 n +0000150572 00000 n +0000150648 00000 n +0000150705 00000 n +0000150782 00000 n +0000150861 00000 n +0000150918 00000 n +0000150975 00000 n +0000151032 00000 n +0000151089 00000 n +0000151165 00000 n +0000151222 00000 n +0000151302 00000 n +0000151360 00000 n +0000151437 00000 n +0000151495 00000 n +0000151553 00000 n +0000151611 00000 n +0000151688 00000 n +0000151746 00000 n +0000151804 00000 n +0000151862 00000 n +0000151920 00000 n +0000151978 00000 n +0000152036 00000 n +0000152094 00000 n +0000152152 00000 n +0000152226 00000 n +0000152284 00000 n +0000152355 00000 n +0000152413 00000 n +0000152484 00000 n +0000152542 00000 n +0000152613 00000 n +0000152671 00000 n +0000152742 00000 n +0000152800 00000 n +0000152874 00000 n +0000152932 00000 n +0000153006 00000 n +0000153064 00000 n +0000153141 00000 n +0000153199 00000 n +0000153257 00000 n +0000153331 00000 n +0000153389 00000 n +0000153460 00000 n +0000153518 00000 n +0000153593 00000 n +0000153651 00000 n +0000153725 00000 n +0000153783 00000 n +0000153854 00000 n +0000153912 00000 n +0000153983 00000 n +0000154041 00000 n +0000154112 00000 n +0000154170 00000 n +0000154241 00000 n +0000154299 00000 n +0000154373 00000 n +0000154431 00000 n +0000154505 00000 n +0000154563 00000 n +0000154640 00000 n +0000154698 00000 n +0000154756 00000 n +0000154830 00000 n +0000154888 00000 n +0000154959 00000 n +0000155017 00000 n +0000155092 00000 n +0000155150 00000 n +0000155224 00000 n +0000155282 00000 n +0000155353 00000 n +0000155411 00000 n +0000155482 00000 n +0000155540 00000 n +0000155611 00000 n +0000155669 00000 n +0000155740 00000 n +0000155798 00000 n +0000155872 00000 n +0000155930 00000 n +0000156004 00000 n +0000156062 00000 n +0000156139 00000 n +0000156197 00000 n +0000156255 00000 n +0000156329 00000 n +0000156387 00000 n +0000156458 00000 n +0000156516 00000 n +0000156591 00000 n +0000156649 00000 n +0000156723 00000 n +0000156781 00000 n +0000156852 00000 n +0000156910 00000 n +0000156981 00000 n +0000157039 00000 n +0000157110 00000 n +0000157169 00000 n +0000157241 00000 n +0000157300 00000 n +0000157375 00000 n +0000157434 00000 n +0000157509 00000 n +0000157568 00000 n +0000157646 00000 n +0000157705 00000 n +0000157764 00000 n +0000157839 00000 n +0000157898 00000 n +0000157970 00000 n +0000158029 00000 n +0000158105 00000 n +0000158164 00000 n +0000158239 00000 n +0000158298 00000 n +0000158370 00000 n +0000158429 00000 n +0000158501 00000 n +0000158560 00000 n +0000158632 00000 n +0000158691 00000 n +0000158763 00000 n +0000158822 00000 n +0000158897 00000 n +0000158956 00000 n +0000159031 00000 n +0000159090 00000 n +0000159168 00000 n +0000159227 00000 n +0000159286 00000 n +0000159361 00000 n +0000159420 00000 n +0000159492 00000 n +0000159551 00000 n +0000159627 00000 n +0000159686 00000 n +0000159761 00000 n +0000159820 00000 n +0000159892 00000 n +0000159951 00000 n +0000160023 00000 n +0000160082 00000 n +0000160154 00000 n +0000160213 00000 n +0000160285 00000 n +0000160344 00000 n +0000160419 00000 n +0000160478 00000 n +0000160553 00000 n +0000160612 00000 n +0000160690 00000 n +0000160749 00000 n +0000160808 00000 n +0000160883 00000 n +0000160942 00000 n +0000161014 00000 n +0000161073 00000 n +0000161149 00000 n +0000161208 00000 n +0000161283 00000 n +0000161342 00000 n +0000161414 00000 n +0000161473 00000 n +0000161545 00000 n +0000161604 00000 n +0000161676 00000 n +0000161735 00000 n +0000161807 00000 n +0000161866 00000 n +0000161941 00000 n +0000162000 00000 n +0000162075 00000 n +0000162134 00000 n +0000162212 00000 n +0000162271 00000 n +0000162330 00000 n +0000162405 00000 n +0000162464 00000 n +0000162536 00000 n +0000162595 00000 n +0000162671 00000 n +0000162730 00000 n +0000162805 00000 n +0000162864 00000 n +0000162936 00000 n +0000162995 00000 n +0000163067 00000 n +0000163126 00000 n +0000163198 00000 n +0000163257 00000 n +0000163329 00000 n +0000163388 00000 n +0000163463 00000 n +0000163522 00000 n +0000163597 00000 n +0000163656 00000 n +0000163734 00000 n +0000163793 00000 n +0000163852 00000 n +0000163927 00000 n +0000163986 00000 n +0000164058 00000 n +0000164117 00000 n +0000164193 00000 n +0000164252 00000 n +0000164327 00000 n +0000164386 00000 n +0000164458 00000 n +0000164517 00000 n +0000164589 00000 n +0000164648 00000 n +0000164720 00000 n +0000164779 00000 n +0000164851 00000 n +0000164910 00000 n +0000164985 00000 n +0000165044 00000 n +0000165119 00000 n +0000165178 00000 n +0000165256 00000 n +0000165315 00000 n +0000165374 00000 n +0000165449 00000 n +0000165508 00000 n +0000165580 00000 n +0000165639 00000 n +0000165715 00000 n +0000165774 00000 n +0000165849 00000 n +0000165908 00000 n +0000165980 00000 n +0000166039 00000 n +0000166111 00000 n +0000166170 00000 n +0000166242 00000 n +0000166301 00000 n +0000166373 00000 n +0000166432 00000 n +0000166507 00000 n +0000166566 00000 n +0000166641 00000 n +0000166700 00000 n +0000166778 00000 n +0000166837 00000 n +0000166896 00000 n +0000166968 00000 n +0000167040 00000 n +0000167112 00000 n +0000167184 00000 n +0000167243 00000 n +0000167318 00000 n +0000167377 00000 n +0000167449 00000 n +0000167509 00000 n +0000167586 00000 n +0000167646 00000 n +0000167722 00000 n +0000167782 00000 n +0000167855 00000 n +0000167915 00000 n +0000167988 00000 n +0000168048 00000 n +0000168121 00000 n +0000168181 00000 n +0000168254 00000 n +0000168314 00000 n +0000168390 00000 n +0000168450 00000 n +0000168526 00000 n +0000168586 00000 n +0000168665 00000 n +0000168725 00000 n +0000168785 00000 n +0000168861 00000 n +0000168921 00000 n +0000168994 00000 n +0000169054 00000 n +0000169131 00000 n +0000169191 00000 n +0000169267 00000 n +0000169327 00000 n +0000169400 00000 n +0000169460 00000 n +0000169533 00000 n +0000169593 00000 n +0000169666 00000 n +0000169726 00000 n +0000169799 00000 n +0000169859 00000 n +0000169935 00000 n +0000169995 00000 n +0000170071 00000 n +0000170131 00000 n +0000170210 00000 n +0000170270 00000 n +0000170330 00000 n +0000170406 00000 n +0000170466 00000 n +0000170539 00000 n +0000170599 00000 n +0000170676 00000 n +0000170736 00000 n +0000170812 00000 n +0000170872 00000 n +0000170945 00000 n +0000171005 00000 n +0000171078 00000 n +0000171138 00000 n +0000171211 00000 n +0000171271 00000 n +0000171344 00000 n +0000171404 00000 n +0000171480 00000 n +0000171540 00000 n +0000171616 00000 n +0000171676 00000 n +0000171755 00000 n +0000171815 00000 n +0000171875 00000 n +0000171950 00000 n +0000172010 00000 n +0000172070 00000 n +0000172149 00000 n +0000172209 00000 n +0000172282 00000 n +0000172342 00000 n +0000172415 00000 n +0000172475 00000 n +0000172548 00000 n +0000172608 00000 n +0000172681 00000 n +0000172741 00000 n +0000172801 00000 n +0000172880 00000 n +0000172940 00000 n +0000173024 00000 n +0000173084 00000 n +0000262857 00000 n +0000263487 00000 n +0000263540 00000 n +0000263606 00000 n +0000263658 00000 n +0000263713 00000 n +0000263768 00000 n +0000263823 00000 n +0000263889 00000 n +0000263964 00000 n +0000264019 00000 n +0000264074 00000 n +0000264140 00000 n +0000264215 00000 n +0000264270 00000 n +0000264336 00000 n +0000264402 00000 n +0000264465 00000 n +0000264519 00000 n +0000264582 00000 n +0000264636 00000 n +0000264699 00000 n +0000264762 00000 n +0000264825 00000 n +0000264879 00000 n +0000264942 00000 n +0000264996 00000 n +0000265050 00000 n +0000265104 00000 n +0000265157 00000 n +0000265211 00000 n +0000265265 00000 n +0000265319 00000 n +0000265373 00000 n +0000265427 00000 n +0000265481 00000 n +0000265535 00000 n +0000265598 00000 n +0000265652 00000 n +0000265715 00000 n +0000265769 00000 n +0000265823 00000 n +0000265877 00000 n +0000265940 00000 n +0000266003 00000 n +0000266057 00000 n +0000266120 00000 n +0000266183 00000 n +0000266246 00000 n +0000266300 00000 n +0000266354 00000 n +0000266417 00000 n +0000266471 00000 n +0000266525 00000 n +0000266579 00000 n +0000266633 00000 n +0000266687 00000 n +0000266741 00000 n +0000266795 00000 n +0000266858 00000 n +0000266921 00000 n +0000266984 00000 n +0000267047 00000 n +0000267101 00000 n +0000267164 00000 n +0000267229 00000 n +0000267284 00000 n +0000267349 00000 n +0000267414 00000 n +0000267479 00000 n +0000267544 00000 n +0000267609 00000 n +0000267674 00000 n +0000267739 00000 n +0000267804 00000 n +0000267869 00000 n +0000267934 00000 n +0000267999 00000 n +0000268054 00000 n +0000268119 00000 n +0000268184 00000 n +0000268249 00000 n +0000268314 00000 n +0000268379 00000 n +0000268444 00000 n +0000268509 00000 n +0000268574 00000 n +0000268639 00000 n +0000268704 00000 n +0000268769 00000 n +0000268824 00000 n +0000268889 00000 n +0000268954 00000 n +0000269019 00000 n +0000269084 00000 n +0000269149 00000 n +0000269214 00000 n +0000269279 00000 n +0000269344 00000 n +0000269409 00000 n +0000269474 00000 n +0000269539 00000 n +0000269594 00000 n +0000269659 00000 n +0000269724 00000 n +0000269789 00000 n +0000269854 00000 n +0000269919 00000 n +0000269984 00000 n +0000270049 00000 n +0000270114 00000 n +0000270179 00000 n +0000270244 00000 n +0000270309 00000 n +0000270364 00000 n +0000270429 00000 n +0000270494 00000 n +0000270559 00000 n +0000270624 00000 n +0000270689 00000 n +0000270754 00000 n +0000270819 00000 n +0000270884 00000 n +0000270949 00000 n +0000271014 00000 n +0000271079 00000 n +0000271134 00000 n +0000271199 00000 n +0000271264 00000 n +0000271329 00000 n +0000271394 00000 n +0000271449 00000 n +0000271514 00000 n +0000271579 00000 n +0000271644 00000 n +0000271709 00000 n +0000271774 00000 n +0000271839 00000 n +0000271894 00000 n +0000271949 00000 n +0000272014 00000 n +0000272079 00000 n +0000272144 00000 n +0000272209 00000 n +0000272274 00000 n +0000272339 00000 n +0000272404 00000 n +0000272469 00000 n +0000272534 00000 n +0000272599 00000 n +0000272664 00000 n +0000272729 00000 n +0000272784 00000 n +0000272839 00000 n +0000272904 00000 n +0000272969 00000 n +0000273034 00000 n +0000273099 00000 n +0000273164 00000 n +0000273229 00000 n +0000273294 00000 n +0000273359 00000 n +0000273424 00000 n +0000273489 00000 n +0000273554 00000 n +0000273619 00000 n +0000273674 00000 n +0000273739 00000 n +0000273804 00000 n +0000273869 00000 n +0000273934 00000 n +0000273999 00000 n +0000274064 00000 n +0000274129 00000 n +0000274194 00000 n +0000274259 00000 n +0000274324 00000 n +0000274389 00000 n +0000274444 00000 n +0000274509 00000 n +0000274564 00000 n +0000274619 00000 n +0000274674 00000 n +0000274729 00000 n +0000274794 00000 n +0000274859 00000 n +0000274924 00000 n +0000274979 00000 n +0000275034 00000 n +0000275099 00000 n +0000275154 00000 n +0000275209 00000 n +0000275264 00000 n +0000275319 00000 n +0000275374 00000 n +0000275429 00000 n +0000275484 00000 n +0000275549 00000 n +0000275614 00000 n +0000275679 00000 n +0000275744 00000 n +0000275809 00000 n +0000275874 00000 n +0000275939 00000 n +0000276004 00000 n +0000276069 00000 n +0000276134 00000 n +0000276199 00000 n +0000276254 00000 n +0000276319 00000 n +0000276384 00000 n +0000276449 00000 n +0000276514 00000 n +0000276579 00000 n +0000276644 00000 n +0000276709 00000 n +0000276774 00000 n +0000276839 00000 n +0000276904 00000 n +0000276969 00000 n +0000277024 00000 n +0000277079 00000 n +0000277144 00000 n +0000277209 00000 n +0000277274 00000 n +0000277339 00000 n +0000277404 00000 n +0000277469 00000 n +0000277534 00000 n +0000277599 00000 n +0000277664 00000 n +0000277729 00000 n +0000277794 00000 n +0000277859 00000 n +0000277914 00000 n +0000277979 00000 n +0000278044 00000 n +0000278109 00000 n +0000278174 00000 n +0000278229 00000 n +0000278294 00000 n +0000278359 00000 n +0000278424 00000 n +0000278489 00000 n +0000278554 00000 n +0000278619 00000 n +0000278674 00000 n +0000278729 00000 n +0000278794 00000 n +0000278859 00000 n +0000278924 00000 n +0000278989 00000 n +0000279054 00000 n +0000279109 00000 n +0000279174 00000 n +0000279239 00000 n +0000279304 00000 n +0000279369 00000 n +0000279434 00000 n +0000279499 00000 n +0000279554 00000 n +0000279609 00000 n +0000279674 00000 n +0000279739 00000 n +0000279804 00000 n +0000279869 00000 n +0000279934 00000 n +0000279989 00000 n +0000280054 00000 n +0000280119 00000 n +0000280184 00000 n +0000280249 00000 n +0000280314 00000 n +0000280379 00000 n +0000280434 00000 n +0000280489 00000 n +0000280554 00000 n +0000280619 00000 n +0000280684 00000 n +0000280749 00000 n +0000280814 00000 n +0000280879 00000 n +0000280944 00000 n +0000281009 00000 n +0000281074 00000 n +0000281139 00000 n +0000281204 00000 n +0000281269 00000 n +0000281324 00000 n +0000281389 00000 n +0000281454 00000 n +0000281519 00000 n +0000281584 00000 n +0000281649 00000 n +0000281714 00000 n +0000281779 00000 n +0000281844 00000 n +0000281909 00000 n +0000281974 00000 n +0000282039 00000 n +0000282094 00000 n +0000282159 00000 n +0000282224 00000 n +0000282289 00000 n +0000282354 00000 n +0000282419 00000 n +0000282484 00000 n +0000282549 00000 n +0000282614 00000 n +0000282679 00000 n +0000282744 00000 n +0000282809 00000 n +0000282864 00000 n +0000282929 00000 n +0000282994 00000 n +0000283059 00000 n +0000283124 00000 n +0000283189 00000 n +0000283254 00000 n +0000283319 00000 n +0000283384 00000 n +0000283449 00000 n +0000283514 00000 n +0000283579 00000 n +0000283634 00000 n +0000283699 00000 n +0000283764 00000 n +0000283829 00000 n +0000283894 00000 n +0000283959 00000 n +0000284024 00000 n +0000284089 00000 n +0000284154 00000 n +0000284219 00000 n +0000284284 00000 n +0000284349 00000 n +0000284404 00000 n +0000284469 00000 n +0000284534 00000 n +0000284599 00000 n +0000284664 00000 n +0000284729 00000 n +0000284794 00000 n +0000284859 00000 n +0000284924 00000 n +0000284989 00000 n +0000285054 00000 n +0000285119 00000 n +0000285174 00000 n +0000285239 00000 n +0000285304 00000 n +0000285369 00000 n +0000285434 00000 n +0000285499 00000 n +0000285564 00000 n +0000285629 00000 n +0000285694 00000 n +0000285759 00000 n +0000285824 00000 n +0000285889 00000 n +0000285944 00000 n +0000286009 00000 n +0000286074 00000 n +0000286139 00000 n +0000286204 00000 n +0000286269 00000 n +0000286334 00000 n +0000286399 00000 n +0000286464 00000 n +0000286529 00000 n +0000286594 00000 n +0000286659 00000 n +0000286714 00000 n +0000286779 00000 n +0000286844 00000 n +0000286909 00000 n +0000286974 00000 n +0000287039 00000 n +0000287104 00000 n +0000287169 00000 n +0000287234 00000 n +0000287299 00000 n +0000287364 00000 n +0000287429 00000 n +0000287484 00000 n +0000287549 00000 n +0000287614 00000 n +0000287679 00000 n +0000287744 00000 n +0000287809 00000 n +0000287874 00000 n +0000287939 00000 n +0000288004 00000 n +0000288069 00000 n +0000288134 00000 n +0000288199 00000 n +0000288254 00000 n +0000288319 00000 n +0000288384 00000 n +0000288449 00000 n +0000288514 00000 n +0000288579 00000 n +0000288644 00000 n +0000288709 00000 n +0000288774 00000 n +0000288839 00000 n +0000288904 00000 n +0000288969 00000 n +0000289024 00000 n +0000289089 00000 n +0000289154 00000 n +0000289219 00000 n +0000289284 00000 n +0000289339 00000 n +0000289394 00000 n +0000289449 00000 n +0000289504 00000 n +0000289569 00000 n +0000289634 00000 n +0000289699 00000 n +0000289754 00000 n +0000289809 00000 n +0000289874 00000 n +0000289929 00000 n +0000289984 00000 n +0000290039 00000 n +0000290094 00000 n +0000290149 00000 n +0000290204 00000 n +0000290259 00000 n +0000290324 00000 n +0000290389 00000 n +0000290454 00000 n +0000290519 00000 n +0000290584 00000 n +0000290649 00000 n +0000290714 00000 n +0000290779 00000 n +0000290834 00000 n +0000290899 00000 n +0000290964 00000 n +0000291029 00000 n +0000291094 00000 n +0000291159 00000 n +0000291224 00000 n +0000291289 00000 n +0000291354 00000 n +0000291419 00000 n +0000291484 00000 n +0000291549 00000 n +0000291604 00000 n +0000291669 00000 n +0000291734 00000 n +0000291799 00000 n +0000291864 00000 n +0000291929 00000 n +0000291994 00000 n +0000292059 00000 n +0000292124 00000 n +0000292189 00000 n +0000292254 00000 n +0000292319 00000 n +0000292374 00000 n +0000292439 00000 n +0000292504 00000 n +0000292569 00000 n +0000292634 00000 n +0000292699 00000 n +0000292764 00000 n +0000292829 00000 n +0000292894 00000 n +0000292959 00000 n +0000293024 00000 n +0000293089 00000 n +0000293144 00000 n +0000293209 00000 n +0000293274 00000 n +0000293339 00000 n +0000293404 00000 n +0000293469 00000 n +0000293534 00000 n +0000293599 00000 n +0000293664 00000 n +0000293729 00000 n +0000293794 00000 n +0000293859 00000 n +0000293914 00000 n +0000293979 00000 n +0000294044 00000 n +0000294109 00000 n +0000294174 00000 n +0000294239 00000 n +0000294304 00000 n +0000294369 00000 n +0000294434 00000 n +0000294499 00000 n +0000294564 00000 n +0000294629 00000 n +0000294684 00000 n +0000294749 00000 n +0000294814 00000 n +0000294879 00000 n +0000294944 00000 n +0000295009 00000 n +0000295074 00000 n +0000295139 00000 n +0000295204 00000 n +0000295269 00000 n +0000295334 00000 n +0000295399 00000 n +0000295454 00000 n +0000295519 00000 n +0000295584 00000 n +0000295649 00000 n +0000295714 00000 n +0000295779 00000 n +0000295844 00000 n +0000295909 00000 n +0000295974 00000 n +0000296039 00000 n +0000296104 00000 n +0000296169 00000 n +0000296224 00000 n +0000296289 00000 n +0000296354 00000 n +0000296419 00000 n +0000296484 00000 n +0000296549 00000 n +0000296614 00000 n +0000296679 00000 n +0000296744 00000 n +0000296809 00000 n +0000296874 00000 n +0000296939 00000 n +0000296994 00000 n +0000297059 00000 n +0000297124 00000 n +0000297189 00000 n +0000297254 00000 n +0000297319 00000 n +0000297384 00000 n +0000297449 00000 n +0000297514 00000 n +0000297579 00000 n +0000297644 00000 n +0000297709 00000 n +0000297764 00000 n +0000297829 00000 n +0000297884 00000 n +0000297939 00000 n +0000297994 00000 n +0000298059 00000 n +0000298124 00000 n +0000298191 00000 n +0000298258 00000 n +0000298325 00000 n +0000298392 00000 n +0000298459 00000 n +0000298526 00000 n +0000298593 00000 n +0000298660 00000 n +0000298727 00000 n +0000298783 00000 n +0000298850 00000 n +0000298917 00000 n +0000298984 00000 n +0000299051 00000 n +0000299118 00000 n +0000299185 00000 n +0000299252 00000 n +0000299319 00000 n +0000299386 00000 n +0000299453 00000 n +0000299520 00000 n +0000299576 00000 n +0000299643 00000 n +0000299710 00000 n +0000299777 00000 n +0000299844 00000 n +0000299911 00000 n +0000299978 00000 n +0000300045 00000 n +0000300112 00000 n +0000300179 00000 n +0000300246 00000 n +0000300313 00000 n +0000300369 00000 n +0000300436 00000 n +0000300492 00000 n +0000300559 00000 n +0000300626 00000 n +0000300693 00000 n +0000300760 00000 n +0000300827 00000 n +0000300883 00000 n +0000300950 00000 n +0000301017 00000 n +0000301073 00000 n +0000301184 00000 n +0000301208 00000 n +0000301277 00000 n +0000301345 00000 n +0000301402 00000 n +0000301459 00000 n +0000301527 00000 n +0000301584 00000 n +0000301641 00000 n +0000301709 00000 n +0000301777 00000 n +0000301845 00000 n +0000301902 00000 n +0000301959 00000 n +0000302027 00000 n +0000302113 00000 n +0000302181 00000 n +0000302238 00000 n +0000302293 00000 n +0000302361 00000 n +0000302447 00000 n +0000302504 00000 n +0000302581 00000 n +0000302638 00000 n +0000302706 00000 n +0000302763 00000 n +0000302820 00000 n +0000302897 00000 n +0000302974 00000 n +0000303096 00000 n +0000303173 00000 n +0000303230 00000 n +0000303325 00000 n +0000303382 00000 n +0000303459 00000 n +0000303516 00000 n +0000303638 00000 n +0000303695 00000 n +0000303752 00000 n +0000303809 00000 n +0000303886 00000 n +0000303943 00000 n +0000304065 00000 n +0000304122 00000 n +0000304179 00000 n +0000304236 00000 n +0000304313 00000 n +0000304370 00000 n +0000304492 00000 n +0000304549 00000 n +0000304606 00000 n +0000304663 00000 n +0000304740 00000 n +0000304797 00000 n +0000304919 00000 n +0000304976 00000 n +0000305033 00000 n +0000305090 00000 n +0000305167 00000 n +0000305224 00000 n +0000305346 00000 n +0000305403 00000 n +0000305460 00000 n +0000305517 00000 n +0000305594 00000 n +0000305651 00000 n +0000305773 00000 n +0000305830 00000 n +0000305887 00000 n +0000305944 00000 n +0000306010 00000 n +0000306087 00000 n +0000306144 00000 n +0000306266 00000 n +0000306323 00000 n +0000306380 00000 n +0000306437 00000 n +0000306503 00000 n +0000306580 00000 n +0000306637 00000 n +0000306759 00000 n +0000306816 00000 n +0000306873 00000 n +0000306930 00000 n +0000307007 00000 n +0000307064 00000 n +0000307186 00000 n +0000307243 00000 n +0000307300 00000 n +0000307357 00000 n +0000307434 00000 n +0000307556 00000 n +0000307633 00000 n +0000307690 00000 n +0000307812 00000 n +0000307869 00000 n +0000307926 00000 n +0000307983 00000 n +0000308060 00000 n +0000308117 00000 n +0000308239 00000 n +0000308296 00000 n +0000308353 00000 n +0000308410 00000 n +0000308476 00000 n +0000308553 00000 n +0000308610 00000 n +0000308732 00000 n +0000308789 00000 n +0000308846 00000 n +0000308903 00000 n +0000308980 00000 n +0000309037 00000 n +0000309159 00000 n +0000309216 00000 n +0000309273 00000 n +0000309330 00000 n +0000309396 00000 n +0000309473 00000 n +0000309530 00000 n +0000309652 00000 n +0000309709 00000 n +0000309766 00000 n +0000309823 00000 n +0000309889 00000 n +0000309966 00000 n +0000310023 00000 n +0000310145 00000 n +0000310202 00000 n +0000310259 00000 n +0000310316 00000 n +0000310382 00000 n +0000310459 00000 n +0000310516 00000 n +0000310638 00000 n +0000310695 00000 n +0000310752 00000 n +0000310809 00000 n +0000310886 00000 n +0000310943 00000 n +0000311065 00000 n +0000311122 00000 n +0000311179 00000 n +0000311236 00000 n +0000311313 00000 n +0000311370 00000 n +0000311492 00000 n +0000311549 00000 n +0000311606 00000 n +0000311663 00000 n +0000311740 00000 n +0000311797 00000 n +0000311919 00000 n +0000311976 00000 n +0000312033 00000 n +0000312090 00000 n +0000312167 00000 n +0000312224 00000 n +0000312346 00000 n +0000312403 00000 n +0000312460 00000 n +0000312517 00000 n +0000312594 00000 n +0000312651 00000 n +0000312773 00000 n +0000312830 00000 n +0000312887 00000 n +0000312944 00000 n +0000313021 00000 n +0000313078 00000 n +0000313200 00000 n +0000313257 00000 n +0000313314 00000 n +0000313371 00000 n +0000313448 00000 n +0000313505 00000 n +0000313627 00000 n +0000313684 00000 n +0000313741 00000 n +0000313798 00000 n +0000313875 00000 n +0000313932 00000 n +0000314054 00000 n +0000314111 00000 n +0000314168 00000 n +0000314225 00000 n +0000314302 00000 n +0000314359 00000 n +0000314481 00000 n +0000314538 00000 n +0000314595 00000 n +0000314652 00000 n +0000314729 00000 n +0000314786 00000 n +0000314908 00000 n +0000314965 00000 n +0000315022 00000 n +0000315079 00000 n +0000315156 00000 n +0000315213 00000 n +0000315290 00000 n +0000315412 00000 n +0000315534 00000 n +0000315591 00000 n +0000315648 00000 n +0000315705 00000 n +0000315782 00000 n +0000315839 00000 n +0000315961 00000 n +0000316018 00000 n +0000316075 00000 n +0000316132 00000 n +0000316209 00000 n +0000316266 00000 n +0000316388 00000 n +0000316445 00000 n +0000316502 00000 n +0000316559 00000 n +0000316636 00000 n +0000316693 00000 n +0000316815 00000 n +0000316872 00000 n +0000316929 00000 n +0000316986 00000 n +0000317063 00000 n +0000317120 00000 n +0000317242 00000 n +0000317299 00000 n +0000317356 00000 n +0000317413 00000 n +0000317490 00000 n +0000317547 00000 n +0000317669 00000 n +0000317726 00000 n +0000317783 00000 n +0000317840 00000 n +0000317917 00000 n +0000317974 00000 n +0000318096 00000 n +0000318153 00000 n +0000318210 00000 n +0000318267 00000 n +0000318344 00000 n +0000318401 00000 n +0000318523 00000 n +0000318580 00000 n +0000318637 00000 n +0000318694 00000 n +0000318771 00000 n +0000318828 00000 n +0000318950 00000 n +0000319007 00000 n +0000319064 00000 n +0000319121 00000 n +0000319198 00000 n +0000319255 00000 n +0000319377 00000 n +0000319434 00000 n +0000319491 00000 n +0000319548 00000 n +0000319632 00000 n +0000319709 00000 n +0000319766 00000 n +0000319888 00000 n +0000319945 00000 n +0000320002 00000 n +0000320059 00000 n +0000320136 00000 n +0000320193 00000 n +0000320315 00000 n +0000320372 00000 n +0000320429 00000 n +0000320486 00000 n +0000320563 00000 n +0000320620 00000 n +0000320742 00000 n +0000320799 00000 n +0000320856 00000 n +0000320913 00000 n +0000320970 00000 n +0000321038 00000 n +0000321122 00000 n +0000321190 00000 n +0000321267 00000 n +0000321362 00000 n +0000321431 00000 n +0000321500 00000 n +0000321569 00000 n +0000321637 00000 n +0000321723 00000 n +0000321791 00000 n +0000321857 00000 n +0000321925 00000 n +0000321991 00000 n +0000322066 00000 n +0000322141 00000 n +0000322216 00000 n +0000322291 00000 n +0000322366 00000 n +0000322450 00000 n +0000322505 00000 n +0000322589 00000 n +0000322644 00000 n +0000322719 00000 n +0000322794 00000 n +0000322860 00000 n +0000322935 00000 n +0000323019 00000 n +0000323074 00000 n +0000323149 00000 n +0000323233 00000 n +0000323288 00000 n +0000323372 00000 n +0000323427 00000 n +0000323511 00000 n +0000323566 00000 n +0000323641 00000 n +0000323716 00000 n +0000323791 00000 n +0000323866 00000 n +0000323941 00000 n +0000324016 00000 n +0000324091 00000 n +0000324166 00000 n +0000324241 00000 n +0000324316 00000 n +0000324391 00000 n +0000324446 00000 n +0000324512 00000 n +0000324578 00000 n +0000324653 00000 n +0000324728 00000 n +0000324803 00000 n +0000324878 00000 n +0000324953 00000 n +0000325028 00000 n +0000325103 00000 n +0000325178 00000 n +0000325262 00000 n +0000325317 00000 n +0000325392 00000 n +0000325467 00000 n +0000325542 00000 n +0000325619 00000 n +0000325674 00000 n +0000325729 00000 n +0000325784 00000 n +0000325839 00000 n +0000325894 00000 n +0000325949 00000 n +0000326004 00000 n +0000326061 00000 n +0000326116 00000 n +0000326171 00000 n +0000326226 00000 n +0000326281 00000 n +0000326336 00000 n +0000326393 00000 n +0000326448 00000 n +0000326506 00000 n +0000326563 00000 n +0000326618 00000 n +0000326676 00000 n +0000326731 00000 n +0000326786 00000 n +0000326841 00000 n +0000326898 00000 n +0000326953 00000 n +0000327011 00000 n +0000327066 00000 n +0000327123 00000 n +0000327178 00000 n +0000327236 00000 n +0000327293 00000 n +0000327348 00000 n +0000327406 00000 n +0000327463 00000 n +0000327518 00000 n +0000327576 00000 n +0000327631 00000 n +0000327686 00000 n +0000327741 00000 n +0000327796 00000 n +0000327851 00000 n +0000327906 00000 n +0000327961 00000 n +0000328016 00000 n +0000328071 00000 n +0000328126 00000 n +0000328181 00000 n +0000328236 00000 n +0000328291 00000 n +0000328346 00000 n +0000328401 00000 n +0000328456 00000 n +0000328511 00000 n +0000328566 00000 n +0000328621 00000 n +0000328676 00000 n +0000328731 00000 n +0000328788 00000 n +0000328843 00000 n +0000328901 00000 n +0000328956 00000 n +0000329011 00000 n +0000329066 00000 n +0000329123 00000 n +0000329181 00000 n +0000329236 00000 n +0000329291 00000 n +0000329423 00000 n +0000329480 00000 n +0000329537 00000 n +0000329750 00000 n +0000329807 00000 n +0000329864 00000 n +0000329921 00000 n +0000329978 00000 n +0000330146 00000 n +0000330203 00000 n +trailer +<< +/DecodeParms << +/Columns 5 +/Predictor 12 +>> +/Filter /FlateDecode +/ID [ <2C104C92D21DB2110A0046F6A47795FF>] +/Info 8 0 R +/Length 279 +/Root 1 0 R +/Size 2103 +/Type /XRef +/W [1 3 1] +>> +startxref +330260 +%%EOF diff --git a/COPYING b/COPYING new file mode 100755 index 0000000..94a0453 --- /dev/null +++ b/COPYING @@ -0,0 +1,621 @@ + GNU GENERAL PUBLIC LICENSE + Version 3, 29 June 2007 + + Copyright (C) 2007 Free Software Foundation, Inc. + Everyone is permitted to copy and distribute verbatim copies + of this license document, but changing it is not allowed. + + Preamble + + The GNU General Public License is a free, copyleft license for +software and other kinds of works. + + The licenses for most software and other practical works are designed +to take away your freedom to share and change the works. By contrast, +the GNU General Public License is intended to guarantee your freedom to +share and change all versions of a program--to make sure it remains free +software for all its users. We, the Free Software Foundation, use the +GNU General Public License for most of our software; it applies also to +any other work released this way by its authors. You can apply it to +your programs, too. + + When we speak of free software, we are referring to freedom, not +price. Our General Public Licenses are designed to make sure that you +have the freedom to distribute copies of free software (and charge for +them if you wish), that you receive source code or can get it if you +want it, that you can change the software or use pieces of it in new +free programs, and that you know you can do these things. + + To protect your rights, we need to prevent others from denying you +these rights or asking you to surrender the rights. Therefore, you have +certain responsibilities if you distribute copies of the software, or if +you modify it: responsibilities to respect the freedom of others. + + For example, if you distribute copies of such a program, whether +gratis or for a fee, you must pass on to the recipients the same +freedoms that you received. You must make sure that they, too, receive +or can get the source code. And you must show them these terms so they +know their rights. + + Developers that use the GNU GPL protect your rights with two steps: +(1) assert copyright on the software, and (2) offer you this License +giving you legal permission to copy, distribute and/or modify it. + + For the developers' and authors' protection, the GPL clearly explains +that there is no warranty for this free software. For both users' and +authors' sake, the GPL requires that modified versions be marked as +changed, so that their problems will not be attributed erroneously to +authors of previous versions. + + Some devices are designed to deny users access to install or run +modified versions of the software inside them, although the manufacturer +can do so. This is fundamentally incompatible with the aim of +protecting users' freedom to change the software. The systematic +pattern of such abuse occurs in the area of products for individuals to +use, which is precisely where it is most unacceptable. Therefore, we +have designed this version of the GPL to prohibit the practice for those +products. If such problems arise substantially in other domains, we +stand ready to extend this provision to those domains in future versions +of the GPL, as needed to protect the freedom of users. + + Finally, every program is threatened constantly by software patents. +States should not allow patents to restrict development and use of +software on general-purpose computers, but in those that do, we wish to +avoid the special danger that patents applied to a free program could +make it effectively proprietary. To prevent this, the GPL assures that +patents cannot be used to render the program non-free. + + The precise terms and conditions for copying, distribution and +modification follow. + + TERMS AND CONDITIONS + + 0. Definitions. + + "This License" refers to version 3 of the GNU General Public License. + + "Copyright" also means copyright-like laws that apply to other kinds of +works, such as semiconductor masks. + + "The Program" refers to any copyrightable work licensed under this +License. Each licensee is addressed as "you". "Licensees" and +"recipients" may be individuals or organizations. + + To "modify" a work means to copy from or adapt all or part of the work +in a fashion requiring copyright permission, other than the making of an +exact copy. The resulting work is called a "modified version" of the +earlier work or a work "based on" the earlier work. + + A "covered work" means either the unmodified Program or a work based +on the Program. + + To "propagate" a work means to do anything with it that, without +permission, would make you directly or secondarily liable for +infringement under applicable copyright law, except executing it on a +computer or modifying a private copy. Propagation includes copying, +distribution (with or without modification), making available to the +public, and in some countries other activities as well. + + To "convey" a work means any kind of propagation that enables other +parties to make or receive copies. Mere interaction with a user through +a computer network, with no transfer of a copy, is not conveying. + + An interactive user interface displays "Appropriate Legal Notices" +to the extent that it includes a convenient and prominently visible +feature that (1) displays an appropriate copyright notice, and (2) +tells the user that there is no warranty for the work (except to the +extent that warranties are provided), that licensees may convey the +work under this License, and how to view a copy of this License. If +the interface presents a list of user commands or options, such as a +menu, a prominent item in the list meets this criterion. + + 1. Source Code. + + The "source code" for a work means the preferred form of the work +for making modifications to it. "Object code" means any non-source +form of a work. + + A "Standard Interface" means an interface that either is an official +standard defined by a recognized standards body, or, in the case of +interfaces specified for a particular programming language, one that +is widely used among developers working in that language. + + The "System Libraries" of an executable work include anything, other +than the work as a whole, that (a) is included in the normal form of +packaging a Major Component, but which is not part of that Major +Component, and (b) serves only to enable use of the work with that +Major Component, or to implement a Standard Interface for which an +implementation is available to the public in source code form. A +"Major Component", in this context, means a major essential component +(kernel, window system, and so on) of the specific operating system +(if any) on which the executable work runs, or a compiler used to +produce the work, or an object code interpreter used to run it. + + The "Corresponding Source" for a work in object code form means all +the source code needed to generate, install, and (for an executable +work) run the object code and to modify the work, including scripts to +control those activities. However, it does not include the work's +System Libraries, or general-purpose tools or generally available free +programs which are used unmodified in performing those activities but +which are not part of the work. For example, Corresponding Source +includes interface definition files associated with source files for +the work, and the source code for shared libraries and dynamically +linked subprograms that the work is specifically designed to require, +such as by intimate data communication or control flow between those +subprograms and other parts of the work. + + The Corresponding Source need not include anything that users +can regenerate automatically from other parts of the Corresponding +Source. + + The Corresponding Source for a work in source code form is that +same work. + + 2. Basic Permissions. + + All rights granted under this License are granted for the term of +copyright on the Program, and are irrevocable provided the stated +conditions are met. This License explicitly affirms your unlimited +permission to run the unmodified Program. The output from running a +covered work is covered by this License only if the output, given its +content, constitutes a covered work. This License acknowledges your +rights of fair use or other equivalent, as provided by copyright law. + + You may make, run and propagate covered works that you do not +convey, without conditions so long as your license otherwise remains +in force. You may convey covered works to others for the sole purpose +of having them make modifications exclusively for you, or provide you +with facilities for running those works, provided that you comply with +the terms of this License in conveying all material for which you do +not control copyright. Those thus making or running the covered works +for you must do so exclusively on your behalf, under your direction +and control, on terms that prohibit them from making any copies of +your copyrighted material outside their relationship with you. + + Conveying under any other circumstances is permitted solely under +the conditions stated below. Sublicensing is not allowed; section 10 +makes it unnecessary. + + 3. Protecting Users' Legal Rights From Anti-Circumvention Law. + + No covered work shall be deemed part of an effective technological +measure under any applicable law fulfilling obligations under article +11 of the WIPO copyright treaty adopted on 20 December 1996, or +similar laws prohibiting or restricting circumvention of such +measures. + + When you convey a covered work, you waive any legal power to forbid +circumvention of technological measures to the extent such circumvention +is effected by exercising rights under this License with respect to +the covered work, and you disclaim any intention to limit operation or +modification of the work as a means of enforcing, against the work's +users, your or third parties' legal rights to forbid circumvention of +technological measures. + + 4. Conveying Verbatim Copies. + + You may convey verbatim copies of the Program's source code as you +receive it, in any medium, provided that you conspicuously and +appropriately publish on each copy an appropriate copyright notice; +keep intact all notices stating that this License and any +non-permissive terms added in accord with section 7 apply to the code; +keep intact all notices of the absence of any warranty; and give all +recipients a copy of this License along with the Program. + + You may charge any price or no price for each copy that you convey, +and you may offer support or warranty protection for a fee. + + 5. Conveying Modified Source Versions. + + You may convey a work based on the Program, or the modifications to +produce it from the Program, in the form of source code under the +terms of section 4, provided that you also meet all of these conditions: + + a) The work must carry prominent notices stating that you modified + it, and giving a relevant date. + + b) The work must carry prominent notices stating that it is + released under this License and any conditions added under section + 7. This requirement modifies the requirement in section 4 to + "keep intact all notices". + + c) You must license the entire work, as a whole, under this + License to anyone who comes into possession of a copy. This + License will therefore apply, along with any applicable section 7 + additional terms, to the whole of the work, and all its parts, + regardless of how they are packaged. This License gives no + permission to license the work in any other way, but it does not + invalidate such permission if you have separately received it. + + d) If the work has interactive user interfaces, each must display + Appropriate Legal Notices; however, if the Program has interactive + interfaces that do not display Appropriate Legal Notices, your + work need not make them do so. + + A compilation of a covered work with other separate and independent +works, which are not by their nature extensions of the covered work, +and which are not combined with it such as to form a larger program, +in or on a volume of a storage or distribution medium, is called an +"aggregate" if the compilation and its resulting copyright are not +used to limit the access or legal rights of the compilation's users +beyond what the individual works permit. Inclusion of a covered work +in an aggregate does not cause this License to apply to the other +parts of the aggregate. + + 6. Conveying Non-Source Forms. + + You may convey a covered work in object code form under the terms +of sections 4 and 5, provided that you also convey the +machine-readable Corresponding Source under the terms of this License, +in one of these ways: + + a) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by the + Corresponding Source fixed on a durable physical medium + customarily used for software interchange. + + b) Convey the object code in, or embodied in, a physical product + (including a physical distribution medium), accompanied by a + written offer, valid for at least three years and valid for as + long as you offer spare parts or customer support for that product + model, to give anyone who possesses the object code either (1) a + copy of the Corresponding Source for all the software in the + product that is covered by this License, on a durable physical + medium customarily used for software interchange, for a price no + more than your reasonable cost of physically performing this + conveying of source, or (2) access to copy the + Corresponding Source from a network server at no charge. + + c) Convey individual copies of the object code with a copy of the + written offer to provide the Corresponding Source. This + alternative is allowed only occasionally and noncommercially, and + only if you received the object code with such an offer, in accord + with subsection 6b. + + d) Convey the object code by offering access from a designated + place (gratis or for a charge), and offer equivalent access to the + Corresponding Source in the same way through the same place at no + further charge. You need not require recipients to copy the + Corresponding Source along with the object code. If the place to + copy the object code is a network server, the Corresponding Source + may be on a different server (operated by you or a third party) + that supports equivalent copying facilities, provided you maintain + clear directions next to the object code saying where to find the + Corresponding Source. Regardless of what server hosts the + Corresponding Source, you remain obligated to ensure that it is + available for as long as needed to satisfy these requirements. + + e) Convey the object code using peer-to-peer transmission, provided + you inform other peers where the object code and Corresponding + Source of the work are being offered to the general public at no + charge under subsection 6d. + + A separable portion of the object code, whose source code is excluded +from the Corresponding Source as a System Library, need not be +included in conveying the object code work. + + A "User Product" is either (1) a "consumer product", which means any +tangible personal property which is normally used for personal, family, +or household purposes, or (2) anything designed or sold for incorporation +into a dwelling. In determining whether a product is a consumer product, +doubtful cases shall be resolved in favor of coverage. For a particular +product received by a particular user, "normally used" refers to a +typical or common use of that class of product, regardless of the status +of the particular user or of the way in which the particular user +actually uses, or expects or is expected to use, the product. A product +is a consumer product regardless of whether the product has substantial +commercial, industrial or non-consumer uses, unless such uses represent +the only significant mode of use of the product. + + "Installation Information" for a User Product means any methods, +procedures, authorization keys, or other information required to install +and execute modified versions of a covered work in that User Product from +a modified version of its Corresponding Source. The information must +suffice to ensure that the continued functioning of the modified object +code is in no case prevented or interfered with solely because +modification has been made. + + If you convey an object code work under this section in, or with, or +specifically for use in, a User Product, and the conveying occurs as +part of a transaction in which the right of possession and use of the +User Product is transferred to the recipient in perpetuity or for a +fixed term (regardless of how the transaction is characterized), the +Corresponding Source conveyed under this section must be accompanied +by the Installation Information. But this requirement does not apply +if neither you nor any third party retains the ability to install +modified object code on the User Product (for example, the work has +been installed in ROM). + + The requirement to provide Installation Information does not include a +requirement to continue to provide support service, warranty, or updates +for a work that has been modified or installed by the recipient, or for +the User Product in which it has been modified or installed. Access to a +network may be denied when the modification itself materially and +adversely affects the operation of the network or violates the rules and +protocols for communication across the network. + + Corresponding Source conveyed, and Installation Information provided, +in accord with this section must be in a format that is publicly +documented (and with an implementation available to the public in +source code form), and must require no special password or key for +unpacking, reading or copying. + + 7. Additional Terms. + + "Additional permissions" are terms that supplement the terms of this +License by making exceptions from one or more of its conditions. +Additional permissions that are applicable to the entire Program shall +be treated as though they were included in this License, to the extent +that they are valid under applicable law. If additional permissions +apply only to part of the Program, that part may be used separately +under those permissions, but the entire Program remains governed by +this License without regard to the additional permissions. + + When you convey a copy of a covered work, you may at your option +remove any additional permissions from that copy, or from any part of +it. (Additional permissions may be written to require their own +removal in certain cases when you modify the work.) You may place +additional permissions on material, added by you to a covered work, +for which you have or can give appropriate copyright permission. + + Notwithstanding any other provision of this License, for material you +add to a covered work, you may (if authorized by the copyright holders of +that material) supplement the terms of this License with terms: + + a) Disclaiming warranty or limiting liability differently from the + terms of sections 15 and 16 of this License; or + + b) Requiring preservation of specified reasonable legal notices or + author attributions in that material or in the Appropriate Legal + Notices displayed by works containing it; or + + c) Prohibiting misrepresentation of the origin of that material, or + requiring that modified versions of such material be marked in + reasonable ways as different from the original version; or + + d) Limiting the use for publicity purposes of names of licensors or + authors of the material; or + + e) Declining to grant rights under trademark law for use of some + trade names, trademarks, or service marks; or + + f) Requiring indemnification of licensors and authors of that + material by anyone who conveys the material (or modified versions of + it) with contractual assumptions of liability to the recipient, for + any liability that these contractual assumptions directly impose on + those licensors and authors. + + All other non-permissive additional terms are considered "further +restrictions" within the meaning of section 10. If the Program as you +received it, or any part of it, contains a notice stating that it is +governed by this License along with a term that is a further +restriction, you may remove that term. If a license document contains +a further restriction but permits relicensing or conveying under this +License, you may add to a covered work material governed by the terms +of that license document, provided that the further restriction does +not survive such relicensing or conveying. + + If you add terms to a covered work in accord with this section, you +must place, in the relevant source files, a statement of the +additional terms that apply to those files, or a notice indicating +where to find the applicable terms. + + Additional terms, permissive or non-permissive, may be stated in the +form of a separately written license, or stated as exceptions; +the above requirements apply either way. + + 8. Termination. + + You may not propagate or modify a covered work except as expressly +provided under this License. Any attempt otherwise to propagate or +modify it is void, and will automatically terminate your rights under +this License (including any patent licenses granted under the third +paragraph of section 11). + + However, if you cease all violation of this License, then your +license from a particular copyright holder is reinstated (a) +provisionally, unless and until the copyright holder explicitly and +finally terminates your license, and (b) permanently, if the copyright +holder fails to notify you of the violation by some reasonable means +prior to 60 days after the cessation. + + Moreover, your license from a particular copyright holder is +reinstated permanently if the copyright holder notifies you of the +violation by some reasonable means, this is the first time you have +received notice of violation of this License (for any work) from that +copyright holder, and you cure the violation prior to 30 days after +your receipt of the notice. + + Termination of your rights under this section does not terminate the +licenses of parties who have received copies or rights from you under +this License. If your rights have been terminated and not permanently +reinstated, you do not qualify to receive new licenses for the same +material under section 10. + + 9. Acceptance Not Required for Having Copies. + + You are not required to accept this License in order to receive or +run a copy of the Program. Ancillary propagation of a covered work +occurring solely as a consequence of using peer-to-peer transmission +to receive a copy likewise does not require acceptance. However, +nothing other than this License grants you permission to propagate or +modify any covered work. These actions infringe copyright if you do +not accept this License. Therefore, by modifying or propagating a +covered work, you indicate your acceptance of this License to do so. + + 10. Automatic Licensing of Downstream Recipients. + + Each time you convey a covered work, the recipient automatically +receives a license from the original licensors, to run, modify and +propagate that work, subject to this License. You are not responsible +for enforcing compliance by third parties with this License. + + An "entity transaction" is a transaction transferring control of an +organization, or substantially all assets of one, or subdividing an +organization, or merging organizations. If propagation of a covered +work results from an entity transaction, each party to that +transaction who receives a copy of the work also receives whatever +licenses to the work the party's predecessor in interest had or could +give under the previous paragraph, plus a right to possession of the +Corresponding Source of the work from the predecessor in interest, if +the predecessor has it or can get it with reasonable efforts. + + You may not impose any further restrictions on the exercise of the +rights granted or affirmed under this License. For example, you may +not impose a license fee, royalty, or other charge for exercise of +rights granted under this License, and you may not initiate litigation +(including a cross-claim or counterclaim in a lawsuit) alleging that +any patent claim is infringed by making, using, selling, offering for +sale, or importing the Program or any portion of it. + + 11. Patents. + + A "contributor" is a copyright holder who authorizes use under this +License of the Program or a work on which the Program is based. The +work thus licensed is called the contributor's "contributor version". + + A contributor's "essential patent claims" are all patent claims +owned or controlled by the contributor, whether already acquired or +hereafter acquired, that would be infringed by some manner, permitted +by this License, of making, using, or selling its contributor version, +but do not include claims that would be infringed only as a +consequence of further modification of the contributor version. For +purposes of this definition, "control" includes the right to grant +patent sublicenses in a manner consistent with the requirements of +this License. + + Each contributor grants you a non-exclusive, worldwide, royalty-free +patent license under the contributor's essential patent claims, to +make, use, sell, offer for sale, import and otherwise run, modify and +propagate the contents of its contributor version. + + In the following three paragraphs, a "patent license" is any express +agreement or commitment, however denominated, not to enforce a patent +(such as an express permission to practice a patent or covenant not to +sue for patent infringement). To "grant" such a patent license to a +party means to make such an agreement or commitment not to enforce a +patent against the party. + + If you convey a covered work, knowingly relying on a patent license, +and the Corresponding Source of the work is not available for anyone +to copy, free of charge and under the terms of this License, through a +publicly available network server or other readily accessible means, +then you must either (1) cause the Corresponding Source to be so +available, or (2) arrange to deprive yourself of the benefit of the +patent license for this particular work, or (3) arrange, in a manner +consistent with the requirements of this License, to extend the patent +license to downstream recipients. "Knowingly relying" means you have +actual knowledge that, but for the patent license, your conveying the +covered work in a country, or your recipient's use of the covered work +in a country, would infringe one or more identifiable patents in that +country that you have reason to believe are valid. + + If, pursuant to or in connection with a single transaction or +arrangement, you convey, or propagate by procuring conveyance of, a +covered work, and grant a patent license to some of the parties +receiving the covered work authorizing them to use, propagate, modify +or convey a specific copy of the covered work, then the patent license +you grant is automatically extended to all recipients of the covered +work and works based on it. + + A patent license is "discriminatory" if it does not include within +the scope of its coverage, prohibits the exercise of, or is +conditioned on the non-exercise of one or more of the rights that are +specifically granted under this License. You may not convey a covered +work if you are a party to an arrangement with a third party that is +in the business of distributing software, under which you make payment +to the third party based on the extent of your activity of conveying +the work, and under which the third party grants, to any of the +parties who would receive the covered work from you, a discriminatory +patent license (a) in connection with copies of the covered work +conveyed by you (or copies made from those copies), or (b) primarily +for and in connection with specific products or compilations that +contain the covered work, unless you entered into that arrangement, +or that patent license was granted, prior to 28 March 2007. + + Nothing in this License shall be construed as excluding or limiting +any implied license or other defenses to infringement that may +otherwise be available to you under applicable patent law. + + 12. No Surrender of Others' Freedom. + + If conditions are imposed on you (whether by court order, agreement or +otherwise) that contradict the conditions of this License, they do not +excuse you from the conditions of this License. If you cannot convey a +covered work so as to satisfy simultaneously your obligations under this +License and any other pertinent obligations, then as a consequence you may +not convey it at all. For example, if you agree to terms that obligate you +to collect a royalty for further conveying from those to whom you convey +the Program, the only way you could satisfy both those terms and this +License would be to refrain entirely from conveying the Program. + + 13. Use with the GNU Affero General Public License. + + Notwithstanding any other provision of this License, you have +permission to link or combine any covered work with a work licensed +under version 3 of the GNU Affero General Public License into a single +combined work, and to convey the resulting work. The terms of this +License will continue to apply to the part which is the covered work, +but the special requirements of the GNU Affero General Public License, +section 13, concerning interaction through a network will apply to the +combination as such. + + 14. Revised Versions of this License. + + The Free Software Foundation may publish revised and/or new versions of +the GNU General Public License from time to time. Such new versions will +be similar in spirit to the present version, but may differ in detail to +address new problems or concerns. + + Each version is given a distinguishing version number. If the +Program specifies that a certain numbered version of the GNU General +Public License "or any later version" applies to it, you have the +option of following the terms and conditions either of that numbered +version or of any later version published by the Free Software +Foundation. If the Program does not specify a version number of the +GNU General Public License, you may choose any version ever published +by the Free Software Foundation. + + If the Program specifies that a proxy can decide which future +versions of the GNU General Public License can be used, that proxy's +public statement of acceptance of a version permanently authorizes you +to choose that version for the Program. + + Later license versions may give you additional or different +permissions. However, no additional obligations are imposed on any +author or copyright holder as a result of your choosing to follow a +later version. + + 15. Disclaimer of Warranty. + + THERE IS NO WARRANTY FOR THE PROGRAM, TO THE EXTENT PERMITTED BY +APPLICABLE LAW. EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT +HOLDERS AND/OR OTHER PARTIES PROVIDE THE PROGRAM "AS IS" WITHOUT WARRANTY +OF ANY KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, +THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR +PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE PROGRAM +IS WITH YOU. SHOULD THE PROGRAM PROVE DEFECTIVE, YOU ASSUME THE COST OF +ALL NECESSARY SERVICING, REPAIR OR CORRECTION. + + 16. Limitation of Liability. + + IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN WRITING +WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MODIFIES AND/OR CONVEYS +THE PROGRAM AS PERMITTED ABOVE, BE LIABLE TO YOU FOR DAMAGES, INCLUDING ANY +GENERAL, SPECIAL, INCIDENTAL OR CONSEQUENTIAL DAMAGES ARISING OUT OF THE +USE OR INABILITY TO USE THE PROGRAM (INCLUDING BUT NOT LIMITED TO LOSS OF +DATA OR DATA BEING RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD +PARTIES OR A FAILURE OF THE PROGRAM TO OPERATE WITH ANY OTHER PROGRAMS), +EVEN IF SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF +SUCH DAMAGES. + + 17. Interpretation of Sections 15 and 16. + + If the disclaimer of warranty and limitation of liability provided +above cannot be given local legal effect according to their terms, +reviewing courts shall apply local law that most closely approximates +an absolute waiver of all civil liability in connection with the +Program, unless a warranty or assumption of liability accompanies a +copy of the Program in return for a fee. + + END OF TERMS AND CONDITIONS diff --git a/ChangeLog.md b/ChangeLog.md new file mode 100755 index 0000000..5261e92 --- /dev/null +++ b/ChangeLog.md @@ -0,0 +1,5 @@ +# CHANGELOG MODULE IMPORTZUGFERD FOR [DOLIBARR ERP CRM](https://www.dolibarr.org) + +## 1.0 + +Initial version diff --git a/README.md b/README.md new file mode 100755 index 0000000..19f0cd5 --- /dev/null +++ b/README.md @@ -0,0 +1,129 @@ +# ZUGFeRD Import for [Dolibarr ERP & CRM](https://www.dolibarr.org) + +Import ZUGFeRD/Factur-X electronic invoices as supplier invoices in Dolibarr. + +## Features + +### Core Functionality +- **PDF Import**: Upload ZUGFeRD/Factur-X PDF invoices with embedded XML data +- **XML Parsing**: Automatic extraction and parsing of invoice data from embedded XML +- **Duplicate Detection**: SHA256 hash-based detection prevents importing the same invoice twice +- **Supplier Detection**: Automatic supplier matching via VAT ID or customer reference number + +### Product Matching +- **Multi-Method Matching**: Products are matched via: + - Article mapping (supplier article number → your product) + - EAN/GTIN barcode + - Product reference + - Manufacturer reference +- **Manual Assignment**: Assign products manually when automatic matching fails +- **Product Creation**: Create new products directly from import data +- **Product Templates**: Duplicate existing products with ZUGFeRD data pre-filled +- **EAN Auto-Update**: Automatically updates product barcodes from invoice data + +### Workflow +- **Persistent Import Records**: Imports are saved to database immediately +- **Status Tracking**: + - `Imported` - Ready for invoice creation + - `Pending` - Manual intervention required (missing products/supplier) + - `Processed` - Supplier invoice created + - `Error` - Import failed +- **Resume Anytime**: Continue editing imports later +- **Sum Validation**: Validates totals between ZUGFeRD data and created invoice + +### Batch Import +- **Folder Monitoring**: Import from a local folder (watch folder) +- **IMAP Import**: Import from email mailbox +- **Automatic Archiving**: Successfully imported files are moved to archive + +### Unit Code Translation +- Translates UN/ECE unit codes (C62, MTR, LTR, etc.) to readable labels (Stk., m, l) + +## Requirements + +- Dolibarr 19.0 or higher +- PHP 7.1 or higher +- PHP IMAP extension (for email import functionality) + +## Installation + +1. Copy the `importzugferd` folder to your Dolibarr `custom` directory +2. Enable the module in **Setup > Modules > ZUGFeRD Import** +3. Configure settings in **ZUGFeRD Import > Setup** + +## Configuration + +### IMAP Settings (for email import) +- IMAP Server hostname +- Port (993 for SSL, 143 for STARTTLS) +- Username and password +- Mailbox folder to monitor +- Use **Test Connection** to verify settings and select folder + +### Folder Settings (for folder import) +- **Watch Folder**: Local path for incoming invoices +- **Archive Folder**: Local path for processed invoices +- **IMAP Archive Folder**: Email folder for processed emails + +### Import Settings +- **Auto-create invoices**: Automatically create supplier invoices during batch import + +## Usage + +### Manual Import +1. Go to **ZUGFeRD Import > Import Invoice** +2. Upload a ZUGFeRD/Factur-X PDF file +3. Review invoice data and line items +4. Assign missing products if needed +5. Select supplier (if not auto-detected) +6. Click **Create Supplier Invoice** + +### Batch Import +1. Go to **ZUGFeRD Import > Batch Import** +2. Select source (Folder or Email) +3. Click **Start Import** +4. Review results + +### Product Mapping +1. Go to **ZUGFeRD Import > Product Mapping** +2. Select supplier +3. Add mappings: Supplier article number → Your product + +## Extrafields + +The module adds a custom field to third parties: +- **Customer No. at Supplier**: Your customer number at this supplier (used for automatic supplier detection via buyer reference) + +## Translations + +Available in: +- German (de_DE) +- English (en_US) + +## Version History + +### 1.1 +- New persistent import workflow with database storage +- Manual product assignment via dropdown +- Product removal/reassignment +- Status "Pending" for imports requiring manual intervention +- Pending imports overview on upload page +- UN/ECE unit code translation (C62 → Stk., MTR → m, etc.) +- Batch import from folder or IMAP mailbox +- IMAP connection test with folder selection +- Product template feature (duplicate existing product) + +### 1.0 +- Initial release +- Basic ZUGFeRD/Factur-X import +- Automatic product matching +- Supplier detection +- Duplicate detection + +## License + +GPLv3 or (at your option) any later version. See file COPYING for more information. + +## Author + +Eduard Wisch - [data IT solution](https://data-it-solution.de) diff --git a/admin/about.php b/admin/about.php new file mode 100755 index 0000000..1a01181 --- /dev/null +++ b/admin/about.php @@ -0,0 +1,118 @@ + + * Copyright (C) 2026 Eduard Wisch + * Copyright (C) 2024 Frédéric France + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file importzugferd/admin/about.php + * \ingroup importzugferd + * \brief About page of module ImportZugferd. + */ + +// Load Dolibarr environment +$res = 0; +// Try main.inc.php into web root known defined into CONTEXT_DOCUMENT_ROOT (not always defined) +if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { + $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; +} +// Try main.inc.php into web root detected using web root calculated from SCRIPT_FILENAME +$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; +$tmp2 = realpath(__FILE__); +$i = strlen($tmp) - 1; +$j = strlen($tmp2) - 1; +while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +// Try main.inc.php using relative path +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +// Libraries +require_once DOL_DOCUMENT_ROOT.'/core/lib/admin.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/lib/functions2.lib.php'; +require_once '../lib/importzugferd.lib.php'; + +/** + * @var Conf $conf + * @var DoliDB $db + * @var HookManager $hookmanager + * @var Translate $langs + * @var User $user + */ + +// Translations +$langs->loadLangs(array("errors", "admin", "importzugferd@importzugferd")); + +// Access control +if (!$user->admin) { + accessforbidden(); +} + +// Parameters +$action = GETPOST('action', 'aZ09'); +$backtopage = GETPOST('backtopage', 'alpha'); + + +/* + * Actions + */ + +// None + + +/* + * View + */ + +$form = new Form($db); + +$help_url = ''; +$title = "ImportZugferdSetup"; + +llxHeader('', $langs->trans($title), $help_url, '', 0, 0, '', '', '', 'mod-importzugferd page-admin_about'); + +// Subheader +$linkback = ''.$langs->trans("BackToModuleList").''; + +print load_fiche_titre($langs->trans($title), $linkback, 'title_setup'); + +// Configuration header +$head = importzugferdAdminPrepareHead(); +print dol_get_fiche_head($head, 'about', $langs->trans($title), 0, 'importzugferd@importzugferd'); + +dol_include_once('/importzugferd/core/modules/modImportZugferd.class.php'); +$tmpmodule = new modImportZugferd($db); +print $tmpmodule->getDescLong(); + +// Page end +print dol_get_fiche_end(); +llxFooter(); +$db->close(); diff --git a/admin/setup.php b/admin/setup.php new file mode 100755 index 0000000..83f56d8 --- /dev/null +++ b/admin/setup.php @@ -0,0 +1,286 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + */ + +/** + * \file importzugferd/admin/setup.php + * \ingroup importzugferd + * \brief ImportZugferd setup page. + */ + +// Load Dolibarr environment +$res = 0; +if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { + $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; +} +$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; +$tmp2 = realpath(__FILE__); +$i = strlen($tmp) - 1; +$j = strlen($tmp2) - 1; +while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +// Libraries +require_once DOL_DOCUMENT_ROOT."/core/lib/admin.lib.php"; +require_once '../lib/importzugferd.lib.php'; + +// Translations +$langs->loadLangs(array("admin", "importzugferd@importzugferd")); + +// Parameters +$action = GETPOST('action', 'aZ09'); +$backtopage = GETPOST('backtopage', 'alpha'); + +// Access control +if (!$user->admin) { + accessforbidden(); +} + +// Form setup using FormSetup class +if (!class_exists('FormSetup')) { + require_once DOL_DOCUMENT_ROOT.'/core/class/html.formsetup.class.php'; +} +$formSetup = new FormSetup($db); + +/* + * Setup configuration items + */ + +// IMAP Settings Section +$formSetup->newItem('IMAPSettings')->setAsTitle(); + +$item = $formSetup->newItem('IMPORTZUGFERD_IMAP_HOST'); +$item->defaultFieldValue = ''; +$item->cssClass = 'minwidth300'; +$item->fieldAttr['placeholder'] = 'imap.example.com'; + +$item = $formSetup->newItem('IMPORTZUGFERD_IMAP_PORT'); +$item->defaultFieldValue = '993'; +$item->cssClass = 'width100'; + +$item = $formSetup->newItem('IMPORTZUGFERD_IMAP_USER'); +$item->defaultFieldValue = ''; +$item->cssClass = 'minwidth300'; +$item->fieldAttr['placeholder'] = 'invoices@example.com'; + +$item = $formSetup->newItem('IMPORTZUGFERD_IMAP_PASSWORD'); +$item->cssClass = 'minwidth300'; +$item->fieldAttr['type'] = 'password'; + +$item = $formSetup->newItem('IMPORTZUGFERD_IMAP_FOLDER'); +$item->defaultFieldValue = 'INBOX'; +$item->cssClass = 'minwidth200'; + +$formSetup->newItem('IMPORTZUGFERD_IMAP_SSL')->setAsYesNo(); + +// Import Settings Section +$formSetup->newItem('ImportSettings')->setAsTitle(); + +$formSetup->newItem('IMPORTZUGFERD_AUTO_CREATE_INVOICE')->setAsYesNo(); + +// Folder Import Settings Section +$formSetup->newItem('FolderImportSettings')->setAsTitle(); + +$item = $formSetup->newItem('IMPORTZUGFERD_WATCH_FOLDER'); +$item->defaultFieldValue = ''; +$item->cssClass = 'minwidth400'; +$item->fieldAttr['placeholder'] = '/path/to/invoices'; + +$item = $formSetup->newItem('IMPORTZUGFERD_ARCHIVE_FOLDER'); +$item->defaultFieldValue = ''; +$item->cssClass = 'minwidth400'; +$item->fieldAttr['placeholder'] = '/path/to/archive'; + +$item = $formSetup->newItem('IMPORTZUGFERD_IMAP_ARCHIVE_FOLDER'); +$item->defaultFieldValue = 'Archive'; +$item->cssClass = 'minwidth200'; + +/* + * Actions + */ + +if (versioncompare(explode('.', DOL_VERSION), array(15)) < 0 && $action == 'update' && !empty($user->admin)) { + $formSetup->saveConfFromPost(); +} + +include DOL_DOCUMENT_ROOT.'/core/actions_setmoduleoptions.inc.php'; + +/* + * View + */ + +$form = new Form($db); + +$title = "ImportZugferdSetup"; +llxHeader('', $langs->trans($title), '', '', 0, 0, '', '', '', 'mod-importzugferd page-admin'); + +// Subheader +$linkback = ''.$langs->trans("BackToModuleList").''; + +print load_fiche_titre($langs->trans($title), $linkback, 'title_setup'); + +// Configuration header +$head = importzugferdAdminPrepareHead(); +print dol_get_fiche_head($head, 'settings', $langs->trans($title), -1, "importzugferd@importzugferd"); + +// Setup page description +print ''.$langs->trans("ImportZugferdSetupPage").'

'; + +// Display the form +print $formSetup->generateOutput(true); + +// Test IMAP connection button and folder selection +if (getDolGlobalString('IMPORTZUGFERD_IMAP_HOST')) { + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + + // Check if IMAP extension is available + $imap_available = function_exists('imap_open'); + + // Test connection action + $imap_folders = array(); + $connection_ok = false; + + if (!$imap_available) { + print ''; + print ''; + print ''; + } elseif ($action == 'test_imap' || $action == 'select_folder') { + $host = getDolGlobalString('IMPORTZUGFERD_IMAP_HOST'); + $port = getDolGlobalString('IMPORTZUGFERD_IMAP_PORT', '993'); + $imap_user = getDolGlobalString('IMPORTZUGFERD_IMAP_USER'); + $password = getDolGlobalString('IMPORTZUGFERD_IMAP_PASSWORD'); + $ssl = getDolGlobalString('IMPORTZUGFERD_IMAP_SSL'); + + $mailbox_base = '{' . $host . ':' . $port . '/imap' . ($ssl ? '/ssl' : '') . '/novalidate-cert}'; + $mailbox = $mailbox_base . 'INBOX'; + + $connection = @imap_open($mailbox, $imap_user, $password); + + if ($connection) { + $connection_ok = true; + setEventMessages($langs->trans('ConnectionSuccessful'), null, 'mesgs'); + + // Get list of folders + $folders_raw = imap_list($connection, $mailbox_base, '*'); + if ($folders_raw) { + foreach ($folders_raw as $folder) { + // Remove the mailbox base from folder name + $folder_name = str_replace($mailbox_base, '', $folder); + // Decode folder name (IMAP uses modified UTF-7) + $folder_name_decoded = imap_utf7_decode($folder_name); + $imap_folders[$folder_name] = $folder_name_decoded; + } + } + + imap_close($connection); + } else { + setEventMessages($langs->trans('ConnectionFailed') . ': ' . imap_last_error(), null, 'errors'); + } + } + + // Save selected folder + if ($action == 'select_folder' && GETPOST('imap_folder', 'alpha')) { + $selected_folder = GETPOST('imap_folder', 'alpha'); + dolibarr_set_const($db, 'IMPORTZUGFERD_IMAP_FOLDER', $selected_folder, 'chaine', 0, '', $conf->entity); + setEventMessages($langs->trans('FolderSelected').': '.$selected_folder, null, 'mesgs'); + } + + // Only show status and folder selection if IMAP is available + if ($imap_available) { + print ''; + print ''; + print ''; + print ''; + } + + // Show folder selection if connection was successful + if ($imap_available && $connection_ok && !empty($imap_folders)) { + print ''; + print ''; + print ''; + print ''; + print ''; + } + + // Only show test button if IMAP extension is available + if ($imap_available) { + print ''; + print ''; + print ''; + } + + print '
'.$langs->trans('TestConnection').'
'; + print ''; + print $langs->trans('IMAPExtensionNotInstalled'); + print '
'; + print ''.$langs->trans('IMAPExtensionHelp').''; + print '
'.$langs->trans('Status').''; + if ($action == 'test_imap' || $action == 'select_folder') { + if ($connection_ok) { + print ''.$langs->trans('ConnectionSuccessful').''; + } else { + print ''.$langs->trans('ConnectionFailed').''; + } + } else { + print ''.$langs->trans('ClickTestToCheck').''; + } + print '
'.$langs->trans('SelectFolder').''; + print '
'; + print ''; + print ''; + + $current_folder = getDolGlobalString('IMPORTZUGFERD_IMAP_FOLDER', 'INBOX'); + print ''; + print ' '; + print '
'; + print '
'; + print ''.$langs->trans('FoundFolders').': '.count($imap_folders).''; + print '
'; + print ''; + print ''.$langs->trans('TestConnection'); + print ''; + print '
'; + print '
'; +} + +print '
'; + +// Page end +print dol_get_fiche_end(); + +llxFooter(); +$db->close(); diff --git a/batch.php b/batch.php new file mode 100644 index 0000000..c6bb880 --- /dev/null +++ b/batch.php @@ -0,0 +1,424 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../main.inc.php")) { + $res = @include "../main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + +dol_include_once('/importzugferd/class/actions_importzugferd.class.php'); +dol_include_once('/importzugferd/lib/importzugferd.lib.php'); + +// Load translation files +$langs->loadLangs(array("importzugferd@importzugferd", "bills", "products")); + +// Security check +if (!$user->hasRight('importzugferd', 'import', 'write')) { + accessforbidden(); +} + +// Get parameters +$action = GETPOST('action', 'aZ09'); +$source = GETPOST('source', 'alpha'); + +// Initialize objects +$actions = new ActionsImportZugferd($db); + +$import_results = array(); +$error = 0; + +/* + * Actions + */ + +// Process batch import +if ($action == 'process') { + $auto_create = getDolGlobalString('IMPORTZUGFERD_AUTO_CREATE_INVOICE'); + + if ($source == 'folder') { + // Import from local folder + $watch_folder = getDolGlobalString('IMPORTZUGFERD_WATCH_FOLDER'); + $archive_folder = getDolGlobalString('IMPORTZUGFERD_ARCHIVE_FOLDER'); + + if (empty($watch_folder) || !is_dir($watch_folder)) { + setEventMessages($langs->trans('ErrorWatchFolderNotConfigured'), null, 'errors'); + $error++; + } else { + // Create archive folder if needed + if (!empty($archive_folder) && !is_dir($archive_folder)) { + dol_mkdir($archive_folder); + } + + // Get PDF files from watch folder + $files = glob($watch_folder . '/*.pdf'); + if (empty($files)) { + $files = glob($watch_folder . '/*.PDF'); + } + + if (!empty($files)) { + foreach ($files as $pdf_path) { + $result = array( + 'file' => basename($pdf_path), + 'status' => 'error', + 'message' => '', + 'invoice_id' => 0, + ); + + $res = $actions->processPdf($pdf_path, $user, $auto_create); + + if ($res > 0) { + $result['status'] = 'success'; + $result['message'] = $langs->trans('ImportSuccessful'); + $import_data = $actions->getResult(); + $result['invoice_id'] = $import_data['invoice_id']; + + // Move to archive + if (!empty($archive_folder) && is_dir($archive_folder)) { + $archive_path = $archive_folder . '/' . basename($pdf_path); + if (rename($pdf_path, $archive_path)) { + $result['archived'] = true; + } + } + } elseif ($res == -3) { + // Duplicate + $result['status'] = 'skipped'; + $result['message'] = $langs->trans('ErrorDuplicateInvoice'); + } else { + $result['message'] = $actions->error; + } + + $import_results[] = $result; + } + } else { + setEventMessages($langs->trans('NoFilesFound'), null, 'warnings'); + } + } + } elseif ($source == 'imap') { + // Import from IMAP + if (!function_exists('imap_open')) { + setEventMessages($langs->trans('IMAPExtensionNotInstalled'), null, 'errors'); + $error++; + } else { + $host = getDolGlobalString('IMPORTZUGFERD_IMAP_HOST'); + $port = getDolGlobalString('IMPORTZUGFERD_IMAP_PORT', '993'); + $imap_user = getDolGlobalString('IMPORTZUGFERD_IMAP_USER'); + $password = getDolGlobalString('IMPORTZUGFERD_IMAP_PASSWORD'); + $ssl = getDolGlobalString('IMPORTZUGFERD_IMAP_SSL'); + $folder = getDolGlobalString('IMPORTZUGFERD_IMAP_FOLDER', 'INBOX'); + $archive_folder = getDolGlobalString('IMPORTZUGFERD_IMAP_ARCHIVE_FOLDER', 'Archive'); + + if (empty($host) || empty($imap_user)) { + setEventMessages($langs->trans('ErrorIMAPNotConfigured'), null, 'errors'); + $error++; + } else { + $mailbox_base = '{' . $host . ':' . $port . '/imap' . ($ssl ? '/ssl' : '') . '/novalidate-cert}'; + $mailbox = $mailbox_base . $folder; + + $connection = @imap_open($mailbox, $imap_user, $password); + + if ($connection) { + // Search for emails with PDF attachments + $emails = imap_search($connection, 'ALL'); + + if ($emails) { + // Create temp directory for attachments + $temp_dir = $conf->importzugferd->dir_output . '/temp'; + if (!is_dir($temp_dir)) { + dol_mkdir($temp_dir); + } + + foreach ($emails as $email_num) { + $structure = imap_fetchstructure($connection, $email_num); + $attachments = array(); + + // Find PDF attachments + if (isset($structure->parts)) { + foreach ($structure->parts as $part_num => $part) { + $filename = ''; + if ($part->ifdparameters) { + foreach ($part->dparameters as $param) { + if (strtolower($param->attribute) == 'filename') { + $filename = $param->value; + } + } + } + if (empty($filename) && $part->ifparameters) { + foreach ($part->parameters as $param) { + if (strtolower($param->attribute) == 'name') { + $filename = $param->value; + } + } + } + + // Check if PDF + if (!empty($filename) && preg_match('/\.pdf$/i', $filename)) { + $attachments[] = array( + 'filename' => $filename, + 'part_num' => $part_num + 1, + 'encoding' => $part->encoding, + ); + } + } + } + + // Process each PDF attachment + $email_processed = false; + foreach ($attachments as $attachment) { + $data = imap_fetchbody($connection, $email_num, $attachment['part_num']); + + // Decode attachment + if ($attachment['encoding'] == 3) { // BASE64 + $data = base64_decode($data); + } elseif ($attachment['encoding'] == 4) { // QUOTED-PRINTABLE + $data = quoted_printable_decode($data); + } + + // Save to temp file + $temp_file = $temp_dir . '/' . uniqid() . '_' . $attachment['filename']; + file_put_contents($temp_file, $data); + + $result = array( + 'file' => $attachment['filename'], + 'status' => 'error', + 'message' => '', + 'invoice_id' => 0, + ); + + // Process the PDF + $res = $actions->processPdf($temp_file, $user, $auto_create); + + if ($res > 0) { + $result['status'] = 'success'; + $result['message'] = $langs->trans('ImportSuccessful'); + $import_data = $actions->getResult(); + $result['invoice_id'] = $import_data['invoice_id']; + $email_processed = true; + } elseif ($res == -3) { + $result['status'] = 'skipped'; + $result['message'] = $langs->trans('ErrorDuplicateInvoice'); + } else { + $result['message'] = $actions->error; + } + + // Clean up temp file + @unlink($temp_file); + + $import_results[] = $result; + } + + // Move email to archive folder if successfully processed + if ($email_processed && !empty($archive_folder)) { + $archive_mailbox = $mailbox_base . $archive_folder; + @imap_mail_move($connection, $email_num, $archive_folder); + } + } + + // Expunge to apply moves + imap_expunge($connection); + } else { + setEventMessages($langs->trans('NoEmailsFound'), null, 'warnings'); + } + + imap_close($connection); + } else { + setEventMessages($langs->trans('ConnectionFailed') . ': ' . imap_last_error(), null, 'errors'); + $error++; + } + } + } + } + + if (!empty($import_results)) { + $success_count = 0; + $error_count = 0; + $skipped_count = 0; + foreach ($import_results as $r) { + if ($r['status'] == 'success') $success_count++; + elseif ($r['status'] == 'skipped') $skipped_count++; + else $error_count++; + } + setEventMessages($langs->trans('BatchImportComplete', $success_count, $error_count, $skipped_count), null, 'mesgs'); + } +} + +/* + * View + */ + +$form = new Form($db); + +$title = $langs->trans('BatchImport'); +llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-batch'); + +print load_fiche_titre($title, '', 'fa-file-import'); + +// Check configuration +$watch_folder = getDolGlobalString('IMPORTZUGFERD_WATCH_FOLDER'); +$imap_host = getDolGlobalString('IMPORTZUGFERD_IMAP_HOST'); + +if (empty($watch_folder) && empty($imap_host)) { + print '
'.$langs->trans('BatchImportNotConfigured').'
'; + print '
'.$langs->trans('ConfigureModule').''; +} else { + // Source selection + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + + // Folder option + if (!empty($watch_folder)) { + print ''; + print ''; + print ''; + } + + // IMAP option + if (!empty($imap_host)) { + print ''; + print ''; + print ''; + } + + print '
'.$langs->trans('SelectSource').'
'; + print '
'; + print ''; + print ''; + print ''; + + print '
'; + print ''; + print '
'; + print '
'; + print ''.$langs->trans('ImportFromFolder').'
'; + print ''.$watch_folder.''; + + // Count files + $files = glob($watch_folder . '/*.pdf'); + if (empty($files)) $files = glob($watch_folder . '/*.PDF'); + $file_count = !empty($files) ? count($files) : 0; + print '
'.$file_count.' '.$langs->trans('Files').''; + + print '
'; + print '
'; + print ''; + print '
'; + + print '
'; + print '
'; + print '
'; + print ''; + print ''; + print ''; + + print '
'; + print ''; + print '
'; + print '
'; + print ''.$langs->trans('ImportFromIMAP').'
'; + print ''.$imap_host.' / '.getDolGlobalString('IMPORTZUGFERD_IMAP_FOLDER', 'INBOX').''; + print '
'; + print '
'; + if (function_exists('imap_open')) { + print ''; + } else { + print ''.$langs->trans('IMAPExtensionNotInstalled').''; + } + print '
'; + + print '
'; + print '
'; + print '
'; + print '
'; + + // Show results + if (!empty($import_results)) { + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + foreach ($import_results as $result) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + + print '
'.$langs->trans('File').''.$langs->trans('Status').''.$langs->trans('Message').''.$langs->trans('SupplierInvoice').'
'.dol_escape_htmltag($result['file']).''; + if ($result['status'] == 'success') { + print ''.$langs->trans('Success').''; + if (!empty($result['archived'])) { + print ' '; + } + } elseif ($result['status'] == 'skipped') { + print ''.$langs->trans('Skipped').''; + } else { + print ''.$langs->trans('Error').''; + } + print ''.dol_escape_htmltag($result['message']).''; + if ($result['invoice_id'] > 0) { + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; + $invoice = new FactureFournisseur($db); + $invoice->fetch($result['invoice_id']); + print $invoice->getNomUrl(1); + } else { + print '-'; + } + print '
'; + print '
'; + } +} + +llxFooter(); +$db->close(); diff --git a/build/buildzip.php b/build/buildzip.php new file mode 100755 index 0000000..3508bbb --- /dev/null +++ b/build/buildzip.php @@ -0,0 +1,316 @@ +#!/usr/bin/env php -d memory_limit=256M + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as + * published by the Free Software Foundation, either version 3 of the + * License, or (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +/* + The goal of that php CLI script is to make zip package of your module + as an alternative to web "build zip" or "perl script makepack" +*/ + +// ============================================= configuration + +/** + * list of files & dirs of your module + * + * @var string[] + */ +$listOfModuleContent = [ + 'admin', + 'ajax', + 'backport', + 'class', + 'css', + 'COPYING', + 'core', + 'img', + 'js', + 'langs', + 'lib', + 'sql', + 'tpl', + '*.md', + '*.json', + '*.php', + 'modulebuilder.txt', +]; + +/** + * if you want to exclude some files from your zip + * + * @var string[] + */ +$exclude_list = [ + '/^.git$/', + '/.*js.map/', + '/DEV.md/' +]; + +// ============================================= end of configuration + +/** + * auto detect module name and version from file name + * + * @return (string|string)[] module name and module version + */ +function detectModule() +{ + $name = $version = ""; + $tab = glob("core/modules/mod*.class.php"); + if (count($tab) == 0) { + echo "[fail] Error on auto detect data : there is no mod*.class.php file into core/modules dir\n"; + exit(-1); + } + if (count($tab) == 1) { + $file = $tab[0]; + $pattern = "/.*mod(?.*)\.class\.php/"; + if (preg_match_all($pattern, $file, $matches)) { + $name = strtolower(reset($matches['mod'])); + } + + echo "extract data from $file\n"; + if (!file_exists($file) || $name == "") { + echo "[fail] Error on auto detect data\n"; + exit(-2); + } + } else { + echo "[fail] Error there is more than one mod*.class.php file into core/modules dir\n"; + exit(-3); + } + + //extract version from file + $contents = file_get_contents($file); + $pattern = "/^.*this->version\s*=\s*'(?.*)'\s*;.*\$/m"; + + // search, and store all matching occurrences in $matches + if (preg_match_all($pattern, $contents, $matches)) { + $version = reset($matches['version']); + } + + if (version_compare($version, '0.0.1', '>=') != 1) { + echo "[fail] Error auto extract version fail\n"; + exit(-4); + } + + echo "module name = $name, version = $version\n"; + return [(string) $name, (string) $version]; +} + +/** + * delete recursively a directory + * + * @param string $dir dir path to delete + * + * @return bool true on success or false on failure. + */ +function delTree($dir) +{ + $files = array_diff(scandir($dir), array('.', '..')); + foreach ($files as $file) { + (is_dir("$dir/$file")) ? delTree("$dir/$file") : secureUnlink("$dir/$file"); + } + return rmdir($dir); +} + + +/** + * do a secure delete file/dir with double check + * (don't trust unlink return) + * + * @param string $path full path to delete + * + * @return bool true on success ($path does not exists at the end of process), else exit + */ +function secureUnlink($path) +{ + if (file_exists($path)) { + if (unlink($path)) { + //then check if really deleted + clearstatcache(); + if (file_exists($path)) { // @phpstan-ignore-line + echo "[fail] unlink of $path fail !\n"; + exit(-5); + } + } else { + echo "[fail] unlink of $path fail !\n"; + exit(-6); + } + } + return true; +} + +/** + * create a directory and check if dir exists + * + * @param string $path path to make + * + * @return bool true on success ($path exists at the end of process), else exit + */ +function mkdirAndCheck($path) +{ + if (mkdir($path)) { + clearstatcache(); + if (is_dir($path)) { + return true; + } + } + echo "[fail] Error on $path (mkdir)\n"; + exit(7); +} + +/** + * check if that filename is concerned by exclude filter + * + * @param string $filename file name to check + * + * @return bool true if file is in excluded list + */ +function is_excluded($filename) +{ + global $exclude_list; + $count = 0; + $notused = preg_filter($exclude_list, '1', $filename, -1, $count); + if ($count > 0) { + echo " - exclude $filename\n"; + return true; + } + return false; +} + +/** + * recursive copy files & dirs + * + * @param string $src source dir + * @param string $dst target dir + * + * @return bool true on success or false on failure. + */ +function rcopy($src, $dst) +{ + if (is_dir($src)) { + // Make the destination directory if not exist + mkdirAndCheck($dst); + // open the source directory + $dir = opendir($src); + + // Loop through the files in source directory + while ($file = readdir($dir)) { + if (($file != '.') && ($file != '..')) { + if (is_dir($src . '/' . $file)) { + // Recursively calling custom copy function + // for sub directory + if (!rcopy($src . '/' . $file, $dst . '/' . $file)) { + return false; + } + } else { + if (!is_excluded($file)) { + if (!copy($src . '/' . $file, $dst . '/' . $file)) { + return false; + } + } + } + } + } + closedir($dir); + } elseif (is_file($src)) { + if (!is_excluded($src)) { + if (!copy($src, $dst)) { + return false; + } + } + } + return true; +} + +/** + * build a zip file with only php code and no external depends + * on "zip" exec for example + * + * @param string $folder folder to use as zip root + * @param ZipArchive $zip zip object (ZipArchive) + * @param string $root relative root path into the zip + * + * @return bool true on success or false on failure. + */ +function zipDir($folder, &$zip, $root = "") +{ + foreach (new \DirectoryIterator($folder) as $f) { + if ($f->isDot()) { + continue; + } //skip . .. + $src = $folder . '/' . $f; + $dst = substr($f->getPathname(), strlen($root)); + if ($f->isDir()) { + if ($zip->addEmptyDir($dst)) { + if (zipDir($src, $zip, $root)) { + continue; + } else { + return false; + } + } else { + return false; + } + } + if ($f->isFile()) { + if (! $zip->addFile($src, $dst)) { + return false; + } + } + } + return true; +} + +/** + * main part of script + */ + +list($mod, $version) = detectModule(); +$outzip = sys_get_temp_dir() . "/module_" . $mod . "-" . $version . ".zip"; +if (file_exists($outzip)) { + secureUnlink($outzip); +} + +//copy all sources into system temp directory +$tmpdir = tempnam(sys_get_temp_dir(), $mod . "-module"); +secureUnlink($tmpdir); +mkdirAndCheck($tmpdir); +$dst = $tmpdir . "/" . $mod; +mkdirAndCheck($dst); + +foreach ($listOfModuleContent as $moduleContent) { + foreach (glob($moduleContent) as $entry) { + if (!rcopy($entry, $dst . '/' . $entry)) { + echo "[fail] Error on copy " . $entry . " to " . $dst . "/" . $entry . "\n"; + echo "Please take time to analyze the problem and fix the bug\n"; + exit(-8); + } + } +} + +$z = new ZipArchive(); +$z->open($outzip, ZIPARCHIVE::CREATE); +zipDir($tmpdir, $z, $tmpdir . '/'); +$z->close(); +delTree($tmpdir); +if (file_exists($outzip)) { + echo "[success] module archive is ready : $outzip ...\n"; +} else { + echo "[fail] build zip error\n"; + exit(-9); +} diff --git a/build/makepack-importzugferd.conf b/build/makepack-importzugferd.conf new file mode 100755 index 0000000..16dc1e7 --- /dev/null +++ b/build/makepack-importzugferd.conf @@ -0,0 +1,11 @@ +# Your module name here +# +# Goal: Goal of module +# Version: +# Author: Copyright - +# License: GPLv3 +# Install: Just unpack content of module package in Dolibarr directory. +# Setup: Go on Dolibarr setup - modules to enable module. +# +# Files in module +mymodule/ \ No newline at end of file diff --git a/card.php b/card.php new file mode 100644 index 0000000..73e7e95 --- /dev/null +++ b/card.php @@ -0,0 +1,268 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../main.inc.php")) { + $res = @include "../main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; + +dol_include_once('/importzugferd/class/zugferdimport.class.php'); +dol_include_once('/importzugferd/lib/importzugferd.lib.php'); + +// Load translation files +$langs->loadLangs(array("importzugferd@importzugferd", "bills", "companies")); + +// Get parameters +$id = GETPOST('id', 'int'); +$ref = GETPOST('ref', 'alpha'); +$action = GETPOST('action', 'aZ09'); +$confirm = GETPOST('confirm', 'alpha'); + +// Initialize object +$object = new ZugferdImport($db); + +// Load object +if ($id > 0 || !empty($ref)) { + $result = $object->fetch($id, $ref); + if ($result <= 0) { + setEventMessages($langs->trans('RecordNotFound'), null, 'errors'); + header('Location: '.dol_buildpath('/importzugferd/list.php', 1)); + exit; + } +} + +// Security check +if (!$user->hasRight('importzugferd', 'import', 'read')) { + accessforbidden(); +} + +$permissiontodelete = $user->hasRight('importzugferd', 'import', 'delete'); + +/* + * Actions + */ + +// Delete confirmation +if ($action == 'delete' && $confirm == 'yes' && $permissiontodelete) { + $result = $object->delete($user); + if ($result > 0) { + setEventMessages($langs->trans('RecordDeleted'), null, 'mesgs'); + header('Location: '.dol_buildpath('/importzugferd/list.php', 1)); + exit; + } else { + setEventMessages($object->error, $object->errors, 'errors'); + } +} + +/* + * View + */ + +$form = new Form($db); + +$title = $langs->trans('ImportRecord').' - '.$object->ref; +llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-card'); + +// Confirmation dialog for delete +if ($action == 'delete') { + print $form->formconfirm( + $_SERVER["PHP_SELF"].'?id='.$object->id, + $langs->trans('DeleteImportRecord'), + $langs->trans('ConfirmDeleteImportRecord', $object->ref), + 'delete', + '', + 0, + 1 + ); +} + +// Header +print '
'; +print '
'; + +print ''; + +// Ref +print ''; +print ''; +print ''; +print ''; + +// Invoice number +print ''; +print ''; +print ''; +print ''; + +// Invoice date +print ''; +print ''; +print ''; +print ''; + +// Seller +print ''; +print ''; +print ''; +print ''; + +// VAT ID +print ''; +print ''; +print ''; +print ''; + +// Buyer reference +print ''; +print ''; +print ''; +print ''; + +// Total HT +print ''; +print ''; +print ''; +print ''; + +// Total TTC +print ''; +print ''; +print ''; +print ''; + +// Supplier invoice +print ''; +print ''; +print ''; +print ''; + +// Status +print ''; +print ''; +print ''; +print ''; + +// Error message +if ($object->status == ZugferdImport::STATUS_ERROR && !empty($object->error_message)) { + print ''; + print ''; + print ''; + print ''; +} + +// PDF filename +print ''; +print ''; +print ''; +print ''; + +// Date creation +print ''; +print ''; +print ''; +print ''; + +print '
'.$langs->trans('Ref').''.$object->ref.'
'.$langs->trans('InvoiceNumber').''.dol_escape_htmltag($object->invoice_number).'
'.$langs->trans('InvoiceDate').''.dol_print_date($object->invoice_date, 'day').'
'.$langs->trans('Supplier').''; +if ($object->fk_soc > 0) { + $supplier = new Societe($db); + $supplier->fetch($object->fk_soc); + print $supplier->getNomUrl(1); + print ' ('.dol_escape_htmltag($object->seller_name).')'; +} else { + print dol_escape_htmltag($object->seller_name); +} +print '
'.$langs->trans('VATIntra').''.dol_escape_htmltag($object->seller_vat).'
'.$langs->trans('BuyerReference').''.dol_escape_htmltag($object->buyer_reference).'
'.$langs->trans('TotalHT').''.price($object->total_ht).' '.$object->currency.'
'.$langs->trans('TotalTTC').''.price($object->total_ttc).' '.$object->currency.'
'.$langs->trans('SupplierInvoice').''; +if ($object->fk_facture_fourn > 0) { + $invoice = new FactureFournisseur($db); + $invoice->fetch($object->fk_facture_fourn); + print $invoice->getNomUrl(1); +} else { + print '-'; +} +print '
'.$langs->trans('Status').''.$object->getLibStatut(1).'
'.$langs->trans('ErrorMessage').''.dol_escape_htmltag($object->error_message).'
'.$langs->trans('File').''.dol_escape_htmltag($object->pdf_filename).'
'.$langs->trans('DateCreation').''.dol_print_date($object->date_creation, 'dayhour').'
'; + +print '
'; + +// Action buttons +print '
'; + +// Reimport button - link to import page +print ''.$langs->trans('ImportAnother').''; + +// Delete button +if ($permissiontodelete) { + print ''.$langs->trans('Delete').''; +} + +print '
'; + +// Show XML content (collapsed) +if (!empty($object->xml_content)) { + // Format XML for better readability using class method + $formattedXml = ZugferdImport::formatXmlForDisplay($object->xml_content); + + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print '
'.$langs->trans('XMLContent').'
'; + print ''.$langs->trans('ClickToExpand').''; + print ''; + print '
'; + print '
'; +} + +llxFooter(); +$db->close(); diff --git a/class/actions_importzugferd.class.php b/class/actions_importzugferd.class.php new file mode 100644 index 0000000..6073fd8 --- /dev/null +++ b/class/actions_importzugferd.class.php @@ -0,0 +1,723 @@ +db = $db; + $this->parser = new ZugferdParser($db); + $this->import = new ZugferdImport($db); + $this->mapping = new ProductMapping($db); + } + + /** + * Process a ZUGFeRD PDF file + * + * @param string $pdf_path Path to PDF file + * @param User $user Current user + * @param bool $create_invoice Whether to create supplier invoice + * @param bool $force_reimport Whether to bypass duplicate check + * @return int <0 if KO, >0 if OK (import record ID) + */ + public function processPdf($pdf_path, $user, $create_invoice = false, $force_reimport = false) + { + global $conf; + + $this->result = array( + 'import_id' => 0, + 'invoice_id' => 0, + 'supplier_id' => 0, + 'supplier_found' => false, + 'is_duplicate' => false, + 'lines' => array(), + 'warnings' => array(), + ); + + // Extract XML from PDF + $res = $this->parser->extractFromPdf($pdf_path); + if ($res < 0) { + $this->error = $this->parser->error; + return -1; + } + + // Parse XML + $res = $this->parser->parse(); + if ($res < 0) { + $this->error = $this->parser->error; + return -2; + } + + $invoice_data = $this->parser->getInvoiceData(); + + // Check for duplicates + $file_hash = $this->parser->getFileHash($pdf_path); + if ($this->import->isDuplicate($file_hash)) { + if ($force_reimport) { + // Delete existing import record to allow reimport + $this->deleteExistingImport($file_hash, $user); + } else { + global $langs; + $langs->load('importzugferd@importzugferd'); + $this->result['is_duplicate'] = true; + $this->error = $langs->trans('ErrorDuplicateInvoice'); + return -3; + } + } + + // Find supplier + $supplier_id = $this->findSupplier($invoice_data); + $this->result['supplier_id'] = $supplier_id; + $this->result['supplier_found'] = ($supplier_id > 0); + + // Create import record + $this->import->invoice_number = $invoice_data['invoice_number']; + $this->import->invoice_date = $invoice_data['invoice_date']; + $this->import->seller_name = $invoice_data['seller']['name']; + $this->import->seller_vat = $invoice_data['seller']['vat_id']; + $this->import->buyer_reference = $invoice_data['buyer']['reference'] ?: $invoice_data['buyer']['id']; + $this->import->total_ht = $invoice_data['totals']['net']; + $this->import->total_ttc = $invoice_data['totals']['gross']; + $this->import->currency = $invoice_data['totals']['currency'] ?: 'EUR'; + $this->import->fk_soc = $supplier_id; + $this->import->xml_content = $this->parser->getXmlContent(); + $this->import->pdf_filename = basename($pdf_path); + $this->import->file_hash = $file_hash; + $this->import->status = ZugferdImport::STATUS_IMPORTED; + $this->import->date_import = dol_now(); + + $import_id = $this->import->create($user); + if ($import_id < 0) { + $this->error = $this->import->error; + return -4; + } + + $this->result['import_id'] = $import_id; + + // Process line items + $this->result['lines'] = $this->processLineItems($invoice_data['lines'], $supplier_id); + + // Copy PDF to documents folder + $this->copyToDocuments($pdf_path, $import_id); + + // Create supplier invoice if requested + if ($create_invoice && $supplier_id > 0) { + $invoice_id = $this->createSupplierInvoice($invoice_data, $supplier_id, $user, $pdf_path); + if ($invoice_id > 0) { + $this->result['invoice_id'] = $invoice_id; + $this->import->fk_facture_fourn = $invoice_id; + + // Check validation result - status may have been set to ERROR in validateTotals() + if ($this->import->status != ZugferdImport::STATUS_ERROR) { + $this->import->status = ZugferdImport::STATUS_PROCESSED; + } + $this->import->update($user); + + // Add validation warning if there was a sum mismatch + if (!empty($this->result['validation']) && !$this->result['validation']['valid']) { + $this->result['warnings'][] = $this->result['validation']['message']; + } + } else { + $this->result['warnings'][] = 'Could not create supplier invoice: ' . $this->error; + } + } + + return $import_id; + } + + /** + * Find supplier by buyer reference (customer number) + * + * @param array $invoice_data Parsed invoice data + * @return int Supplier ID or 0 + */ + public function findSupplier($invoice_data) + { + global $conf; + + $buyer_ref = $invoice_data['buyer']['reference'] ?: $invoice_data['buyer']['id']; + $seller_vat = $invoice_data['seller']['vat_id']; + $seller_name = $invoice_data['seller']['name']; + + // 1. Search by buyer reference in extrafield + if (!empty($buyer_ref)) { + $sql = "SELECT fk_object FROM " . MAIN_DB_PREFIX . "societe_extrafields"; + $sql .= " WHERE supplier_customer_number = '" . $this->db->escape($buyer_ref) . "'"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->fk_object; + } + } + + // 2. Search by VAT ID + if (!empty($seller_vat)) { + $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "societe"; + $sql .= " WHERE tva_intra = '" . $this->db->escape($seller_vat) . "'"; + $sql .= " AND fournisseur = 1"; + $sql .= " AND entity IN (" . getEntity('societe') . ")"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->rowid; + } + } + + // 3. Search by name (fuzzy) + if (!empty($seller_name)) { + $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "societe"; + $sql .= " WHERE (nom LIKE '" . $this->db->escape($seller_name) . "%'"; + $sql .= " OR nom LIKE '%" . $this->db->escape(substr($seller_name, 0, 20)) . "%')"; + $sql .= " AND fournisseur = 1"; + $sql .= " AND entity IN (" . getEntity('societe') . ")"; + $sql .= " LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->rowid; + } + } + + return 0; + } + + /** + * Process line items and find matching products + * + * @param array $lines Line items from invoice + * @param int $supplier_id Supplier ID + * @return array Processed lines with product info + */ + public function processLineItems($lines, $supplier_id) + { + $processed = array(); + + foreach ($lines as $line) { + $processed_line = array( + 'line_id' => $line['line_id'], + 'supplier_ref' => $line['product']['seller_id'], + 'ean' => $line['product']['global_id'], + 'name' => $line['product']['name'], + 'description' => $line['product']['description'], + 'quantity' => $line['quantity'], + 'unit_code' => $line['unit_code'], + 'unit_price' => $line['unit_price'], + 'unit_price_raw' => isset($line['unit_price_raw']) ? $line['unit_price_raw'] : $line['unit_price'], + 'basis_quantity' => isset($line['basis_quantity']) ? $line['basis_quantity'] : 1, + 'basis_quantity_unit' => isset($line['basis_quantity_unit']) ? $line['basis_quantity_unit'] : '', + 'line_total' => $line['line_total'], + 'tax_percent' => $line['tax_percent'], + 'fk_product' => 0, + 'product_ref' => '', + 'product_label' => '', + 'match_method' => '', + 'needs_creation' => false, + ); + + // Try to find product + if ($supplier_id > 0) { + $match = $this->mapping->findProduct($supplier_id, $line['product']); + if ($match['fk_product'] > 0) { + $processed_line['fk_product'] = $match['fk_product']; + $processed_line['match_method'] = $match['method']; + + // Get product info + $product = new Product($this->db); + if ($product->fetch($match['fk_product']) > 0) { + $processed_line['product_ref'] = $product->ref; + $processed_line['product_label'] = $product->label; + } + } else { + $processed_line['needs_creation'] = true; + } + } else { + $processed_line['needs_creation'] = true; + } + + $processed[] = $processed_line; + } + + return $processed; + } + + /** + * Create supplier invoice from parsed data + * + * @param array $invoice_data Parsed invoice data + * @param int $supplier_id Supplier ID + * @param User $user Current user + * @param string $pdf_path Path to source PDF file (optional) + * @return int Invoice ID or <0 if error + */ + public function createSupplierInvoice($invoice_data, $supplier_id, $user, $pdf_path = '') + { + global $conf, $langs; + + $invoice = new FactureFournisseur($this->db); + + $invoice->socid = $supplier_id; + $invoice->ref_supplier = $invoice_data['invoice_number']; + $invoice->date = strtotime($invoice_data['invoice_date']); + $invoice->date_echeance = !empty($invoice_data['due_date']) ? strtotime($invoice_data['due_date']) : null; + $invoice->note_private = $langs->trans('ImportedFromZugferd') . ' - ' . $this->import->ref; + $invoice->multicurrency_code = $invoice_data['totals']['currency'] ?: 'EUR'; + + $this->db->begin(); + + $invoice_id = $invoice->create($user); + if ($invoice_id < 0) { + $this->error = $invoice->error; + $this->db->rollback(); + return -1; + } + + // Add lines + foreach ($this->result['lines'] as $line) { + $result = $this->addInvoiceLine($invoice, $line, $user); + if ($result < 0) { + $this->db->rollback(); + return -2; + } + } + + $this->db->commit(); + + // Validate totals - re-fetch invoice to get calculated totals + $invoice->fetch($invoice_id); + $validation_result = $this->validateTotals($invoice_data, $invoice); + $this->result['validation'] = $validation_result; + + // Attach PDF to supplier invoice + if (!empty($pdf_path) && file_exists($pdf_path)) { + $this->attachPdfToInvoice($invoice, $pdf_path); + } + + return $invoice_id; + } + + /** + * Attach PDF file to supplier invoice + * + * @param FactureFournisseur $invoice Invoice object + * @param string $pdf_path Source PDF path + * @return bool Success + */ + public function attachPdfToInvoice($invoice, $pdf_path) + { + global $conf; + + // Get supplier for folder name + $supplier = new Societe($this->db); + $supplier->fetch($invoice->socid); + + // Build destination directory path for supplier invoice + // Format: DOL_DATA_ROOT/fournisseur/facture/[thirdparty_name]/[invoice_ref]/ + $destdir = $conf->fournisseur->facture->dir_output; + $destdir .= '/' . dol_sanitizeFileName($supplier->nom); + $destdir .= '/' . dol_sanitizeFileName($invoice->ref); + + // Create directory if it doesn't exist + if (!is_dir($destdir)) { + dol_mkdir($destdir); + } + + // Build descriptive filename + // Format: YYYY-MM-DD - Lieferant - Rechnungsnummer - Material - Preis EUR.pdf + $newFilename = $this->buildInvoiceFilename($invoice, $supplier); + $destfile = $destdir . '/' . $newFilename; + + if (copy($pdf_path, $destfile)) { + dol_syslog("Attached PDF as " . $newFilename . " to supplier invoice " . $invoice->ref, LOG_INFO); + return true; + } + + return false; + } + + /** + * Build descriptive filename for invoice PDF + * Format: YYYY-MM-DD - Lieferant - Rechnungsnummer - Material - Preis EUR.pdf + * + * @param FactureFournisseur $invoice Invoice object + * @param Societe $supplier Supplier object + * @return string Filename + */ + private function buildInvoiceFilename($invoice, $supplier) + { + // Date: YYYY-MM-DD + $date = dol_print_date($invoice->date, '%Y-%m-%d'); + + // Supplier name (shortened if too long) + $supplierName = dol_sanitizeFileName($supplier->nom); + if (strlen($supplierName) > 30) { + $supplierName = substr($supplierName, 0, 30); + } + + // Invoice number from supplier + $invoiceNumber = dol_sanitizeFileName($invoice->ref_supplier); + if (empty($invoiceNumber)) { + $invoiceNumber = $invoice->ref; + } + + // Get material description from first line item or use generic term + $material = 'Material'; + if (!empty($this->result['lines'])) { + // Try to get a meaningful description from line items + $firstLine = reset($this->result['lines']); + if (!empty($firstLine['name'])) { + // Use first product name, shortened + $material = dol_sanitizeFileName($firstLine['name']); + if (strlen($material) > 25) { + $material = substr($material, 0, 25); + } + } + // If multiple lines, indicate it + if (count($this->result['lines']) > 1) { + $material .= ' ua'; // "und andere" / "and others" + } + } + + // Price rounded + $price = round($invoice->total_ttc); + + // Build filename + $filename = sprintf( + '%s - %s - %s - %s - %d EUR.pdf', + $date, + $supplierName, + $invoiceNumber, + $material, + $price + ); + + // Clean up any double spaces or invalid characters + $filename = preg_replace('/\s+/', ' ', $filename); + $filename = str_replace(['/', '\\', ':', '*', '?', '"', '<', '>', '|'], '-', $filename); + + return $filename; + } + + /** + * Validate that ZUGFeRD totals match Dolibarr calculated totals + * + * @param array $invoice_data Parsed ZUGFeRD invoice data + * @param FactureFournisseur $invoice Created Dolibarr invoice + * @return array Validation result with status and message + */ + public function validateTotals($invoice_data, $invoice) + { + global $langs; + $langs->load('importzugferd@importzugferd'); + + $result = array( + 'valid' => true, + 'zugferd_ht' => (float) $invoice_data['totals']['net'], + 'zugferd_ttc' => (float) $invoice_data['totals']['gross'], + 'dolibarr_ht' => (float) $invoice->total_ht, + 'dolibarr_ttc' => (float) $invoice->total_ttc, + 'diff_ht' => 0, + 'diff_ttc' => 0, + 'message' => '', + ); + + $result['diff_ht'] = abs($result['zugferd_ht'] - $result['dolibarr_ht']); + $result['diff_ttc'] = abs($result['zugferd_ttc'] - $result['dolibarr_ttc']); + + // Allow small deviations (max 0.05€ per total) + $tolerance = 0.05; + + if ($result['diff_ht'] > $tolerance || $result['diff_ttc'] > $tolerance) { + $result['valid'] = false; + $result['message'] = $langs->trans( + 'SumValidationError', + price($result['zugferd_ttc']), + price($result['dolibarr_ttc']), + price($result['diff_ttc']) + ); + + // Update import record with error + $this->import->status = ZugferdImport::STATUS_ERROR; + $this->import->error_message = $result['message']; + } else { + $result['message'] = $langs->trans('SumValidationOk'); + // Keep status as PROCESSED (already set) + } + + return $result; + } + + /** + * Add a line to supplier invoice + * + * @param FactureFournisseur $invoice Invoice object + * @param array $line Line data + * @param User $user Current user + * @return int >0 if OK, <0 if error + */ + private function addInvoiceLine($invoice, $line, $user) + { + $desc = $line['name']; + if (!empty($line['description']) && $line['description'] != $line['name']) { + $desc .= "\n" . $line['description']; + } + + // Add supplier reference to description if no product found + if ($line['fk_product'] == 0 && !empty($line['supplier_ref'])) { + $desc .= "\n[" . $line['supplier_ref'] . "]"; + } + + // Determine VAT rate + $tva_tx = $line['tax_percent'] ?: 19; + + // Add line + $result = $invoice->addline( + $desc, // description + $line['unit_price'], // pu_ht + $tva_tx, // tva_tx + 0, // localtax1_tx + 0, // localtax2_tx + $line['quantity'], // qty + $line['fk_product'] ?: 0, // fk_product + 0, // remise_percent + '', // date_start + '', // date_end + 0, // ventil + 0, // info_bits + 'HT', // price_base_type + 0, // type (0=product, 1=service) + -1, // rang + 0, // notrigger + array(), // array_options + '', // fk_unit + 0, // origin_id + 0, // pu_ht_devise + $line['supplier_ref'] ?: '' // ref_supplier + ); + + if ($result < 0) { + $this->error = $invoice->error; + return -1; + } + + // Update supplier price with EAN if product was matched and EAN is available + if ($line['fk_product'] > 0 && !empty($line['ean'])) { + $this->updateSupplierPriceBarcode($invoice->socid, $line['fk_product'], $line['ean'], $line['supplier_ref']); + } + + return 1; + } + + /** + * Update barcode in supplier price record + * + * @param int $supplier_id Supplier ID + * @param int $product_id Product ID + * @param string $barcode EAN/GTIN barcode + * @param string $ref_fourn Supplier reference (optional, to identify correct price record) + * @return int >0 if updated, 0 if no update needed, <0 if error + */ + public function updateSupplierPriceBarcode($supplier_id, $product_id, $barcode, $ref_fourn = '') + { + global $conf; + + // Check if barcode column exists in product_fournisseur_price table + if (!$this->checkSupplierPriceBarcodeColumn()) { + return 0; // Column doesn't exist, skip update + } + + // Find supplier price record + $sql = "SELECT rowid, barcode FROM " . MAIN_DB_PREFIX . "product_fournisseur_price"; + $sql .= " WHERE fk_soc = " . (int) $supplier_id; + $sql .= " AND fk_product = " . (int) $product_id; + $sql .= " AND entity IN (" . getEntity('product') . ")"; + if (!empty($ref_fourn)) { + $sql .= " AND ref_fourn = '" . $this->db->escape($ref_fourn) . "'"; + } + $sql .= " ORDER BY rowid DESC LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + + // Only update if barcode is empty or different + if (empty($obj->barcode) || $obj->barcode != $barcode) { + $sql_update = "UPDATE " . MAIN_DB_PREFIX . "product_fournisseur_price"; + $sql_update .= " SET barcode = '" . $this->db->escape($barcode) . "'"; + $sql_update .= " WHERE rowid = " . (int) $obj->rowid; + + $res = $this->db->query($sql_update); + if ($res) { + dol_syslog("Updated supplier price barcode for product " . $product_id . " supplier " . $supplier_id . " to " . $barcode, LOG_DEBUG); + return 1; + } else { + return -1; + } + } + return 0; // No update needed + } + + return 0; // No supplier price record found + } + + /** + * Check if barcode column exists in product_fournisseur_price table + * + * @return bool + */ + private function checkSupplierPriceBarcodeColumn() + { + static $has_barcode_column = null; + + if ($has_barcode_column === null) { + $sql = "SHOW COLUMNS FROM " . MAIN_DB_PREFIX . "product_fournisseur_price LIKE 'barcode'"; + $resql = $this->db->query($sql); + $has_barcode_column = ($resql && $this->db->num_rows($resql) > 0); + } + + return $has_barcode_column; + } + + /** + * Delete existing import record by file hash (for reimport) + * + * @param string $file_hash File hash + * @param User $user Current user + * @return int >0 if deleted, 0 if not found, <0 if error + */ + public function deleteExistingImport($file_hash, $user) + { + global $conf; + + // Find existing import by hash + $existingImport = new ZugferdImport($this->db); + $result = $existingImport->fetch(0, null, $file_hash); + + if ($result > 0) { + // Delete the existing import record + $deleteResult = $existingImport->delete($user); + if ($deleteResult > 0) { + dol_syslog("Deleted existing import record " . $existingImport->ref . " for reimport", LOG_INFO); + return 1; + } else { + $this->error = $existingImport->error; + return -1; + } + } + + return 0; // Not found + } + + /** + * Copy PDF to documents folder + * + * @param string $pdf_path Source PDF path + * @param int $import_id Import record ID + * @return bool + */ + public function copyToDocuments($pdf_path, $import_id) + { + global $conf; + + $destdir = $conf->importzugferd->dir_output . '/imports'; + if (!is_dir($destdir)) { + dol_mkdir($destdir); + } + + $destfile = $destdir . '/' . $this->import->ref . '_' . basename($pdf_path); + + return copy($pdf_path, $destfile); + } + + /** + * Get import result + * + * @return array + */ + public function getResult() + { + return $this->result; + } + + /** + * Get parsed invoice data + * + * @return array + */ + public function getInvoiceData() + { + return $this->parser->getInvoiceData(); + } +} diff --git a/class/cron_importzugferd.class.php b/class/cron_importzugferd.class.php new file mode 100644 index 0000000..5e3ae72 --- /dev/null +++ b/class/cron_importzugferd.class.php @@ -0,0 +1,299 @@ +db = $db; + } + + /** + * Fetch ZUGFeRD invoices from configured IMAP mailbox + * + * @return int 0 if OK, <0 if error + */ + public function fetchFromMailbox() + { + global $conf, $user, $langs; + + $langs->load('importzugferd@importzugferd'); + + // Get IMAP settings + $host = getDolGlobalString('IMPORTZUGFERD_IMAP_HOST'); + $port = getDolGlobalString('IMPORTZUGFERD_IMAP_PORT', '993'); + $imap_user = getDolGlobalString('IMPORTZUGFERD_IMAP_USER'); + $password = getDolGlobalString('IMPORTZUGFERD_IMAP_PASSWORD'); + $folder = getDolGlobalString('IMPORTZUGFERD_IMAP_FOLDER', 'INBOX'); + $ssl = getDolGlobalString('IMPORTZUGFERD_IMAP_SSL'); + $auto_create = getDolGlobalString('IMPORTZUGFERD_AUTO_CREATE_INVOICE'); + + // Validate settings + if (empty($host) || empty($imap_user) || empty($password)) { + $this->error = 'IMAP settings not configured'; + $this->output = $this->error; + return -1; + } + + // Build mailbox string + $mailbox = '{' . $host . ':' . $port . '/imap'; + if ($ssl) { + $mailbox .= '/ssl'; + } + $mailbox .= '/novalidate-cert}' . $folder; + + // Connect to IMAP + $connection = @imap_open($mailbox, $imap_user, $password); + + if (!$connection) { + $this->error = 'IMAP connection failed: ' . imap_last_error(); + $this->output = $this->error; + return -2; + } + + // Search for unread messages with attachments + $messages = imap_search($connection, 'UNSEEN'); + + if ($messages === false) { + $this->output = 'No new messages found'; + imap_close($connection); + return 0; + } + + $temp_dir = $conf->importzugferd->dir_output . '/temp'; + if (!is_dir($temp_dir)) { + dol_mkdir($temp_dir); + } + + // Load admin user for import actions + $admin_user = new User($this->db); + $admin_user->fetch(1); // Fetch admin user + + $actions = new ActionsImportZugferd($this->db); + + foreach ($messages as $msg_num) { + $structure = imap_fetchstructure($connection, $msg_num); + + // Check for attachments + $attachments = $this->getAttachments($connection, $msg_num, $structure); + + foreach ($attachments as $attachment) { + // Check if it's a PDF + if (strtolower($attachment['type']) !== 'pdf') { + continue; + } + + // Save attachment temporarily + $temp_file = $temp_dir . '/' . uniqid('zugferd_') . '.pdf'; + file_put_contents($temp_file, $attachment['data']); + + // Check if it's a ZUGFeRD PDF + $parser = new ZugferdParser($this->db); + $result = $parser->extractFromPdf($temp_file); + + if ($result > 0) { + // It's a ZUGFeRD invoice, try to import + $result = $actions->processPdf($temp_file, $admin_user, $auto_create); + + if ($result > 0) { + $this->imported_count++; + dol_syslog("CronImportZugferd: Imported invoice from email, ID: " . $result, LOG_INFO); + } elseif ($result == -3) { + // Duplicate + $this->skipped_count++; + dol_syslog("CronImportZugferd: Skipped duplicate invoice", LOG_INFO); + } else { + $this->error_count++; + $this->errors[] = $actions->error; + dol_syslog("CronImportZugferd: Error importing invoice: " . $actions->error, LOG_WARNING); + } + } + + // Clean up temp file + if (file_exists($temp_file)) { + unlink($temp_file); + } + } + + // Mark message as read + imap_setflag_full($connection, (string)$msg_num, '\\Seen'); + } + + imap_close($connection); + + // Build output message + $this->output = sprintf( + "Processed %d messages. Imported: %d, Skipped (duplicates): %d, Errors: %d", + count($messages), + $this->imported_count, + $this->skipped_count, + $this->error_count + ); + + if ($this->error_count > 0) { + $this->output .= "\nErrors: " . implode(", ", $this->errors); + } + + return 0; + } + + /** + * Extract attachments from email + * + * @param resource $connection IMAP connection + * @param int $msg_num Message number + * @param object $structure Message structure + * @param string $part_num Part number for nested parts + * @return array Attachments + */ + private function getAttachments($connection, $msg_num, $structure, $part_num = '') + { + $attachments = array(); + + // Check if it's a multipart message + if (isset($structure->parts) && count($structure->parts)) { + foreach ($structure->parts as $key => $part) { + $attachments = array_merge( + $attachments, + $this->getAttachments($connection, $msg_num, $part, ($part_num ? $part_num . '.' : '') . ($key + 1)) + ); + } + } else { + // Check if this part is an attachment + $attachment = $this->extractAttachment($connection, $msg_num, $structure, $part_num); + if ($attachment) { + $attachments[] = $attachment; + } + } + + return $attachments; + } + + /** + * Extract a single attachment + * + * @param resource $connection IMAP connection + * @param int $msg_num Message number + * @param object $part Part structure + * @param string $part_num Part number + * @return array|null Attachment data or null + */ + private function extractAttachment($connection, $msg_num, $part, $part_num) + { + $filename = ''; + + // Get filename from parameters + if (isset($part->dparameters)) { + foreach ($part->dparameters as $param) { + if (strtolower($param->attribute) === 'filename') { + $filename = $param->value; + break; + } + } + } + + if (empty($filename) && isset($part->parameters)) { + foreach ($part->parameters as $param) { + if (strtolower($param->attribute) === 'name') { + $filename = $param->value; + break; + } + } + } + + // Check if it's a PDF attachment + if (empty($filename) || !preg_match('/\.pdf$/i', $filename)) { + return null; + } + + // Get attachment data + if ($part_num) { + $data = imap_fetchbody($connection, $msg_num, $part_num); + } else { + $data = imap_body($connection, $msg_num); + } + + // Decode based on encoding + if (isset($part->encoding)) { + switch ($part->encoding) { + case 3: // BASE64 + $data = base64_decode($data); + break; + case 4: // QUOTED-PRINTABLE + $data = quoted_printable_decode($data); + break; + } + } + + // Get file extension + $ext = pathinfo($filename, PATHINFO_EXTENSION); + + return array( + 'filename' => $filename, + 'type' => strtolower($ext), + 'data' => $data + ); + } +} diff --git a/class/importline.class.php b/class/importline.class.php new file mode 100644 index 0000000..c507ac2 --- /dev/null +++ b/class/importline.class.php @@ -0,0 +1,377 @@ +db = $db; + } + + /** + * Create line in database + * + * @param User $user User creating the line + * @return int >0 if OK, <0 if KO + */ + public function create($user) + { + $this->date_creation = dol_now(); + + $sql = "INSERT INTO " . MAIN_DB_PREFIX . $this->table_element . " ("; + $sql .= "fk_import, line_id, supplier_ref, product_name, description,"; + $sql .= "quantity, unit_code, unit_price, unit_price_raw, basis_quantity, basis_quantity_unit,"; + $sql .= "line_total, tax_percent, ean, fk_product, match_method, date_creation"; + $sql .= ") VALUES ("; + $sql .= ((int) $this->fk_import) . ","; + $sql .= "'" . $this->db->escape($this->line_id) . "',"; + $sql .= "'" . $this->db->escape($this->supplier_ref) . "',"; + $sql .= "'" . $this->db->escape($this->product_name) . "',"; + $sql .= "'" . $this->db->escape($this->description) . "',"; + $sql .= ((float) $this->quantity) . ","; + $sql .= "'" . $this->db->escape($this->unit_code) . "',"; + $sql .= ((float) $this->unit_price) . ","; + $sql .= ((float) $this->unit_price_raw) . ","; + $sql .= ((float) $this->basis_quantity) . ","; + $sql .= "'" . $this->db->escape($this->basis_quantity_unit) . "',"; + $sql .= ((float) $this->line_total) . ","; + $sql .= ((float) $this->tax_percent) . ","; + $sql .= "'" . $this->db->escape($this->ean) . "',"; + $sql .= ($this->fk_product > 0 ? ((int) $this->fk_product) : "NULL") . ","; + $sql .= "'" . $this->db->escape($this->match_method) . "',"; + $sql .= "'" . $this->db->idate($this->date_creation) . "'"; + $sql .= ")"; + + $resql = $this->db->query($sql); + if ($resql) { + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element); + $this->rowid = $this->id; + return $this->id; + } else { + $this->error = $this->db->lasterror(); + return -1; + } + } + + /** + * Fetch line from database + * + * @param int $id Line ID + * @return int >0 if OK, <0 if KO + */ + public function fetch($id) + { + $sql = "SELECT rowid, fk_import, line_id, supplier_ref, product_name, description,"; + $sql .= " quantity, unit_code, unit_price, unit_price_raw, basis_quantity, basis_quantity_unit,"; + $sql .= " line_total, tax_percent, ean, fk_product, match_method, date_creation"; + $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE rowid = " . ((int) $id); + + $resql = $this->db->query($sql); + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); + $this->id = $obj->rowid; + $this->rowid = $obj->rowid; + $this->fk_import = $obj->fk_import; + $this->line_id = $obj->line_id; + $this->supplier_ref = $obj->supplier_ref; + $this->product_name = $obj->product_name; + $this->description = $obj->description; + $this->quantity = $obj->quantity; + $this->unit_code = $obj->unit_code; + $this->unit_price = $obj->unit_price; + $this->unit_price_raw = $obj->unit_price_raw; + $this->basis_quantity = $obj->basis_quantity; + $this->basis_quantity_unit = $obj->basis_quantity_unit; + $this->line_total = $obj->line_total; + $this->tax_percent = $obj->tax_percent; + $this->ean = $obj->ean; + $this->fk_product = $obj->fk_product; + $this->match_method = $obj->match_method; + $this->date_creation = $this->db->jdate($obj->date_creation); + return 1; + } + return 0; + } + $this->error = $this->db->lasterror(); + return -1; + } + + /** + * Update line in database + * + * @param User $user User making the update + * @return int >0 if OK, <0 if KO + */ + public function update($user) + { + $sql = "UPDATE " . MAIN_DB_PREFIX . $this->table_element . " SET"; + $sql .= " fk_product = " . ($this->fk_product > 0 ? ((int) $this->fk_product) : "NULL") . ","; + $sql .= " match_method = '" . $this->db->escape($this->match_method) . "'"; + $sql .= " WHERE rowid = " . ((int) $this->id); + + $resql = $this->db->query($sql); + if ($resql) { + return 1; + } + $this->error = $this->db->lasterror(); + return -1; + } + + /** + * Delete line from database + * + * @param User $user User deleting the line + * @return int >0 if OK, <0 if KO + */ + public function delete($user) + { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE rowid = " . ((int) $this->id); + + $resql = $this->db->query($sql); + if ($resql) { + return 1; + } + $this->error = $this->db->lasterror(); + return -1; + } + + /** + * Fetch all lines for an import + * + * @param int $fk_import Import ID + * @return array|int Array of ImportLine objects or <0 if error + */ + public function fetchAllByImport($fk_import) + { + $lines = array(); + + $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE fk_import = " . ((int) $fk_import); + $sql .= " ORDER BY rowid ASC"; + + $resql = $this->db->query($sql); + if ($resql) { + while ($obj = $this->db->fetch_object($resql)) { + $line = new ImportLine($this->db); + $line->fetch($obj->rowid); + $lines[] = $line; + } + return $lines; + } + $this->error = $this->db->lasterror(); + return -1; + } + + /** + * Delete all lines for an import + * + * @param int $fk_import Import ID + * @return int >0 if OK, <0 if KO + */ + public function deleteAllByImport($fk_import) + { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE fk_import = " . ((int) $fk_import); + + $resql = $this->db->query($sql); + if ($resql) { + return 1; + } + $this->error = $this->db->lasterror(); + return -1; + } + + /** + * Check if all lines for an import have products assigned + * + * @param int $fk_import Import ID + * @return bool True if all lines have products, false otherwise + */ + public function allLinesHaveProducts($fk_import) + { + $sql = "SELECT COUNT(*) as total, SUM(CASE WHEN fk_product IS NOT NULL AND fk_product > 0 THEN 1 ELSE 0 END) as with_product"; + $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE fk_import = " . ((int) $fk_import); + + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + return ($obj->total > 0 && $obj->total == $obj->with_product); + } + return false; + } + + /** + * Count lines without product assignment + * + * @param int $fk_import Import ID + * @return int Number of lines without product + */ + public function countLinesWithoutProduct($fk_import) + { + $sql = "SELECT COUNT(*) as cnt FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE fk_import = " . ((int) $fk_import); + $sql .= " AND (fk_product IS NULL OR fk_product = 0)"; + + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->cnt; + } + return 0; + } + + /** + * Set product for this line + * + * @param int $fk_product Product ID + * @param string $match_method How product was assigned + * @param User $user User making the change + * @return int >0 if OK, <0 if KO + */ + public function setProduct($fk_product, $match_method, $user) + { + $this->fk_product = $fk_product; + $this->match_method = $match_method; + return $this->update($user); + } +} diff --git a/class/productmapping.class.php b/class/productmapping.class.php new file mode 100644 index 0000000..9825b49 --- /dev/null +++ b/class/productmapping.class.php @@ -0,0 +1,478 @@ +db = $db; + } + + /** + * Create object into database + * + * @param User $user User that creates + * @return int <0 if KO, Id of created object if OK + */ + public function create($user) + { + global $conf; + + $this->entity = $conf->entity; + + if (empty($this->date_creation)) { + $this->date_creation = dol_now(); + } + + $this->fk_user_creat = $user->id; + + $sql = "INSERT INTO " . MAIN_DB_PREFIX . $this->table_element . " ("; + $sql .= "fk_soc, supplier_ref, fk_product, ean, manufacturer_ref,"; + $sql .= "description, priority, active, date_creation, fk_user_creat, entity"; + $sql .= ") VALUES ("; + $sql .= (int) $this->fk_soc . ","; + $sql .= "'" . $this->db->escape($this->supplier_ref) . "',"; + $sql .= (int) $this->fk_product . ","; + $sql .= "'" . $this->db->escape($this->ean) . "',"; + $sql .= "'" . $this->db->escape($this->manufacturer_ref) . "',"; + $sql .= "'" . $this->db->escape($this->description) . "',"; + $sql .= (int) $this->priority . ","; + $sql .= (int) $this->active . ","; + $sql .= "'" . $this->db->escape($this->db->idate($this->date_creation)) . "',"; + $sql .= (int) $this->fk_user_creat . ","; + $sql .= (int) $this->entity; + $sql .= ")"; + + dol_syslog(get_class($this) . "::create", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = $this->db->lasterror(); + return -1; + } + + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element); + return $this->id; + } + + /** + * Load object in memory from database + * + * @param int $id Id object + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id) + { + $sql = "SELECT rowid, fk_soc, supplier_ref, fk_product, ean, manufacturer_ref,"; + $sql .= " description, priority, active, date_creation, tms, fk_user_creat, fk_user_modif, entity"; + $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE rowid = " . (int) $id; + + dol_syslog(get_class($this) . "::fetch", LOG_DEBUG); + $resql = $this->db->query($sql); + + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + $this->fk_soc = $obj->fk_soc; + $this->supplier_ref = $obj->supplier_ref; + $this->fk_product = $obj->fk_product; + $this->ean = $obj->ean; + $this->manufacturer_ref = $obj->manufacturer_ref; + $this->description = $obj->description; + $this->priority = $obj->priority; + $this->active = $obj->active; + $this->date_creation = $this->db->jdate($obj->date_creation); + $this->tms = $this->db->jdate($obj->tms); + $this->fk_user_creat = $obj->fk_user_creat; + $this->fk_user_modif = $obj->fk_user_modif; + $this->entity = $obj->entity; + + $this->db->free($resql); + return 1; + } else { + $this->db->free($resql); + return 0; + } + } else { + $this->error = $this->db->lasterror(); + return -1; + } + } + + /** + * Update object in database + * + * @param User $user User that modifies + * @return int <0 if KO, >0 if OK + */ + public function update($user) + { + $this->fk_user_modif = $user->id; + + $sql = "UPDATE " . MAIN_DB_PREFIX . $this->table_element . " SET"; + $sql .= " fk_soc = " . (int) $this->fk_soc . ","; + $sql .= " supplier_ref = '" . $this->db->escape($this->supplier_ref) . "',"; + $sql .= " fk_product = " . (int) $this->fk_product . ","; + $sql .= " ean = '" . $this->db->escape($this->ean) . "',"; + $sql .= " manufacturer_ref = '" . $this->db->escape($this->manufacturer_ref) . "',"; + $sql .= " description = '" . $this->db->escape($this->description) . "',"; + $sql .= " priority = " . (int) $this->priority . ","; + $sql .= " active = " . (int) $this->active . ","; + $sql .= " fk_user_modif = " . (int) $this->fk_user_modif; + $sql .= " WHERE rowid = " . (int) $this->id; + + dol_syslog(get_class($this) . "::update", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = $this->db->lasterror(); + return -1; + } + + return 1; + } + + /** + * Delete object from database + * + * @param User $user User that deletes + * @return int <0 if KO, >0 if OK + */ + public function delete($user) + { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE rowid = " . (int) $this->id; + + dol_syslog(get_class($this) . "::delete", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = $this->db->lasterror(); + return -1; + } + + return 1; + } + + /** + * Find product by supplier reference + * + * @param int $fk_soc Supplier ID + * @param string $supplier_ref Supplier article number + * @return int Product ID or 0 if not found + */ + public function findProductBySupplierRef($fk_soc, $supplier_ref) + { + global $conf; + + // First check our mapping table + $sql = "SELECT fk_product FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE fk_soc = " . (int) $fk_soc; + $sql .= " AND supplier_ref = '" . $this->db->escape($supplier_ref) . "'"; + $sql .= " AND active = 1"; + $sql .= " AND entity = " . (int) $conf->entity; + $sql .= " ORDER BY priority DESC"; + $sql .= " LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->fk_product; + } + + return 0; + } + + /** + * Find product by EAN + * + * @param string $ean EAN/GTIN + * @return int Product ID or 0 if not found + */ + public function findProductByEan($ean) + { + global $conf; + + if (empty($ean)) { + return 0; + } + + // First check our mapping table + $sql = "SELECT fk_product FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE ean = '" . $this->db->escape($ean) . "'"; + $sql .= " AND active = 1"; + $sql .= " AND entity = " . (int) $conf->entity; + $sql .= " LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->fk_product; + } + + // Check product barcode + $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "product"; + $sql .= " WHERE barcode = '" . $this->db->escape($ean) . "'"; + $sql .= " AND entity IN (" . getEntity('product') . ")"; + $sql .= " LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->rowid; + } + + return 0; + } + + /** + * Find product by supplier price reference + * + * @param int $fk_soc Supplier ID + * @param string $ref_fourn Supplier reference + * @return int Product ID or 0 if not found + */ + public function findProductBySupplierPrice($fk_soc, $ref_fourn) + { + global $conf; + + $sql = "SELECT fk_product FROM " . MAIN_DB_PREFIX . "product_fournisseur_price"; + $sql .= " WHERE fk_soc = " . (int) $fk_soc; + $sql .= " AND ref_fourn = '" . $this->db->escape($ref_fourn) . "'"; + $sql .= " AND entity = " . (int) $conf->entity; + $sql .= " LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->fk_product; + } + + return 0; + } + + /** + * Find product using all available methods + * + * @param int $fk_soc Supplier ID + * @param array $product_data Product data from ZUGFeRD (seller_id, buyer_id, global_id, name) + * @return array Array with 'fk_product' and 'method' used + */ + public function findProduct($fk_soc, $product_data) + { + $result = array('fk_product' => 0, 'method' => ''); + + // 1. Check our mapping table with supplier reference + if (!empty($product_data['seller_id'])) { + $fk_product = $this->findProductBySupplierRef($fk_soc, $product_data['seller_id']); + if ($fk_product > 0) { + return array('fk_product' => $fk_product, 'method' => 'mapping_supplier_ref'); + } + } + + // 2. Check supplier price table + if (!empty($product_data['seller_id'])) { + $fk_product = $this->findProductBySupplierPrice($fk_soc, $product_data['seller_id']); + if ($fk_product > 0) { + return array('fk_product' => $fk_product, 'method' => 'supplier_price'); + } + } + + // 3. Check by EAN/GTIN + if (!empty($product_data['global_id'])) { + $fk_product = $this->findProductByEan($product_data['global_id']); + if ($fk_product > 0) { + return array('fk_product' => $fk_product, 'method' => 'ean'); + } + } + + // 4. Check buyer assigned ID (our article number) + if (!empty($product_data['buyer_id'])) { + global $conf; + $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . "product"; + $sql .= " WHERE ref = '" . $this->db->escape($product_data['buyer_id']) . "'"; + $sql .= " AND entity IN (" . getEntity('product') . ")"; + $sql .= " LIMIT 1"; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + $obj = $this->db->fetch_object($resql); + return array('fk_product' => (int) $obj->rowid, 'method' => 'buyer_ref'); + } + } + + return $result; + } + + /** + * Get all mappings for a supplier + * + * @param int $fk_soc Supplier ID + * @param int $limit Limit results + * @param int $offset Offset + * @return array Array of mappings + */ + public function fetchAllBySupplier($fk_soc, $limit = 0, $offset = 0) + { + global $conf; + + $mappings = array(); + + $sql = "SELECT pm.rowid, pm.fk_soc, pm.supplier_ref, pm.fk_product, pm.ean,"; + $sql .= " pm.manufacturer_ref, pm.description, pm.priority, pm.active,"; + $sql .= " p.ref as product_ref, p.label as product_label"; + $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element . " as pm"; + $sql .= " LEFT JOIN " . MAIN_DB_PREFIX . "product as p ON p.rowid = pm.fk_product"; + $sql .= " WHERE pm.fk_soc = " . (int) $fk_soc; + $sql .= " AND pm.entity = " . (int) $conf->entity; + $sql .= " ORDER BY pm.supplier_ref ASC"; + + if ($limit > 0) { + $sql .= " LIMIT " . $limit; + if ($offset > 0) { + $sql .= " OFFSET " . $offset; + } + } + + $resql = $this->db->query($sql); + if ($resql) { + while ($obj = $this->db->fetch_object($resql)) { + $mappings[] = array( + 'id' => $obj->rowid, + 'fk_soc' => $obj->fk_soc, + 'supplier_ref' => $obj->supplier_ref, + 'fk_product' => $obj->fk_product, + 'product_ref' => $obj->product_ref, + 'product_label' => $obj->product_label, + 'ean' => $obj->ean, + 'manufacturer_ref' => $obj->manufacturer_ref, + 'description' => $obj->description, + 'priority' => $obj->priority, + 'active' => $obj->active, + ); + } + $this->db->free($resql); + } + + return $mappings; + } + + /** + * Count mappings for a supplier + * + * @param int $fk_soc Supplier ID + * @return int Count + */ + public function countBySupplier($fk_soc) + { + global $conf; + + $sql = "SELECT COUNT(*) as nb FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE fk_soc = " . (int) $fk_soc; + $sql .= " AND entity = " . (int) $conf->entity; + + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + return (int) $obj->nb; + } + + return 0; + } +} diff --git a/class/zugferdimport.class.php b/class/zugferdimport.class.php new file mode 100644 index 0000000..cd83fd3 --- /dev/null +++ b/class/zugferdimport.class.php @@ -0,0 +1,553 @@ + array('type' => 'integer', 'label' => 'TechnicalID', 'enabled' => 1, 'position' => 1, 'notnull' => 1, 'visible' => 0, 'index' => 1), + 'ref' => array('type' => 'varchar(128)', 'label' => 'Ref', 'enabled' => 1, 'position' => 10, 'notnull' => 1, 'visible' => 4, 'index' => 1, 'searchall' => 1), + 'invoice_number' => array('type' => 'varchar(128)', 'label' => 'InvoiceNumber', 'enabled' => 1, 'position' => 20, 'notnull' => 1, 'visible' => 1, 'searchall' => 1), + 'invoice_date' => array('type' => 'date', 'label' => 'InvoiceDate', 'enabled' => 1, 'position' => 30, 'notnull' => 1, 'visible' => 1), + 'seller_name' => array('type' => 'varchar(255)', 'label' => 'SellerName', 'enabled' => 1, 'position' => 40, 'notnull' => 0, 'visible' => 1, 'searchall' => 1), + 'seller_vat' => array('type' => 'varchar(50)', 'label' => 'SellerVAT', 'enabled' => 1, 'position' => 50, 'notnull' => 0, 'visible' => 1), + 'buyer_reference' => array('type' => 'varchar(128)', 'label' => 'BuyerReference', 'enabled' => 1, 'position' => 60, 'notnull' => 0, 'visible' => 1), + 'total_ht' => array('type' => 'price', 'label' => 'TotalHT', 'enabled' => 1, 'position' => 70, 'notnull' => 0, 'visible' => 1), + 'total_ttc' => array('type' => 'price', 'label' => 'TotalTTC', 'enabled' => 1, 'position' => 80, 'notnull' => 0, 'visible' => 1), + 'currency' => array('type' => 'varchar(3)', 'label' => 'Currency', 'enabled' => 1, 'position' => 90, 'notnull' => 0, 'visible' => 1, 'default' => 'EUR'), + 'fk_soc' => array('type' => 'integer:Societe:societe/class/societe.class.php', 'label' => 'Supplier', 'enabled' => 1, 'position' => 100, 'notnull' => 0, 'visible' => 1), + 'fk_facture_fourn' => array('type' => 'integer:FactureFournisseur:fourn/class/fournisseur.facture.class.php', 'label' => 'SupplierInvoice', 'enabled' => 1, 'position' => 110, 'notnull' => 0, 'visible' => 1), + 'status' => array('type' => 'integer', 'label' => 'Status', 'enabled' => 1, 'position' => 500, 'notnull' => 1, 'visible' => 2, 'default' => 0, 'index' => 1, 'arrayofkeyval' => array(0 => 'Imported', 1 => 'Processed', 2 => 'Error')), + 'error_message' => array('type' => 'text', 'label' => 'ErrorMessage', 'enabled' => 1, 'position' => 510, 'notnull' => 0, 'visible' => 0), + 'file_hash' => array('type' => 'varchar(64)', 'label' => 'FileHash', 'enabled' => 1, 'position' => 520, 'notnull' => 0, 'visible' => 0), + 'pdf_filename' => array('type' => 'varchar(255)', 'label' => 'PDFFilename', 'enabled' => 1, 'position' => 530, 'notnull' => 0, 'visible' => 1), + 'date_creation' => array('type' => 'datetime', 'label' => 'DateCreation', 'enabled' => 1, 'position' => 600, 'notnull' => 1, 'visible' => 2), + 'date_import' => array('type' => 'datetime', 'label' => 'DateImport', 'enabled' => 1, 'position' => 610, 'notnull' => 0, 'visible' => 2), + 'tms' => array('type' => 'timestamp', 'label' => 'DateModification', 'enabled' => 1, 'position' => 620, 'notnull' => 0, 'visible' => 0), + 'fk_user_creat' => array('type' => 'integer:User:user/class/user.class.php', 'label' => 'UserCreator', 'enabled' => 1, 'position' => 700, 'notnull' => 0, 'visible' => 0), + 'fk_user_modif' => array('type' => 'integer:User:User/class/user.class.php', 'label' => 'UserModifier', 'enabled' => 1, 'position' => 710, 'notnull' => 0, 'visible' => 0), + 'import_key' => array('type' => 'varchar(14)', 'label' => 'ImportKey', 'enabled' => 1, 'position' => 800, 'notnull' => 0, 'visible' => 0), + 'entity' => array('type' => 'integer', 'label' => 'Entity', 'enabled' => 1, 'position' => 900, 'notnull' => 1, 'visible' => 0, 'default' => 1, 'index' => 1), + ); + + /** + * @var string Ref + */ + public $ref; + + /** + * @var string Invoice number from ZUGFeRD + */ + public $invoice_number; + + /** + * @var string Invoice date + */ + public $invoice_date; + + /** + * @var string Seller name + */ + public $seller_name; + + /** + * @var string Seller VAT ID + */ + public $seller_vat; + + /** + * @var string Buyer reference (our customer number at supplier) + */ + public $buyer_reference; + + /** + * @var float Net total + */ + public $total_ht; + + /** + * @var float Gross total + */ + public $total_ttc; + + /** + * @var string Currency + */ + public $currency = 'EUR'; + + /** + * @var int Supplier ID + */ + public $fk_soc; + + /** + * @var int Created supplier invoice ID + */ + public $fk_facture_fourn; + + /** + * @var string XML content + */ + public $xml_content; + + /** + * @var string PDF filename + */ + public $pdf_filename; + + /** + * @var string File hash for duplicate detection + */ + public $file_hash; + + /** + * @var int Status: 0=imported, 1=processed, 2=error + */ + public $status = 0; + + /** + * @var string Error message + */ + public $error_message; + + /** + * @var string Date creation + */ + public $date_creation; + + /** + * @var string Date import + */ + public $date_import; + + /** + * @var int User creator + */ + public $fk_user_creat; + + /** + * @var int User modifier + */ + public $fk_user_modif; + + /** + * @var string Import key + */ + public $import_key; + + /** + * @var array Parsed line items + */ + public $lines = array(); + + /** + * Status constants + */ + const STATUS_IMPORTED = 0; + const STATUS_PROCESSED = 1; + const STATUS_ERROR = 2; + const STATUS_PENDING = 3; // Pending manual product assignment + + /** + * Constructor + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + global $conf, $langs; + + $this->db = $db; + + if (empty($conf->global->MAIN_SHOW_TECHNICAL_ID) && isset($this->fields['rowid'])) { + $this->fields['rowid']['visible'] = 0; + } + } + + /** + * Create object into database + * + * @param User $user User that creates + * @param bool $notrigger false=launch triggers, true=disable triggers + * @return int <0 if KO, Id of created object if OK + */ + public function create($user, $notrigger = false) + { + global $conf; + + $this->entity = $conf->entity; + + if (empty($this->ref)) { + $this->ref = $this->getNextRef(); + } + + if (empty($this->date_creation)) { + $this->date_creation = dol_now(); + } + + $this->fk_user_creat = $user->id; + + $sql = "INSERT INTO " . MAIN_DB_PREFIX . $this->table_element . " ("; + $sql .= "ref, invoice_number, invoice_date, seller_name, seller_vat, buyer_reference,"; + $sql .= "total_ht, total_ttc, currency, fk_soc, fk_facture_fourn,"; + $sql .= "xml_content, pdf_filename, file_hash, status, error_message,"; + $sql .= "date_creation, date_import, fk_user_creat, import_key, entity"; + $sql .= ") VALUES ("; + $sql .= "'" . $this->db->escape($this->ref) . "',"; + $sql .= "'" . $this->db->escape($this->invoice_number) . "',"; + $sql .= "'" . $this->db->escape($this->invoice_date) . "',"; + $sql .= "'" . $this->db->escape($this->seller_name) . "',"; + $sql .= "'" . $this->db->escape($this->seller_vat) . "',"; + $sql .= "'" . $this->db->escape($this->buyer_reference) . "',"; + $sql .= price2num($this->total_ht) . ","; + $sql .= price2num($this->total_ttc) . ","; + $sql .= "'" . $this->db->escape($this->currency) . "',"; + $sql .= ($this->fk_soc > 0 ? $this->fk_soc : "null") . ","; + $sql .= ($this->fk_facture_fourn > 0 ? $this->fk_facture_fourn : "null") . ","; + // Normalize XML before storing (compact format without whitespace) + $normalizedXml = self::normalizeXml($this->xml_content); + $sql .= "'" . $this->db->escape($normalizedXml) . "',"; + $sql .= "'" . $this->db->escape($this->pdf_filename) . "',"; + $sql .= "'" . $this->db->escape($this->file_hash) . "',"; + $sql .= (int) $this->status . ","; + $sql .= "'" . $this->db->escape($this->error_message) . "',"; + $sql .= "'" . $this->db->escape($this->db->idate($this->date_creation)) . "',"; + $sql .= ($this->date_import ? "'" . $this->db->escape($this->db->idate($this->date_import)) . "'" : "null") . ","; + $sql .= (int) $this->fk_user_creat . ","; + $sql .= "'" . $this->db->escape($this->import_key) . "',"; + $sql .= (int) $this->entity; + $sql .= ")"; + + $this->db->begin(); + + dol_syslog(get_class($this) . "::create", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = $this->db->lasterror(); + $this->db->rollback(); + return -1; + } + + $this->id = $this->db->last_insert_id(MAIN_DB_PREFIX . $this->table_element); + + $this->db->commit(); + return $this->id; + } + + /** + * Load object in memory from database + * + * @param int $id Id object + * @param string $ref Ref + * @param string $file_hash File hash + * @return int <0 if KO, 0 if not found, >0 if OK + */ + public function fetch($id, $ref = null, $file_hash = null) + { + global $conf; + + $sql = "SELECT rowid, ref, invoice_number, invoice_date, seller_name, seller_vat, buyer_reference,"; + $sql .= " total_ht, total_ttc, currency, fk_soc, fk_facture_fourn,"; + $sql .= " xml_content, pdf_filename, file_hash, status, error_message,"; + $sql .= " date_creation, date_import, tms, fk_user_creat, fk_user_modif, import_key, entity"; + $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE entity IN (" . getEntity($this->table_element) . ")"; + + if ($id) { + $sql .= " AND rowid = " . (int) $id; + } elseif ($ref) { + $sql .= " AND ref = '" . $this->db->escape($ref) . "'"; + } elseif ($file_hash) { + $sql .= " AND file_hash = '" . $this->db->escape($file_hash) . "'"; + } else { + return -1; + } + + dol_syslog(get_class($this) . "::fetch", LOG_DEBUG); + $resql = $this->db->query($sql); + + if ($resql) { + if ($this->db->num_rows($resql)) { + $obj = $this->db->fetch_object($resql); + + $this->id = $obj->rowid; + $this->ref = $obj->ref; + $this->invoice_number = $obj->invoice_number; + $this->invoice_date = $this->db->jdate($obj->invoice_date); + $this->seller_name = $obj->seller_name; + $this->seller_vat = $obj->seller_vat; + $this->buyer_reference = $obj->buyer_reference; + $this->total_ht = $obj->total_ht; + $this->total_ttc = $obj->total_ttc; + $this->currency = $obj->currency; + $this->fk_soc = $obj->fk_soc; + $this->fk_facture_fourn = $obj->fk_facture_fourn; + $this->xml_content = $obj->xml_content; + $this->pdf_filename = $obj->pdf_filename; + $this->file_hash = $obj->file_hash; + $this->status = $obj->status; + $this->error_message = $obj->error_message; + $this->date_creation = $this->db->jdate($obj->date_creation); + $this->date_import = $this->db->jdate($obj->date_import); + $this->tms = $this->db->jdate($obj->tms); + $this->fk_user_creat = $obj->fk_user_creat; + $this->fk_user_modif = $obj->fk_user_modif; + $this->import_key = $obj->import_key; + $this->entity = $obj->entity; + + $this->db->free($resql); + return 1; + } else { + $this->db->free($resql); + return 0; + } + } else { + $this->error = $this->db->lasterror(); + return -1; + } + } + + /** + * Update object in database + * + * @param User $user User that modifies + * @param bool $notrigger false=launch triggers, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function update($user, $notrigger = false) + { + $this->fk_user_modif = $user->id; + + $sql = "UPDATE " . MAIN_DB_PREFIX . $this->table_element . " SET"; + $sql .= " ref = '" . $this->db->escape($this->ref) . "',"; + $sql .= " invoice_number = '" . $this->db->escape($this->invoice_number) . "',"; + $sql .= " invoice_date = '" . $this->db->escape($this->invoice_date) . "',"; + $sql .= " seller_name = '" . $this->db->escape($this->seller_name) . "',"; + $sql .= " seller_vat = '" . $this->db->escape($this->seller_vat) . "',"; + $sql .= " buyer_reference = '" . $this->db->escape($this->buyer_reference) . "',"; + $sql .= " total_ht = " . price2num($this->total_ht) . ","; + $sql .= " total_ttc = " . price2num($this->total_ttc) . ","; + $sql .= " currency = '" . $this->db->escape($this->currency) . "',"; + $sql .= " fk_soc = " . ($this->fk_soc > 0 ? $this->fk_soc : "null") . ","; + $sql .= " fk_facture_fourn = " . ($this->fk_facture_fourn > 0 ? $this->fk_facture_fourn : "null") . ","; + $sql .= " status = " . (int) $this->status . ","; + $sql .= " error_message = '" . $this->db->escape($this->error_message) . "',"; + $sql .= " fk_user_modif = " . (int) $this->fk_user_modif; + $sql .= " WHERE rowid = " . (int) $this->id; + + dol_syslog(get_class($this) . "::update", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = $this->db->lasterror(); + return -1; + } + + return 1; + } + + /** + * Delete object from database + * + * @param User $user User that deletes + * @param bool $notrigger false=launch triggers, true=disable triggers + * @return int <0 if KO, >0 if OK + */ + public function delete($user, $notrigger = false) + { + $sql = "DELETE FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE rowid = " . (int) $this->id; + + dol_syslog(get_class($this) . "::delete", LOG_DEBUG); + $resql = $this->db->query($sql); + + if (!$resql) { + $this->error = $this->db->lasterror(); + return -1; + } + + return 1; + } + + /** + * Check if file already imported (duplicate detection) + * + * @param string $file_hash SHA256 hash of file + * @return bool true if already exists + */ + public function isDuplicate($file_hash) + { + global $conf; + + $sql = "SELECT rowid FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE file_hash = '" . $this->db->escape($file_hash) . "'"; + $sql .= " AND entity = " . (int) $conf->entity; + + $resql = $this->db->query($sql); + if ($resql && $this->db->num_rows($resql) > 0) { + return true; + } + + return false; + } + + /** + * Get next reference number + * + * @return string + */ + public function getNextRef() + { + global $conf; + + $sql = "SELECT MAX(CAST(SUBSTRING(ref, 4) AS UNSIGNED)) as maxref"; + $sql .= " FROM " . MAIN_DB_PREFIX . $this->table_element; + $sql .= " WHERE ref LIKE 'ZI-%'"; + $sql .= " AND entity = " . (int) $conf->entity; + + $resql = $this->db->query($sql); + if ($resql) { + $obj = $this->db->fetch_object($resql); + $num = $obj->maxref ? $obj->maxref + 1 : 1; + return 'ZI-' . str_pad($num, 6, '0', STR_PAD_LEFT); + } + + return 'ZI-000001'; + } + + /** + * Normalize XML for database storage + * Removes whitespace between tags to store compact XML + * + * @param string $xml XML content + * @return string Normalized XML + */ + public static function normalizeXml($xml) + { + if (empty($xml)) { + return ''; + } + + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->preserveWhiteSpace = false; + $dom->formatOutput = false; + + // Try to load XML + if (@$dom->loadXML($xml)) { + // Return compact XML without declaration + $result = $dom->saveXML($dom->documentElement); + return $result ? $result : $xml; + } + + // Fallback: just remove whitespace between tags + return preg_replace('/>\s+<', trim($xml)); + } + + /** + * Format XML for display + * Takes compact XML and formats it with proper indentation + * + * @param string $xml Compact XML content + * @return string Formatted XML + */ + public static function formatXmlForDisplay($xml) + { + if (empty($xml)) { + return ''; + } + + // Clean up any escaped newlines from old data (literal \n strings) + $xml = str_replace('\n', '', $xml); + $xml = str_replace('\r', '', $xml); + $xml = str_replace('\t', '', $xml); + + $dom = new DOMDocument('1.0', 'UTF-8'); + $dom->preserveWhiteSpace = false; + $dom->formatOutput = true; + + if (@$dom->loadXML($xml)) { + return $dom->saveXML(); + } + + // Fallback: return as-is + return $xml; + } + + /** + * Get status label + * + * @param int $mode 0=short, 1=long + * @return string + */ + public function getLibStatut($mode = 0) + { + return $this->LibStatut($this->status, $mode); + } + + /** + * Return status label for a given status + * + * @param int $status Status + * @param int $mode 0=short, 1=long + * @return string + */ + public function LibStatut($status, $mode = 0) + { + global $langs; + + $langs->load('importzugferd@importzugferd'); + + $statusLabels = array( + self::STATUS_IMPORTED => array('short' => 'Imported', 'long' => 'StatusImported', 'class' => 'status4'), + self::STATUS_PROCESSED => array('short' => 'Processed', 'long' => 'StatusProcessed', 'class' => 'status6'), + self::STATUS_ERROR => array('short' => 'Error', 'long' => 'StatusError', 'class' => 'status8'), + self::STATUS_PENDING => array('short' => 'Pending', 'long' => 'StatusPending', 'class' => 'status1'), + ); + + $statusType = isset($statusLabels[$status]) ? $statusLabels[$status] : $statusLabels[0]; + $label = $mode == 0 ? $statusType['short'] : $statusType['long']; + + return dolGetStatus($langs->trans($label), '', '', $statusType['class']); + } +} diff --git a/class/zugferdparser.class.php b/class/zugferdparser.class.php new file mode 100644 index 0000000..0ab41d7 --- /dev/null +++ b/class/zugferdparser.class.php @@ -0,0 +1,560 @@ +db = $db; + } + + /** + * Extract XML from PDF file + * + * @param string $pdf_path Path to PDF file + * @return int 1 if OK, -1 if error + */ + public function extractFromPdf($pdf_path) + { + if (!file_exists($pdf_path)) { + $this->error = 'File not found: ' . $pdf_path; + return -1; + } + + // Read PDF content + $pdf_content = file_get_contents($pdf_path); + if ($pdf_content === false) { + $this->error = 'Cannot read PDF file'; + return -1; + } + + // Try to find embedded XML using different methods + $xml = $this->extractXmlFromPdfContent($pdf_content); + + if (empty($xml)) { + // Try using pdfdetach command + $xml = $this->extractXmlUsingPdfdetach($pdf_path); + } + + if (empty($xml)) { + $this->error = 'No ZUGFeRD/Factur-X XML found in PDF'; + return -1; + } + + $this->xml_content = $xml; + return 1; + } + + /** + * Extract XML from PDF content by searching for XML patterns + * + * @param string $content PDF binary content + * @return string|null XML content or null + */ + private function extractXmlFromPdfContent($content) + { + // Look for embedded file streams + // ZUGFeRD XML typically starts with /i', $xml, $endMatch, PREG_OFFSET_CAPTURE)) { + $xml = substr($xml, 0, $endMatch[0][1] + strlen($endMatch[0][0])); + return $xml; + } + } + } + + return null; + } + + /** + * Extract XML using pdfdetach command line tool + * + * @param string $pdf_path Path to PDF + * @return string|null XML content or null + */ + private function extractXmlUsingPdfdetach($pdf_path) + { + $tmp_file = sys_get_temp_dir() . '/zugferd_' . uniqid() . '.xml'; + + // Try to extract first attachment + $cmd = 'pdfdetach -save 1 -o ' . escapeshellarg($tmp_file) . ' ' . escapeshellarg($pdf_path) . ' 2>&1'; + exec($cmd, $output, $return_code); + + if ($return_code === 0 && file_exists($tmp_file)) { + $xml = file_get_contents($tmp_file); + unlink($tmp_file); + + if (strpos($xml, 'CrossIndustryDocument') !== false || + strpos($xml, 'CrossIndustryInvoice') !== false) { + return $xml; + } + } + + // Try listing and extracting by name + $cmd = 'pdfdetach -list ' . escapeshellarg($pdf_path) . ' 2>&1'; + exec($cmd, $list_output, $return_code); + + foreach ($list_output as $line) { + if (preg_match('/(ZUGFeRD|factur-x|xrechnung)/i', $line)) { + if (preg_match('/(\d+):/', $line, $matches)) { + $idx = $matches[1]; + $cmd = 'pdfdetach -save ' . $idx . ' -o ' . escapeshellarg($tmp_file) . ' ' . escapeshellarg($pdf_path) . ' 2>&1'; + exec($cmd, $output, $return_code); + + if ($return_code === 0 && file_exists($tmp_file)) { + $xml = file_get_contents($tmp_file); + unlink($tmp_file); + return $xml; + } + } + } + } + + return null; + } + + /** + * Parse the XML content + * + * @param string $xml_content Optional XML content, uses $this->xml_content if not provided + * @return int 1 if OK, -1 if error + */ + public function parse($xml_content = null) + { + if ($xml_content !== null) { + $this->xml_content = $xml_content; + } + + if (empty($this->xml_content)) { + $this->error = 'No XML content to parse'; + return -1; + } + + libxml_use_internal_errors(true); + $this->xml = simplexml_load_string($this->xml_content); + + if ($this->xml === false) { + $errors = libxml_get_errors(); + $this->error = 'XML parse error: ' . ($errors[0]->message ?? 'Unknown error'); + libxml_clear_errors(); + return -1; + } + + // Get namespaces + $this->namespaces = $this->xml->getNamespaces(true); + + // Determine ZUGFeRD version and parse accordingly + if ($this->isZugferdV1()) { + return $this->parseZugferdV1(); + } elseif ($this->isZugferdV2()) { + return $this->parseZugferdV2(); + } else { + $this->error = 'Unknown ZUGFeRD/Factur-X format'; + return -1; + } + } + + /** + * Check if ZUGFeRD v1 format + * + * @return bool + */ + private function isZugferdV1() + { + return strpos($this->xml_content, 'CrossIndustryDocument') !== false; + } + + /** + * Check if ZUGFeRD v2 / Factur-X format + * + * @return bool + */ + private function isZugferdV2() + { + return strpos($this->xml_content, 'CrossIndustryInvoice') !== false; + } + + /** + * Parse ZUGFeRD v1 format + * + * @return int 1 if OK, -1 if error + */ + private function parseZugferdV1() + { + $this->xml->registerXPathNamespace('rsm', 'urn:ferd:CrossIndustryDocument:invoice:1p0'); + $this->xml->registerXPathNamespace('ram', 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12'); + $this->xml->registerXPathNamespace('udt', 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:15'); + + $data = array(); + + // Header information + $header = $this->xml->xpath('//rsm:HeaderExchangedDocument'); + if (!empty($header)) { + $data['invoice_number'] = $this->getXpathValue('//rsm:HeaderExchangedDocument/ram:ID'); + $data['invoice_type'] = $this->getXpathValue('//rsm:HeaderExchangedDocument/ram:TypeCode'); + $data['invoice_name'] = $this->getXpathValue('//rsm:HeaderExchangedDocument/ram:Name'); + + $dateStr = $this->getXpathValue('//rsm:HeaderExchangedDocument/ram:IssueDateTime/udt:DateTimeString'); + $data['invoice_date'] = $this->parseDate($dateStr); + } + + // Seller (Lieferant) + $data['seller'] = array( + 'name' => $this->getXpathValue('//ram:SellerTradeParty/ram:Name'), + 'global_id' => $this->getXpathValue('//ram:SellerTradeParty/ram:GlobalID'), + 'vat_id' => $this->getXpathValue('//ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID[@schemeID="VA"]'), + 'address' => array( + 'street' => $this->getXpathValue('//ram:SellerTradeParty/ram:PostalTradeAddress/ram:LineOne'), + 'postcode' => $this->getXpathValue('//ram:SellerTradeParty/ram:PostalTradeAddress/ram:PostcodeCode'), + 'city' => $this->getXpathValue('//ram:SellerTradeParty/ram:PostalTradeAddress/ram:CityName'), + 'country' => $this->getXpathValue('//ram:SellerTradeParty/ram:PostalTradeAddress/ram:CountryID'), + ) + ); + + // Buyer (Käufer - wir) + $data['buyer'] = array( + 'id' => $this->getXpathValue('//ram:BuyerTradeParty/ram:ID'), + 'reference' => $this->getXpathValue('//ram:ApplicableSupplyChainTradeAgreement/ram:BuyerReference'), + 'name' => $this->getXpathValue('//ram:BuyerTradeParty/ram:Name'), + ); + + // Totals + $data['totals'] = array( + 'net' => (float) $this->getXpathValue('//ram:SpecifiedTradeSettlementMonetarySummation/ram:LineTotalAmount'), + 'tax' => (float) $this->getXpathValue('//ram:SpecifiedTradeSettlementMonetarySummation/ram:TaxTotalAmount'), + 'gross' => (float) $this->getXpathValue('//ram:SpecifiedTradeSettlementMonetarySummation/ram:GrandTotalAmount'), + 'currency' => $this->getXpathValue('//ram:ApplicableSupplyChainTradeSettlement/ram:InvoiceCurrencyCode'), + ); + + // Due date + $dueDateStr = $this->getXpathValue('//ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString'); + $data['due_date'] = $this->parseDate($dueDateStr); + + // Line items + $data['lines'] = array(); + $lines = $this->xml->xpath('//ram:IncludedSupplyChainTradeLineItem'); + + foreach ($lines as $line) { + $line->registerXPathNamespace('ram', 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:12'); + + // Get price and basis quantity for correct unit price calculation + $chargeAmount = (float) $this->getNodeValue($line->xpath('ram:SpecifiedSupplyChainTradeAgreement/ram:NetPriceProductTradePrice/ram:ChargeAmount')); + $basisQuantity = (float) $this->getNodeValue($line->xpath('ram:SpecifiedSupplyChainTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity')); + $basisQuantityUnit = (string) $this->getNodeAttribute($line->xpath('ram:SpecifiedSupplyChainTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity'), 'unitCode'); + + // Calculate real unit price: if BasisQuantity is e.g. 100 (meters), price is for 100 units + if ($basisQuantity > 0 && $basisQuantity != 1) { + $unitPrice = $chargeAmount / $basisQuantity; + } else { + $unitPrice = $chargeAmount; + } + + $lineData = array( + 'line_id' => (string) $this->getNodeValue($line->xpath('ram:AssociatedDocumentLineDocument/ram:LineID')), + 'product' => array( + 'seller_id' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:SellerAssignedID')), + 'buyer_id' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:BuyerAssignedID')), + 'global_id' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:GlobalID')), + 'name' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:Name')), + 'description' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:Description')), + ), + 'quantity' => (float) $this->getNodeValue($line->xpath('ram:SpecifiedSupplyChainTradeDelivery/ram:BilledQuantity')), + 'unit_code' => (string) $this->getNodeAttribute($line->xpath('ram:SpecifiedSupplyChainTradeDelivery/ram:BilledQuantity'), 'unitCode'), + 'unit_price' => $unitPrice, + 'unit_price_raw' => $chargeAmount, + 'basis_quantity' => $basisQuantity ?: 1, + 'basis_quantity_unit' => $basisQuantityUnit, + 'line_total' => (float) $this->getNodeValue($line->xpath('ram:SpecifiedSupplyChainTradeSettlement/ram:SpecifiedTradeSettlementMonetarySummation/ram:LineTotalAmount')), + 'tax_percent' => (float) $this->getNodeValue($line->xpath('ram:SpecifiedSupplyChainTradeSettlement/ram:ApplicableTradeTax/ram:ApplicablePercent')), + ); + + $data['lines'][] = $lineData; + } + + $this->invoice_data = $data; + return 1; + } + + /** + * Parse ZUGFeRD v2 / Factur-X format + * + * @return int 1 if OK, -1 if error + */ + private function parseZugferdV2() + { + $this->xml->registerXPathNamespace('rsm', 'urn:un:unece:uncefact:data:standard:CrossIndustryInvoice:100'); + $this->xml->registerXPathNamespace('ram', 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'); + $this->xml->registerXPathNamespace('qdt', 'urn:un:unece:uncefact:data:standard:QualifiedDataType:100'); + $this->xml->registerXPathNamespace('udt', 'urn:un:unece:uncefact:data:standard:UnqualifiedDataType:100'); + + $data = array(); + + // Header information + $data['invoice_number'] = $this->getXpathValue('//rsm:ExchangedDocument/ram:ID'); + $data['invoice_type'] = $this->getXpathValue('//rsm:ExchangedDocument/ram:TypeCode'); + $data['invoice_name'] = $this->getXpathValue('//rsm:ExchangedDocument/ram:Name'); + + $dateStr = $this->getXpathValue('//rsm:ExchangedDocument/ram:IssueDateTime/udt:DateTimeString'); + $data['invoice_date'] = $this->parseDate($dateStr); + + // Seller (Lieferant) + $data['seller'] = array( + 'name' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:Name'), + 'global_id' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:GlobalID'), + 'vat_id' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:SpecifiedTaxRegistration/ram:ID'), + 'address' => array( + 'street' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:LineOne'), + 'postcode' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:PostcodeCode'), + 'city' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:CityName'), + 'country' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:SellerTradeParty/ram:PostalTradeAddress/ram:CountryID'), + ) + ); + + // Buyer (Käufer - wir) + $data['buyer'] = array( + 'id' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:ID'), + 'reference' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:BuyerReference'), + 'name' => $this->getXpathValue('//ram:ApplicableHeaderTradeAgreement/ram:BuyerTradeParty/ram:Name'), + ); + + // Totals + $data['totals'] = array( + 'net' => (float) $this->getXpathValue('//ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:LineTotalAmount'), + 'tax' => (float) $this->getXpathValue('//ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:TaxTotalAmount'), + 'gross' => (float) $this->getXpathValue('//ram:ApplicableHeaderTradeSettlement/ram:SpecifiedTradeSettlementHeaderMonetarySummation/ram:GrandTotalAmount'), + 'currency' => $this->getXpathValue('//ram:ApplicableHeaderTradeSettlement/ram:InvoiceCurrencyCode'), + ); + + // Due date + $dueDateStr = $this->getXpathValue('//ram:SpecifiedTradePaymentTerms/ram:DueDateDateTime/udt:DateTimeString'); + $data['due_date'] = $this->parseDate($dueDateStr); + + // Line items + $data['lines'] = array(); + $lines = $this->xml->xpath('//ram:IncludedSupplyChainTradeLineItem'); + + foreach ($lines as $line) { + $line->registerXPathNamespace('ram', 'urn:un:unece:uncefact:data:standard:ReusableAggregateBusinessInformationEntity:100'); + + // Get price and basis quantity for correct unit price calculation + $chargeAmount = (float) $this->getNodeValue($line->xpath('ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:ChargeAmount')); + $basisQuantity = (float) $this->getNodeValue($line->xpath('ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity')); + $basisQuantityUnit = (string) $this->getNodeAttribute($line->xpath('ram:SpecifiedLineTradeAgreement/ram:NetPriceProductTradePrice/ram:BasisQuantity'), 'unitCode'); + + // Calculate real unit price: if BasisQuantity is e.g. 100 (meters), price is for 100 units + if ($basisQuantity > 0 && $basisQuantity != 1) { + $unitPrice = $chargeAmount / $basisQuantity; + } else { + $unitPrice = $chargeAmount; + } + + $lineData = array( + 'line_id' => (string) $this->getNodeValue($line->xpath('ram:AssociatedDocumentLineDocument/ram:LineID')), + 'product' => array( + 'seller_id' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:SellerAssignedID')), + 'buyer_id' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:BuyerAssignedID')), + 'global_id' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:GlobalID')), + 'name' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:Name')), + 'description' => (string) $this->getNodeValue($line->xpath('ram:SpecifiedTradeProduct/ram:Description')), + ), + 'quantity' => (float) $this->getNodeValue($line->xpath('ram:SpecifiedLineTradeDelivery/ram:BilledQuantity')), + 'unit_code' => (string) $this->getNodeAttribute($line->xpath('ram:SpecifiedLineTradeDelivery/ram:BilledQuantity'), 'unitCode'), + 'unit_price' => $unitPrice, + 'unit_price_raw' => $chargeAmount, + 'basis_quantity' => $basisQuantity ?: 1, + 'basis_quantity_unit' => $basisQuantityUnit, + 'line_total' => (float) $this->getNodeValue($line->xpath('ram:SpecifiedLineTradeSettlement/ram:SpecifiedTradeSettlementLineMonetarySummation/ram:LineTotalAmount')), + 'tax_percent' => (float) $this->getNodeValue($line->xpath('ram:SpecifiedLineTradeSettlement/ram:ApplicableTradeTax/ram:RateApplicablePercent')), + ); + + $data['lines'][] = $lineData; + } + + $this->invoice_data = $data; + return 1; + } + + /** + * Get value from XPath result + * + * @param string $xpath XPath expression + * @return string + */ + private function getXpathValue($xpath) + { + $result = $this->xml->xpath($xpath); + if (!empty($result)) { + return trim((string) $result[0]); + } + return ''; + } + + /** + * Get value from node array + * + * @param array $nodes XPath result array + * @return string + */ + private function getNodeValue($nodes) + { + if (!empty($nodes) && isset($nodes[0])) { + return trim((string) $nodes[0]); + } + return ''; + } + + /** + * Get attribute from node + * + * @param array $nodes XPath result array + * @param string $attr Attribute name + * @return string + */ + private function getNodeAttribute($nodes, $attr) + { + if (!empty($nodes) && isset($nodes[0])) { + $attributes = $nodes[0]->attributes(); + if (isset($attributes[$attr])) { + return (string) $attributes[$attr]; + } + } + return ''; + } + + /** + * Parse date string in format YYYYMMDD or ISO + * + * @param string $dateStr Date string + * @return string Date in Y-m-d format + */ + private function parseDate($dateStr) + { + if (empty($dateStr)) { + return ''; + } + + // Format: YYYYMMDD + if (preg_match('/^(\d{4})(\d{2})(\d{2})$/', $dateStr, $matches)) { + return $matches[1] . '-' . $matches[2] . '-' . $matches[3]; + } + + // Format: YYYY-MM-DD or ISO + if (preg_match('/^(\d{4})-(\d{2})-(\d{2})/', $dateStr, $matches)) { + return $matches[1] . '-' . $matches[2] . '-' . $matches[3]; + } + + return $dateStr; + } + + /** + * Get file hash for duplicate detection + * + * @param string $file_path Path to file + * @return string SHA256 hash + */ + public function getFileHash($file_path) + { + if (!file_exists($file_path)) { + return ''; + } + return hash_file('sha256', $file_path); + } + + /** + * Get invoice data + * + * @return array + */ + public function getInvoiceData() + { + return $this->invoice_data; + } + + /** + * Get XML content + * + * @return string + */ + public function getXmlContent() + { + return $this->xml_content; + } +} diff --git a/core/modules/modImportZugferd.class.php b/core/modules/modImportZugferd.class.php new file mode 100755 index 0000000..e7d14b7 --- /dev/null +++ b/core/modules/modImportZugferd.class.php @@ -0,0 +1,576 @@ + + * Copyright (C) 2018-2019 Nicolas ZABOURI + * Copyright (C) 2019-2024 Frédéric France + * Copyright (C) 2026 Eduard Wisch + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \defgroup importzugferd Module ImportZugferd + * \brief ImportZugferd module descriptor. + * + * \file htdocs/importzugferd/core/modules/modImportZugferd.class.php + * \ingroup importzugferd + * \brief Description and activation file for module ImportZugferd + */ +include_once DOL_DOCUMENT_ROOT.'/core/modules/DolibarrModules.class.php'; + + +/** + * Description and activation class for module ImportZugferd + */ +class modImportZugferd extends DolibarrModules +{ + /** + * Constructor. Define names, constants, directories, boxes, permissions + * + * @param DoliDB $db Database handler + */ + public function __construct($db) + { + global $conf, $langs; + + $this->db = $db; + + // Id for module (must be unique). + // Use here a free id (See in Home -> System information -> Dolibarr for list of used modules id). + $this->numero = 500016; // TODO Go on page https://wiki.dolibarr.org/index.php/List_of_modules_id to reserve an id number for your module + + // Key text used to identify module (for permissions, menus, etc...) + $this->rights_class = 'importzugferd'; + + // Family can be 'base' (core modules),'crm','financial','hr','projects','products','ecm','technic' (transverse modules),'interface' (link with external tools),'other','...' + // It is used to group modules by family in module setup page + $this->family = "other"; + + // Module position in the family on 2 digits ('01', '10', '20', ...) + $this->module_position = '90'; + + // Gives the possibility for the module, to provide his own family info and position of this family (Overwrite $this->family and $this->module_position. Avoid this) + //$this->familyinfo = array('myownfamily' => array('position' => '01', 'label' => $langs->trans("MyOwnFamily"))); + // Module label (no space allowed), used if translation string 'ModuleImportZugferdName' not found (ImportZugferd is name of module). + $this->name = preg_replace('/^mod/i', '', get_class($this)); + + // DESCRIPTION_FLAG + // Module description, used if translation string 'ModuleImportZugferdDesc' not found (ImportZugferd is name of module). + $this->description = "ImportZugferdDescription"; + // Used only if file README.md and README-LL.md not found. + $this->descriptionlong = "ImportZugferdDescription"; + + // Author + $this->editor_name = 'Alles Watt läuft (Testsystem)'; + $this->editor_url = ''; // Must be an external online web site + $this->editor_squarred_logo = ''; // Must be image filename into the module/img directory followed with @modulename. Example: 'myimage.png@importzugferd' + + // Possible values for version are: 'development', 'experimental', 'dolibarr', 'dolibarr_deprecated', 'experimental_deprecated' or a version string like 'x.y.z' + $this->version = '1.1'; + // Url to the file with your last numberversion of this module + //$this->url_last_version = 'http://www.example.com/versionmodule.txt'; + + // Key used in llx_const table to save module status enabled/disabled (where IMPORTZUGFERD is value of property name of module in uppercase) + $this->const_name = 'MAIN_MODULE_'.strtoupper($this->name); + + // Name of image file used for this module. + // If file is in theme/yourtheme/img directory under name object_pictovalue.png, use this->picto='pictovalue' + // If file is in module/img directory under name object_pictovalue.png, use this->picto='pictovalue@module' + // To use a supported fa-xxx css style of font awesome, use this->picto='xxx' + $this->picto = 'fa-file-invoice'; + + // Define some features supported by module (triggers, login, substitutions, menus, css, etc...) + $this->module_parts = array( + // Set this to 1 if module has its own trigger directory (core/triggers) + 'triggers' => 0, + // Set this to 1 if module has its own login method file (core/login) + 'login' => 0, + // Set this to 1 if module has its own substitution function file (core/substitutions) + 'substitutions' => 0, + // Set this to 1 if module has its own menus handler directory (core/menus) + 'menus' => 0, + // Set this to 1 if module overwrite template dir (core/tpl) + 'tpl' => 0, + // Set this to 1 if module has its own barcode directory (core/modules/barcode) + 'barcode' => 0, + // Set this to 1 if module has its own models directory (core/modules/xxx) + 'models' => 0, + // Set this to 1 if module has its own printing directory (core/modules/printing) + 'printing' => 0, + // Set this to 1 if module has its own theme directory (theme) + 'theme' => 0, + // Set this to relative path of css file if module has its own css file + 'css' => array( + // '/importzugferd/css/importzugferd.css.php', + ), + // Set this to relative path of js file if module must load a js on all pages + 'js' => array( + // '/importzugferd/js/importzugferd.js.php', + ), + // Set here all hooks context managed by module. To find available hook context, make a "grep -r '>initHooks(' *" on source code. You can also set hook context to 'all' + /* BEGIN MODULEBUILDER HOOKSCONTEXTS */ + 'hooks' => array( + // 'data' => array( + // 'hookcontext1', + // 'hookcontext2', + // ), + // 'entity' => '0', + ), + /* END MODULEBUILDER HOOKSCONTEXTS */ + // Set this to 1 if features of module are opened to external users + 'moduleforexternal' => 0, + // Set this to 1 if the module provides a website template into doctemplates/websites/website_template-mytemplate + 'websitetemplates' => 0, + // Set this to 1 if the module provides a captcha driver + 'captcha' => 0 + ); + + // Data directories to create when module is enabled. + $this->dirs = array("/importzugferd/temp", "/importzugferd/imports"); + + // Config pages. Put here list of php page, stored into importzugferd/admin directory, to use to setup module. + $this->config_page_url = array("setup.php@importzugferd"); + + // Dependencies + // A condition to hide module + $this->hidden = getDolGlobalInt('MODULE_IMPORTZUGFERD_DISABLED'); // A condition to disable module; + // List of module class names that must be enabled if this module is enabled. Example: array('always'=>array('modModuleToEnable1','modModuleToEnable2'), 'FR'=>array('modModuleToEnableFR')...) + $this->depends = array(); + // List of module class names to disable if this one is disabled. Example: array('modModuleToDisable1', ...) + $this->requiredby = array(); + // List of module class names this module is in conflict with. Example: array('modModuleToDisable1', ...) + $this->conflictwith = array(); + + // The language file dedicated to your module + $this->langfiles = array("importzugferd@importzugferd"); + + // Prerequisites + $this->phpmin = array(7, 1); // Minimum version of PHP required by module + // $this->phpmax = array(8, 0); // Maximum version of PHP required by module + $this->need_dolibarr_version = array(19, -3); // Minimum version of Dolibarr required by module + // $this->max_dolibarr_version = array(19, -3); // Maximum version of Dolibarr required by module + $this->need_javascript_ajax = 0; + + // Messages at activation + $this->warnings_activation = array(); // Warning to show when we activate module. array('always'='text') or array('FR'='textfr','MX'='textmx'...) + $this->warnings_activation_ext = array(); // Warning to show when we activate an external module. array('always'='text') or array('FR'='textfr','MX'='textmx'...) + //$this->automatic_activation = array('FR'=>'ImportZugferdWasAutomaticallyActivatedBecauseOfYourCountryChoice'); + //$this->always_enabled = true; // If true, can't be disabled + + // Constants + // List of particular constants to add when module is enabled (key, 'chaine', value, desc, visible, 'current' or 'allentities', deleteonunactive) + // Example: $this->const=array(1 => array('IMPORTZUGFERD_MYNEWCONST1', 'chaine', 'myvalue', 'This is a constant to add', 1), + // 2 => array('IMPORTZUGFERD_MYNEWCONST2', 'chaine', 'myvalue', 'This is another constant to add', 0, 'current', 1) + // ); + $this->const = array(); + + // Some keys to add into the overwriting translation tables + /*$this->overwrite_translation = array( + 'en_US:ParentCompany'=>'Parent company or reseller', + 'fr_FR:ParentCompany'=>'Maison mère ou revendeur' + )*/ + + if (!isModEnabled("importzugferd")) { + $conf->importzugferd = new stdClass(); + $conf->importzugferd->enabled = 0; + } + + // Array to add new pages in new tabs + /* BEGIN MODULEBUILDER TABS */ + $this->tabs = array(); + /* END MODULEBUILDER TABS */ + // Example: + // To add a new tab identified by code tabname1 + // $this->tabs[] = array('data' => 'objecttype:+tabname1:Title1:mylangfile@importzugferd:$user->hasRight(\'importzugferd\', \'read\'):/importzugferd/mynewtab1.php?id=__ID__'); + // To add another new tab identified by code tabname2. Label will be result of calling all substitution functions on 'Title2' key. + // $this->tabs[] = array('data' => 'objecttype:+tabname2:SUBSTITUTION_Title2:mylangfile@importzugferd:$user->hasRight(\'othermodule\', \'read\'):/importzugferd/mynewtab2.php?id=__ID__', + // To remove an existing tab identified by code tabname + // $this->tabs[] = array('data' => 'objecttype:-tabname:NU:conditiontoremove'); + // + // Where objecttype can be + // 'categories_x' to add a tab in category view (replace 'x' by type of category (0=product, 1=supplier, 2=customer, 3=member) + // 'contact' to add a tab in contact view + // 'contract' to add a tab in contract view + // 'delivery' to add a tab in delivery view + // 'group' to add a tab in group view + // 'intervention' to add a tab in intervention view + // 'invoice' to add a tab in customer invoice view + // 'supplier_invoice' to add a tab in supplier invoice view + // 'member' to add a tab in foundation member view + // 'opensurveypoll' to add a tab in opensurvey poll view + // 'order' to add a tab in sale order view + // 'supplier_order' to add a tab in supplier order view + // 'payment' to add a tab in payment view + // 'supplier_payment' to add a tab in supplier payment view + // 'product' to add a tab in product view + // 'propal' to add a tab in propal view + // 'project' to add a tab in project view + // 'stock' to add a tab in stock view + // 'thirdparty' to add a tab in third party view + // 'user' to add a tab in user view + + + // Dictionaries + /* Example: + $this->dictionaries=array( + 'langs' => 'importzugferd@importzugferd', + // List of tables we want to see into dictionary editor + 'tabname' => array("table1", "table2", "table3"), + // Label of tables + 'tablib' => array("Table1", "Table2", "Table3"), + // Request to select fields + 'tabsql' => array('SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.$this->db->prefix().'table1 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.$this->db->prefix().'table2 as f', 'SELECT f.rowid as rowid, f.code, f.label, f.active FROM '.$this->db->prefix().'table3 as f'), + // Sort order + 'tabsqlsort' => array("label ASC", "label ASC", "label ASC"), + // List of fields (result of select to show dictionary) + 'tabfield' => array("code,label", "code,label", "code,label"), + // List of fields (list of fields to edit a record) + 'tabfieldvalue' => array("code,label", "code,label", "code,label"), + // List of fields (list of fields for insert) + 'tabfieldinsert' => array("code,label", "code,label", "code,label"), + // Name of columns with primary key (try to always name it 'rowid') + 'tabrowid' => array("rowid", "rowid", "rowid"), + // Condition to show each dictionary + 'tabcond' => array(isModEnabled('importzugferd'), isModEnabled('importzugferd'), isModEnabled('importzugferd')), + // Tooltip for every fields of dictionaries: DO NOT PUT AN EMPTY ARRAY + 'tabhelp' => array(array('code' => $langs->trans('CodeTooltipHelp'), 'field2' => 'field2tooltip'), array('code' => $langs->trans('CodeTooltipHelp'), 'field2' => 'field2tooltip'), ...), + ); + */ + /* BEGIN MODULEBUILDER DICTIONARIES */ + $this->dictionaries = array(); + /* END MODULEBUILDER DICTIONARIES */ + + // Boxes/Widgets + // Add here list of php file(s) stored in importzugferd/core/boxes that contains a class to show a widget. + /* BEGIN MODULEBUILDER WIDGETS */ + $this->boxes = array( + // 0 => array( + // 'file' => 'importzugferdwidget1.php@importzugferd', + // 'note' => 'Widget provided by ImportZugferd', + // 'enabledbydefaulton' => 'Home', + // ), + // ... + ); + /* END MODULEBUILDER WIDGETS */ + + // Cronjobs (List of cron jobs entries to add when module is enabled) + // unit_frequency must be 60 for minute, 3600 for hour, 86400 for day, 604800 for week + /* BEGIN MODULEBUILDER CRON */ + $this->cronjobs = array( + 0 => array( + 'label' => 'ImportZugferdFromMailbox', + 'jobtype' => 'method', + 'class' => '/importzugferd/class/cron_importzugferd.class.php', + 'objectname' => 'CronImportZugferd', + 'method' => 'fetchFromMailbox', + 'parameters' => '', + 'comment' => 'Fetch ZUGFeRD invoices from configured mailbox', + 'frequency' => 15, + 'unitfrequency' => 60, + 'status' => 0, + 'test' => 'isModEnabled("importzugferd")', + 'priority' => 50, + ), + ); + /* END MODULEBUILDER CRON */ + // Example: $this->cronjobs=array( + // 0=>array('label'=>'My label', 'jobtype'=>'method', 'class'=>'/dir/class/file.class.php', 'objectname'=>'MyClass', 'method'=>'myMethod', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>2, 'unitfrequency'=>3600, 'status'=>0, 'test'=>'isModEnabled("importzugferd")', 'priority'=>50), + // 1=>array('label'=>'My label', 'jobtype'=>'command', 'command'=>'', 'parameters'=>'param1, param2', 'comment'=>'Comment', 'frequency'=>1, 'unitfrequency'=>3600*24, 'status'=>0, 'test'=>'isModEnabled("importzugferd")', 'priority'=>50) + // ); + + // Permissions provided by this module + $this->rights = array(); + $r = 0; + + $this->rights[$r][0] = $this->numero . sprintf("%02d", 1); + $this->rights[$r][1] = 'Read ZUGFeRD imports'; + $this->rights[$r][4] = 'import'; + $this->rights[$r][5] = 'read'; + $r++; + + $this->rights[$r][0] = $this->numero . sprintf("%02d", 2); + $this->rights[$r][1] = 'Create/Import ZUGFeRD invoices'; + $this->rights[$r][4] = 'import'; + $this->rights[$r][5] = 'write'; + $r++; + + $this->rights[$r][0] = $this->numero . sprintf("%02d", 3); + $this->rights[$r][1] = 'Delete ZUGFeRD imports'; + $this->rights[$r][4] = 'import'; + $this->rights[$r][5] = 'delete'; + $r++; + + $this->rights[$r][0] = $this->numero . sprintf("%02d", 4); + $this->rights[$r][1] = 'Manage product mappings'; + $this->rights[$r][4] = 'mapping'; + $this->rights[$r][5] = 'write'; + $r++; + + + // Main menu entries to add + $this->menu = array(); + $r = 0; + // Add here entries to declare new menus + /* BEGIN MODULEBUILDER TOPMENU */ + $this->menu[$r++] = array( + 'fk_menu' => '', // Will be stored into mainmenu + leftmenu. Use '' if this is a top menu. For left menu, use 'fk_mainmenu=xxx' or 'fk_mainmenu=xxx,fk_leftmenu=yyy' where xxx is mainmenucode and yyy is a leftmenucode + 'type' => 'top', // This is a Top menu entry + 'titre' => 'ModuleImportZugferdName', + 'prefix' => img_picto('', $this->picto, 'class="pictofixedwidth valignmiddle"'), + 'mainmenu' => 'importzugferd', + 'leftmenu' => '', + 'url' => '/importzugferd/importzugferdindex.php', + 'langs' => 'importzugferd@importzugferd', // Lang file to use (without .lang) by module. File must be in langs/code_CODE/ directory. + 'position' => 1000 + $r, + 'enabled' => 'isModEnabled("importzugferd")', // Define condition to show or hide menu entry. Use 'isModEnabled("importzugferd")' if entry must be visible if module is enabled. + 'perms' => '1', // Use 'perms'=>'$user->hasRight("importzugferd", "myobject", "read")' if you want your menu with a permission rules + 'target' => '', + 'user' => 2, // 0=Menu for internal users, 1=external users, 2=both + ); + /* END MODULEBUILDER TOPMENU */ + + // Left menu: Import + $this->menu[$r++] = array( + 'fk_menu' => 'fk_mainmenu=importzugferd', + 'type' => 'left', + 'titre' => 'ZugferdImport', + 'prefix' => img_picto('', 'fa-file-import', 'class="pictofixedwidth valignmiddle paddingright"'), + 'mainmenu' => 'importzugferd', + 'leftmenu' => 'zugferd_import', + 'url' => '/importzugferd/import.php', + 'langs' => 'importzugferd@importzugferd', + 'position' => 1000 + $r, + 'enabled' => 'isModEnabled("importzugferd")', + 'perms' => '$user->hasRight("importzugferd", "import", "write")', + 'target' => '', + 'user' => 2, + ); + + // Left menu: Import list + $this->menu[$r++] = array( + 'fk_menu' => 'fk_mainmenu=importzugferd', + 'type' => 'left', + 'titre' => 'ImportList', + 'prefix' => img_picto('', 'fa-list', 'class="pictofixedwidth valignmiddle paddingright"'), + 'mainmenu' => 'importzugferd', + 'leftmenu' => 'zugferd_list', + 'url' => '/importzugferd/list.php', + 'langs' => 'importzugferd@importzugferd', + 'position' => 1000 + $r, + 'enabled' => 'isModEnabled("importzugferd")', + 'perms' => '$user->hasRight("importzugferd", "import", "read")', + 'target' => '', + 'user' => 2, + ); + + // Left menu: Product Mapping + $this->menu[$r++] = array( + 'fk_menu' => 'fk_mainmenu=importzugferd', + 'type' => 'left', + 'titre' => 'ProductMapping', + 'prefix' => img_picto('', 'fa-exchange-alt', 'class="pictofixedwidth valignmiddle paddingright"'), + 'mainmenu' => 'importzugferd', + 'leftmenu' => 'zugferd_mapping', + 'url' => '/importzugferd/mapping.php', + 'langs' => 'importzugferd@importzugferd', + 'position' => 1000 + $r, + 'enabled' => 'isModEnabled("importzugferd")', + 'perms' => '$user->hasRight("importzugferd", "mapping", "write")', + 'target' => '', + 'user' => 2, + ); + + // Left menu: Batch Import + $this->menu[$r++] = array( + 'fk_menu' => 'fk_mainmenu=importzugferd', + 'type' => 'left', + 'titre' => 'BatchImport', + 'prefix' => img_picto('', 'fa-folder-open', 'class="pictofixedwidth valignmiddle paddingright"'), + 'mainmenu' => 'importzugferd', + 'leftmenu' => 'zugferd_batch', + 'url' => '/importzugferd/batch.php', + 'langs' => 'importzugferd@importzugferd', + 'position' => 1000 + $r, + 'enabled' => 'isModEnabled("importzugferd")', + 'perms' => '$user->hasRight("importzugferd", "import", "write")', + 'target' => '', + 'user' => 2, + ); + + + // Exports profiles provided by this module + $r = 0; + /* BEGIN MODULEBUILDER EXPORT MYOBJECT */ + /* + $langs->load("importzugferd@importzugferd"); + $this->export_code[$r] = $this->rights_class.'_'.$r; + $this->export_label[$r] = 'MyObjectLines'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->export_icon[$r] = $this->picto; + // Define $this->export_fields_array, $this->export_TypeFields_array and $this->export_entities_array + $keyforclass = 'MyObject'; $keyforclassfile='/importzugferd/class/myobject.class.php'; $keyforelement='myobject@importzugferd'; + include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; + //$this->export_fields_array[$r]['t.fieldtoadd']='FieldToAdd'; $this->export_TypeFields_array[$r]['t.fieldtoadd']='Text'; + //unset($this->export_fields_array[$r]['t.fieldtoremove']); + //$keyforclass = 'MyObjectLine'; $keyforclassfile='/importzugferd/class/myobject.class.php'; $keyforelement='myobjectline@importzugferd'; $keyforalias='tl'; + //include DOL_DOCUMENT_ROOT.'/core/commonfieldsinexport.inc.php'; + $keyforselect='myobject'; $keyforaliasextra='extra'; $keyforelement='myobject@importzugferd'; + include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; + //$keyforselect='myobjectline'; $keyforaliasextra='extraline'; $keyforelement='myobjectline@importzugferd'; + //include DOL_DOCUMENT_ROOT.'/core/extrafieldsinexport.inc.php'; + //$this->export_dependencies_array[$r] = array('myobjectline' => array('tl.rowid','tl.ref')); // To force to activate one or several fields if we select some fields that need same (like to select a unique key if we ask a field of a child to avoid the DISTINCT to discard them, or for computed field than need several other fields) + //$this->export_special_array[$r] = array('t.field' => '...'); + //$this->export_examplevalues_array[$r] = array('t.field' => 'Example'); + //$this->export_help_array[$r] = array('t.field' => 'FieldDescHelp'); + $this->export_sql_start[$r]='SELECT DISTINCT '; + $this->export_sql_end[$r] =' FROM '.$this->db->prefix().'importzugferd_myobject as t'; + //$this->export_sql_end[$r] .=' LEFT JOIN '.$this->db->prefix().'importzugferd_myobject_line as tl ON tl.fk_myobject = t.rowid'; + $this->export_sql_end[$r] .=' WHERE 1 = 1'; + $this->export_sql_end[$r] .=' AND t.entity IN ('.getEntity('myobject').')'; + $r++; */ + /* END MODULEBUILDER EXPORT MYOBJECT */ + + // Imports profiles provided by this module + $r = 0; + /* BEGIN MODULEBUILDER IMPORT MYOBJECT */ + /* + $langs->load("importzugferd@importzugferd"); + $this->import_code[$r] = $this->rights_class.'_'.$r; + $this->import_label[$r] = 'MyObjectLines'; // Translation key (used only if key ExportDataset_xxx_z not found) + $this->import_icon[$r] = $this->picto; + $this->import_tables_array[$r] = array('t' => $this->db->prefix().'importzugferd_myobject', 'extra' => $this->db->prefix().'importzugferd_myobject_extrafields'); + $this->import_tables_creator_array[$r] = array('t' => 'fk_user_author'); // Fields to store import user id + $import_sample = array(); + $keyforclass = 'MyObject'; $keyforclassfile='/importzugferd/class/myobject.class.php'; $keyforelement='myobject@importzugferd'; + include DOL_DOCUMENT_ROOT.'/core/commonfieldsinimport.inc.php'; + $import_extrafield_sample = array(); + $keyforselect='myobject'; $keyforaliasextra='extra'; $keyforelement='myobject@importzugferd'; + include DOL_DOCUMENT_ROOT.'/core/extrafieldsinimport.inc.php'; + $this->import_fieldshidden_array[$r] = array('extra.fk_object' => 'lastrowid-'.$this->db->prefix().'importzugferd_myobject'); + $this->import_regex_array[$r] = array(); + $this->import_examplevalues_array[$r] = array_merge($import_sample, $import_extrafield_sample); + $this->import_updatekeys_array[$r] = array('t.ref' => 'Ref'); + $this->import_convertvalue_array[$r] = array( + 't.ref' => array( + 'rule'=>'getrefifauto', + 'class'=>(!getDolGlobalString('IMPORTZUGFERD_MYOBJECT_ADDON') ? 'mod_myobject_standard' : getDolGlobalString('IMPORTZUGFERD_MYOBJECT_ADDON')), + 'path'=>"/core/modules/importzugferd/".(!getDolGlobalString('IMPORTZUGFERD_MYOBJECT_ADDON') ? 'mod_myobject_standard' : getDolGlobalString('IMPORTZUGFERD_MYOBJECT_ADDON')).'.php', + 'classobject'=>'MyObject', + 'pathobject'=>'/importzugferd/class/myobject.class.php', + ), + 't.fk_soc' => array('rule' => 'fetchidfromref', 'file' => '/societe/class/societe.class.php', 'class' => 'Societe', 'method' => 'fetch', 'element' => 'ThirdParty'), + 't.fk_user_valid' => array('rule' => 'fetchidfromref', 'file' => '/user/class/user.class.php', 'class' => 'User', 'method' => 'fetch', 'element' => 'user'), + 't.fk_mode_reglement' => array('rule' => 'fetchidfromcodeorlabel', 'file' => '/compta/paiement/class/cpaiement.class.php', 'class' => 'Cpaiement', 'method' => 'fetch', 'element' => 'cpayment'), + ); + $this->import_run_sql_after_array[$r] = array(); + $r++; */ + /* END MODULEBUILDER IMPORT MYOBJECT */ + } + + /** + * Function called when module is enabled. + * The init function add constants, boxes, permissions and menus (defined in constructor) into Dolibarr database. + * It also creates data directories + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int<-1,1> 1 if OK, <=0 if KO + */ + public function init($options = '') + { + global $conf, $langs; + + // Create tables of module at module activation + //$result = $this->_load_tables('/install/mysql/', 'importzugferd'); + $result = $this->_load_tables('/importzugferd/sql/'); + if ($result < 0) { + return -1; // Do not activate module if error 'not allowed' returned when loading module SQL queries (the _load_table run sql with run_sql with the error allowed parameter set to 'default') + } + + // Create extrafields during init + include_once DOL_DOCUMENT_ROOT.'/core/class/extrafields.class.php'; + $extrafields = new ExtraFields($this->db); + + // Add extrafield for supplier customer number (our customer ID at the supplier) + $extrafields->addExtraField( + 'supplier_customer_number', // attribute code + 'SupplierCustomerNumber', // label (translation key) + 'varchar', // type + 100, // position + 64, // size + 'thirdparty', // element type + 0, // unique + 0, // required + '', // default value + '', // param + 1, // always editable + '', // permission + 1, // list (show in list) + 0, // printable + '', // totalizable + '', // langfile + 'importzugferd@importzugferd', // module + 'isModEnabled("importzugferd")' // enabled condition + ); + + // Permissions + $this->remove($options); + + $sql = array(); + + // Document templates + $moduledir = dol_sanitizeFileName('importzugferd'); + $myTmpObjects = array(); + $myTmpObjects['MyObject'] = array('includerefgeneration' => 0, 'includedocgeneration' => 0); + + foreach ($myTmpObjects as $myTmpObjectKey => $myTmpObjectArray) { + if ($myTmpObjectArray['includerefgeneration']) { + $src = DOL_DOCUMENT_ROOT.'/install/doctemplates/'.$moduledir.'/template_myobjects.odt'; + $dirodt = DOL_DATA_ROOT.($conf->entity > 1 ? '/'.$conf->entity : '').'/doctemplates/'.$moduledir; + $dest = $dirodt.'/template_myobjects.odt'; + + if (file_exists($src) && !file_exists($dest)) { + require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; + dol_mkdir($dirodt); + $result = dol_copy($src, $dest, '0', 0); + if ($result < 0) { + $langs->load("errors"); + $this->error = $langs->trans('ErrorFailToCopyFile', $src, $dest); + return 0; + } + } + + $sql = array_merge($sql, array( + "DELETE FROM ".$this->db->prefix()."document_model WHERE nom = 'standard_".strtolower($myTmpObjectKey)."' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity), + "INSERT INTO ".$this->db->prefix()."document_model (nom, type, entity) VALUES('standard_".strtolower($myTmpObjectKey)."', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")", + "DELETE FROM ".$this->db->prefix()."document_model WHERE nom = 'generic_".strtolower($myTmpObjectKey)."_odt' AND type = '".$this->db->escape(strtolower($myTmpObjectKey))."' AND entity = ".((int) $conf->entity), + "INSERT INTO ".$this->db->prefix()."document_model (nom, type, entity) VALUES('generic_".strtolower($myTmpObjectKey)."_odt', '".$this->db->escape(strtolower($myTmpObjectKey))."', ".((int) $conf->entity).")" + )); + } + } + + return $this->_init($sql, $options); + } + + /** + * Function called when module is disabled. + * Remove from database constants, boxes and permissions from Dolibarr database. + * Data directories are not deleted + * + * @param string $options Options when enabling module ('', 'noboxes') + * @return int<-1,1> 1 if OK, <=0 if KO + */ + public function remove($options = '') + { + $sql = array(); + return $this->_remove($sql, $options); + } +} diff --git a/img/README.md b/img/README.md new file mode 100755 index 0000000..b96b533 --- /dev/null +++ b/img/README.md @@ -0,0 +1,14 @@ + +Directory for module image files +-------------------------------- + +You can put here the .png files of your module: + + +If the picto of your module is an image (property $picto has been set to 'importzugferd.png@importzugferd', you can put into this +directory a .png file called *object_importzugferd.png* (16x16 or 32x32 pixels) + + +If the picto of an object is an image (property $picto of the object.class.php has been set to 'myobject.png@importzugferd', then you can put into this +directory a .png file called *object_myobject.png* (16x16 or 32x32 pixels) + diff --git a/img/object_importzugferd.svg b/img/object_importzugferd.svg new file mode 100644 index 0000000..2d82491 --- /dev/null +++ b/img/object_importzugferd.svg @@ -0,0 +1,14 @@ + + + + + + + + + + + + + + diff --git a/import.php b/import.php new file mode 100644 index 0000000..870e7b8 --- /dev/null +++ b/import.php @@ -0,0 +1,841 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../main.inc.php")) { + $res = @include "../main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +require_once DOL_DOCUMENT_ROOT.'/core/lib/files.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; +require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; + +dol_include_once('/importzugferd/class/zugferdparser.class.php'); +dol_include_once('/importzugferd/class/zugferdimport.class.php'); +dol_include_once('/importzugferd/class/importline.class.php'); +dol_include_once('/importzugferd/class/productmapping.class.php'); +dol_include_once('/importzugferd/class/actions_importzugferd.class.php'); +dol_include_once('/importzugferd/lib/importzugferd.lib.php'); + +// Load translation files +$langs->loadLangs(array("importzugferd@importzugferd", "bills", "products", "companies")); + +// Security check +if (!$user->hasRight('importzugferd', 'import', 'write')) { + accessforbidden(); +} + +// Get parameters +$action = GETPOST('action', 'aZ09'); +$confirm = GETPOST('confirm', 'alpha'); +$id = GETPOST('id', 'int'); // Import ID for editing existing imports +$supplier_id = GETPOST('supplier_id', 'int'); +$line_id = GETPOST('line_id', 'int'); +$product_id = GETPOST('product_id', 'int'); +$template_product_id = GETPOST('template_product_id', 'int'); + +// Initialize objects +$form = new Form($db); +$formfile = new FormFile($db); +$actions = new ActionsImportZugferd($db); +$import = new ZugferdImport($db); +$importLine = new ImportLine($db); + +$error = 0; +$message = ''; + +/* + * Actions + */ + +// Upload and parse PDF - creates import record immediately +if ($action == 'upload') { + if (!empty($_FILES['zugferd_file']['tmp_name'])) { + $upload_dir = $conf->importzugferd->dir_output.'/temp'; + if (!is_dir($upload_dir)) { + dol_mkdir($upload_dir); + } + + $filename = dol_sanitizeFileName($_FILES['zugferd_file']['name']); + $destfile = $upload_dir.'/'.$filename; + + if (move_uploaded_file($_FILES['zugferd_file']['tmp_name'], $destfile)) { + $force_reimport = GETPOST('force_reimport', 'int'); + + // Check for duplicate + $file_hash = hash_file('sha256', $destfile); + $isDuplicate = $import->isDuplicate($file_hash); + + if ($isDuplicate && !$force_reimport) { + $error++; + $message = $langs->trans('ErrorDuplicateInvoice'); + @unlink($destfile); + } else { + // If force reimport, delete the old record first + if ($isDuplicate && $force_reimport) { + $oldImport = new ZugferdImport($db); + $oldImport->fetch(0, null, $file_hash); + if ($oldImport->id > 0) { + // Delete old lines + $oldLines = new ImportLine($db); + $oldLines->deleteAllByImport($oldImport->id); + // Delete old files + $old_dir = $conf->importzugferd->dir_output.'/imports/'.$oldImport->id; + if (is_dir($old_dir)) { + dol_delete_dir_recursive($old_dir); + } + // Delete old import record + $oldImport->delete($user); + } + } + // Parse the file + $parser = new ZugferdParser($db); + $res = $parser->extractFromPdf($destfile); + + if ($res > 0) { + $res = $parser->parse(); + if ($res > 0) { + $parsed_data = $parser->getInvoiceData(); + + // Create import record immediately + $import->invoice_number = $parsed_data['invoice_number']; + $import->invoice_date = $parsed_data['invoice_date']; + $import->seller_name = $parsed_data['seller']['name']; + $import->seller_vat = $parsed_data['seller']['vat_id']; + $import->buyer_reference = $parsed_data['buyer']['reference'] ?: $parsed_data['buyer']['id']; + $import->total_ht = $parsed_data['totals']['net']; + $import->total_ttc = $parsed_data['totals']['gross']; + $import->currency = $parsed_data['totals']['currency']; + $import->xml_content = $parser->getXmlContent(); + $import->pdf_filename = $filename; + $import->file_hash = $file_hash; + + // Find supplier + $supplier_id = $actions->findSupplier($parsed_data); + $import->fk_soc = $supplier_id; + + // Process line items to find products + $processed_lines = $actions->processLineItems($parsed_data['lines'], $supplier_id); + + // Check if all lines have products + $all_have_products = true; + foreach ($processed_lines as $line) { + if ($line['fk_product'] <= 0) { + $all_have_products = false; + break; + } + } + + // Set status based on product matching + if ($all_have_products && $supplier_id > 0) { + $import->status = ZugferdImport::STATUS_IMPORTED; + } else { + $import->status = ZugferdImport::STATUS_PENDING; + } + + $import->date_creation = dol_now(); + $result = $import->create($user); + + if ($result > 0) { + // Store line items in database + foreach ($processed_lines as $line) { + $importLineObj = new ImportLine($db); + $importLineObj->fk_import = $import->id; + $importLineObj->line_id = $line['line_id']; + $importLineObj->supplier_ref = $line['supplier_ref']; + $importLineObj->product_name = $line['name']; + $importLineObj->description = $line['description']; + $importLineObj->quantity = $line['quantity']; + $importLineObj->unit_code = $line['unit_code']; + $importLineObj->unit_price = $line['unit_price']; + $importLineObj->unit_price_raw = $line['unit_price_raw']; + $importLineObj->basis_quantity = $line['basis_quantity']; + $importLineObj->basis_quantity_unit = $line['basis_quantity_unit']; + $importLineObj->line_total = $line['line_total']; + $importLineObj->tax_percent = $line['tax_percent']; + $importLineObj->ean = $line['ean']; + $importLineObj->fk_product = $line['fk_product']; + $importLineObj->match_method = $line['match_method']; + $importLineObj->create($user); + } + + // Move PDF to permanent storage + $final_dir = $conf->importzugferd->dir_output.'/imports/'.$import->id; + if (!is_dir($final_dir)) { + dol_mkdir($final_dir); + } + rename($destfile, $final_dir.'/'.$filename); + + // Redirect to edit page + $id = $import->id; + $action = 'edit'; + setEventMessages($langs->trans('ImportRecordCreated'), null, 'mesgs'); + } else { + $error++; + $message = $import->error; + @unlink($destfile); + } + } else { + $error++; + $message = $parser->error; + @unlink($destfile); + } + } else { + $error++; + $message = $parser->error; + @unlink($destfile); + } + } + } else { + $error++; + $message = $langs->trans('ErrorFileUploadFailed'); + } + } else { + $error++; + $message = $langs->trans('ErrorNoFileUploaded'); + } +} + +// Load existing import for editing +if ($id > 0 && empty($action)) { + $action = 'edit'; +} + +if ($action == 'edit' && $id > 0) { + $result = $import->fetch($id); + if ($result <= 0) { + $error++; + $message = $langs->trans('ErrorRecordNotFound'); + $action = ''; + } +} + +// Assign product to line +if ($action == 'assignproduct' && $line_id > 0 && $product_id > 0) { + $lineObj = new ImportLine($db); + $result = $lineObj->fetch($line_id); + if ($result > 0) { + $lineObj->setProduct($product_id, $langs->trans('ManualAssignment'), $user); + setEventMessages($langs->trans('ProductAssigned'), null, 'mesgs'); + + // Get import ID to reload + $id = $lineObj->fk_import; + + // Check if all lines now have products + $allHaveProducts = $importLine->allLinesHaveProducts($id); + if ($allHaveProducts) { + // Update import status + $import->fetch($id); + if ($import->status == ZugferdImport::STATUS_PENDING) { + $import->status = ZugferdImport::STATUS_IMPORTED; + $import->update($user); + } + } + } + $action = 'edit'; + $import->fetch($id); +} + +// Remove product assignment from line +if ($action == 'removeproduct' && $line_id > 0) { + $lineObj = new ImportLine($db); + $result = $lineObj->fetch($line_id); + if ($result > 0) { + $id = $lineObj->fk_import; + $lineObj->setProduct(0, '', $user); + setEventMessages($langs->trans('ProductRemoved'), null, 'mesgs'); + + // Update import status to pending + $import->fetch($id); + if ($import->status == ZugferdImport::STATUS_IMPORTED) { + $import->status = ZugferdImport::STATUS_PENDING; + $import->update($user); + } + } + $action = 'edit'; + $import->fetch($id); +} + +// Update supplier +if ($action == 'setsupplier' && $id > 0) { + $import->fetch($id); + $import->fk_soc = $supplier_id; + $import->update($user); + setEventMessages($langs->trans('SupplierUpdated'), null, 'mesgs'); + $action = 'edit'; +} + +// Duplicate product from template +if ($action == 'duplicateproduct' && $template_product_id > 0 && $line_id > 0) { + $lineObj = new ImportLine($db); + $result = $lineObj->fetch($line_id); + + if ($result > 0) { + // Load template product + $template = new Product($db); + if ($template->fetch($template_product_id) > 0) { + // Create new product as copy + $newproduct = new Product($db); + + // Copy basic properties from template + $newproduct->type = $template->type; + $newproduct->status = $template->status; + $newproduct->status_buy = $template->status_buy; + $newproduct->status_batch = $template->status_batch; + $newproduct->fk_product_type = $template->fk_product_type; + $newproduct->price = $lineObj->unit_price; + $newproduct->price_base_type = 'HT'; + $newproduct->tva_tx = $lineObj->tax_percent ?: $template->tva_tx; + $newproduct->weight = $template->weight; + $newproduct->weight_units = $template->weight_units; + $newproduct->fk_unit = $template->fk_unit; + + // Set label from ZUGFeRD + $newproduct->label = $lineObj->product_name; + + // Generate unique ref + $newproduct->ref = 'NEW-'.dol_print_date(dol_now(), '%Y%m%d%H%M%S'); + + // Build description with ZUGFeRD data + $zugferd_info = ''; + if (!empty($lineObj->supplier_ref)) { + $zugferd_info .= $langs->trans('SupplierRef').': '.$lineObj->supplier_ref."\n"; + } + if (!empty($lineObj->unit_code)) { + $zugferd_info .= $langs->trans('Unit').': '.zugferdGetUnitLabel($lineObj->unit_code)."\n"; + } + if (!empty($lineObj->ean)) { + $zugferd_info .= 'EAN: '.$lineObj->ean."\n"; + } + $zugferd_info .= "---\n"; + $newproduct->description = $zugferd_info . ($template->description ?: ''); + + // Create the product + $result = $newproduct->create($user); + if ($result > 0) { + setEventMessages($langs->trans('ProductCreated'), null, 'mesgs'); + // Redirect to product card for editing + header('Location: '.DOL_URL_ROOT.'/product/card.php?id='.$result); + exit; + } else { + setEventMessages($newproduct->error, $newproduct->errors, 'errors'); + } + } + $id = $lineObj->fk_import; + } + $action = 'edit'; + $import->fetch($id); +} + +// Create supplier invoice +if ($action == 'createinvoice' && $id > 0) { + $import->fetch($id); + + // Check prerequisites + if ($import->fk_soc <= 0) { + $error++; + setEventMessages($langs->trans('ErrorSupplierRequired'), null, 'errors'); + } else { + // Check all lines have products + $lines = $importLine->fetchAllByImport($id); + $allHaveProducts = true; + foreach ($lines as $line) { + if ($line->fk_product <= 0) { + $allHaveProducts = false; + break; + } + } + + if (!$allHaveProducts) { + $error++; + setEventMessages($langs->trans('ErrorNotAllProductsAssigned'), null, 'errors'); + } else { + // Create invoice + $invoice = new FactureFournisseur($db); + $invoice->socid = $import->fk_soc; + $invoice->ref_supplier = $import->invoice_number; + $invoice->date = $import->invoice_date; + $invoice->note_private = $langs->trans('ImportedFromZugferd').' ('.$import->ref.')'; + $invoice->cond_reglement_id = 1; + + $db->begin(); + $result = $invoice->create($user); + + if ($result > 0) { + // Add lines + foreach ($lines as $line) { + $res = $invoice->addline( + $line->product_name, + $line->unit_price, + $line->tax_percent, + 0, 0, + $line->quantity, + $line->fk_product, + 0, '', '', + 0, 0, '', + 'HT' + ); + if ($res < 0) { + $error++; + setEventMessages($invoice->error, $invoice->errors, 'errors'); + break; + } + + // Update EAN on product if not set + if (!empty($line->ean) && $line->fk_product > 0) { + $product = new Product($db); + $product->fetch($line->fk_product); + if (empty($product->barcode)) { + $product->barcode = $line->ean; + $product->barcode_type = 2; // EAN13 + $product->update($product->id, $user); + } + } + } + + if (!$error) { + // Validate invoice + $invoice->validate($user); + + // Copy PDF to invoice + $source_pdf = $conf->importzugferd->dir_output.'/imports/'.$import->id.'/'.$import->pdf_filename; + if (file_exists($source_pdf)) { + $dest_dir = $conf->fournisseur->facture->dir_output.'/'.get_exdir($invoice->id, 2, 0, 0, $invoice, 'invoice_supplier').$invoice->ref; + if (!is_dir($dest_dir)) { + dol_mkdir($dest_dir); + } + copy($source_pdf, $dest_dir.'/'.$import->pdf_filename); + } + + // Update import record + $import->fk_facture_fourn = $invoice->id; + $import->status = ZugferdImport::STATUS_PROCESSED; + $import->date_import = dol_now(); + $import->update($user); + + $db->commit(); + setEventMessages($langs->trans('InvoiceCreatedSuccessfully'), null, 'mesgs'); + + // Redirect to invoice + header('Location: '.DOL_URL_ROOT.'/fourn/facture/card.php?facid='.$invoice->id); + exit; + } else { + $db->rollback(); + } + } else { + $error++; + setEventMessages($invoice->error, $invoice->errors, 'errors'); + $db->rollback(); + } + } + } + $action = 'edit'; +} + +// Delete import record +if ($action == 'confirm_delete' && $confirm == 'yes' && $id > 0) { + $import->fetch($id); + + // Delete lines first + $importLine->deleteAllByImport($id); + + // Delete files + $import_dir = $conf->importzugferd->dir_output.'/imports/'.$import->id; + if (is_dir($import_dir)) { + dol_delete_dir_recursive($import_dir); + } + + // Delete import record + $import->delete($user); + setEventMessages($langs->trans('RecordDeleted'), null, 'mesgs'); + + header('Location: '.$_SERVER['PHP_SELF']); + exit; +} + +/* + * View + */ + +$title = $langs->trans('ZugferdImport'); +llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-import'); + +print load_fiche_titre($title, '', 'fa-file-import'); + +// Error message +if ($error && !empty($message)) { + setEventMessages($message, null, 'errors'); +} + +/* + * Upload form (shown when no import is being edited) + */ +if (empty($action) || ($action == 'upload' && $error)) { + print '
'; + print ''; + print ''; + + print '
'; + print '
'; + + print '
'; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + + print '
'.$langs->trans('UploadZugferdInvoice').'
'.$langs->trans('File').' (PDF)'; + print ''; + print '
'.$langs->trans('ForceReimport').''; + print ' '; + print ''.$langs->trans('ForceReimportHelp').''; + print '
'; + print '
'; + + print '
'; + print ''; + print '
'; + + print '
'; + + // Show pending imports + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + + $sql = "SELECT i.rowid, i.ref, i.invoice_number, i.seller_name, i.total_ttc, i.status, i.date_creation"; + $sql .= " FROM ".MAIN_DB_PREFIX."importzugferd_import as i"; + $sql .= " WHERE i.entity = ".$conf->entity; + $sql .= " AND i.status IN (".ZugferdImport::STATUS_IMPORTED.", ".ZugferdImport::STATUS_PENDING.")"; + $sql .= " ORDER BY i.date_creation DESC LIMIT 10"; + + $resql = $db->query($sql); + if ($resql) { + $num = $db->num_rows($resql); + if ($num > 0) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + while ($obj = $db->fetch_object($resql)) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + } else { + print ''; + } + } + + print '
'.$langs->trans('PendingImports').'
'.$langs->trans('Ref').''.$langs->trans('InvoiceNumber').''.$langs->trans('Supplier').''.$langs->trans('TotalTTC').''.$langs->trans('Status').'
'.$obj->ref.''.$obj->invoice_number.''.$obj->seller_name.''.price($obj->total_ttc).''; + $tmpimport = new ZugferdImport($db); + print $tmpimport->LibStatut($obj->status, 1); + print '
'.$langs->trans('NoPendingImports').'
'; + print '
'; + print '
'; + + print '
'; + print '
'; +} + +/* + * Edit/Review import + */ +if ($action == 'edit' && $import->id > 0) { + // Delete confirmation + if ($action == 'delete') { + $formconfirm = $form->formconfirm( + $_SERVER['PHP_SELF'].'?id='.$import->id, + $langs->trans('DeleteImportRecord'), + $langs->trans('ConfirmDeleteImportRecord', $import->ref), + 'confirm_delete' + ); + print $formconfirm; + } + + // Fetch lines + $lines = $importLine->fetchAllByImport($import->id); + $missingProducts = $importLine->countLinesWithoutProduct($import->id); + $allComplete = ($missingProducts == 0 && $import->fk_soc > 0); + + // Header info + print '
'; + + // Status banner + if ($import->status == ZugferdImport::STATUS_PENDING) { + print '
'; + print ''; + print $langs->trans('ManualInterventionRequired'); + if ($missingProducts > 0) { + print ' - '.$missingProducts.' '.$langs->trans('ProductsNotAssigned'); + } + if ($import->fk_soc <= 0) { + print ' - '.$langs->trans('SupplierNotAssigned'); + } + print '

'; + } elseif ($allComplete) { + print '
'; + print ''; + print $langs->trans('ReadyToCreateInvoice'); + print '
'; + } + + // Invoice data + print '
'; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print '
'.$langs->trans('InvoiceData').' - '.$import->ref.'
'.$langs->trans('InvoiceNumber').''.dol_escape_htmltag($import->invoice_number).''.$langs->trans('InvoiceDate').''.dol_print_date($import->invoice_date, 'day').'
'.$langs->trans('Supplier').''.dol_escape_htmltag($import->seller_name).''.$langs->trans('VATIntra').''.dol_escape_htmltag($import->seller_vat).'
'.$langs->trans('BuyerReference').''.dol_escape_htmltag($import->buyer_reference).''.$langs->trans('TotalHT').''.price($import->total_ht).' '.$import->currency.'
'.$langs->trans('Status').''.$import->getLibStatut(1).''.$langs->trans('TotalTTC').''.price($import->total_ttc).' '.$import->currency.'
'; + print '
'; + + // Supplier selection + print '
'; + print '
'; + print ''; + print ''; + print ''; + + print '
'; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + + print '
'.$langs->trans('SupplierAssignment').'
'.$langs->trans('SelectSupplier').' *'; + print $form->select_company($import->fk_soc, 'supplier_id', 's.fournisseur = 1', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300'); + print ' '; + print '
'; + print '
'; + print '
'; + + // Line items + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + foreach ($lines as $line) { + $hasProduct = ($line->fk_product > 0); + $rowClass = $hasProduct ? 'oddeven opacitymedium' : 'oddeven'; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + } + + print '
'.$langs->trans('Position').''.$langs->trans('SupplierRef').''.$langs->trans('ProductDescription').''.$langs->trans('Qty').''.$langs->trans('UnitPrice').''.$langs->trans('TotalHT').''.$langs->trans('MatchedProduct').''.$langs->trans('Action').'
'.$line->line_id.''.dol_escape_htmltag($line->supplier_ref).''; + print dol_escape_htmltag($line->product_name); + if (!empty($line->ean) && !$hasProduct) { + print '
EAN: '.$line->ean.''; + } + print '
'.price2num($line->quantity, 'MS').' '.zugferdGetUnitLabel($line->unit_code).''; + print price($line->unit_price); + if (!empty($line->basis_quantity) && $line->basis_quantity != 1) { + print '
('.price($line->unit_price_raw).'/'.price2num($line->basis_quantity, 'MS').zugferdGetUnitLabel($line->basis_quantity_unit).')'; + } + print '
'.price($line->line_total).''; + + if ($hasProduct) { + $product = new Product($db); + $product->fetch($line->fk_product); + print $product->getNomUrl(1); + if (!empty($line->match_method)) { + print '
'.$langs->trans('MatchMethod').': '.$line->match_method.''; + } + if (!empty($line->ean)) { + print '
'.$line->ean.''; + } + print ' '; + } else { + print ''.$langs->trans('NoProductMatch').''; + } + print '
'; + if ($hasProduct) { + // Remove assignment button + print ''; + print ''; + print ''; + } else { + // Product selection form + print '
'; + print ''; + print ''; + print ''; + print ''; + print $form->select_produits('', 'product_id', '', 0, 0, -1, 2, '', 0, array(), 0, '1', 0, 'minwidth150 maxwidth200', 1, '', 0); + print ' '; + print '
'; + + // Create new product link + $create_url = DOL_URL_ROOT.'/product/card.php?action=create'; + $create_url .= '&label='.urlencode($line->product_name); + $create_url .= '&price='.urlencode($line->unit_price); + $create_desc = ''; + if (!empty($line->supplier_ref)) { + $create_desc .= $langs->trans('SupplierRef').': '.$line->supplier_ref."\n"; + } + if (!empty($line->unit_code)) { + $create_desc .= $langs->trans('Unit').': '.zugferdGetUnitLabel($line->unit_code)."\n"; + } + if (!empty($line->ean)) { + $create_desc .= 'EAN: '.$line->ean."\n"; + } + $create_url .= '&description='.urlencode(trim($create_desc)); + + print '
'; + print ' '.$langs->trans('CreateProduct'); + print ''; + + // Product template + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + print $form->select_produits('', 'template_product_id', '', 0, 0, -1, 2, '', 0, array(), 0, '1', 0, 'minwidth100 maxwidth150', 1, '', 0); + print ' '; + print '
'; + } + print '
'; + print '
'; + + // Action buttons + print '
'; + + if ($allComplete) { + print ''; + print ''.$langs->trans('CreateSupplierInvoice'); + print ''; + print '   '; + } + + print ''.$langs->trans('BackToList').''; + print '   '; + print ''.$langs->trans('Delete').''; + + print '
'; + + print '
'; +} + +llxFooter(); +$db->close(); diff --git a/importzugferdindex.php b/importzugferdindex.php new file mode 100755 index 0000000..143dd03 --- /dev/null +++ b/importzugferdindex.php @@ -0,0 +1,191 @@ + + * + * This program is free software; you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation; either version 3 of the License, or + * (at your option) any later version. + */ + +/** + * \file importzugferdindex.php + * \ingroup importzugferd + * \brief Home page of the ZUGFeRD Import module + */ + +// Load Dolibarr environment +$res = 0; +if (!$res && !empty($_SERVER["CONTEXT_DOCUMENT_ROOT"])) { + $res = @include $_SERVER["CONTEXT_DOCUMENT_ROOT"]."/main.inc.php"; +} +$tmp = empty($_SERVER['SCRIPT_FILENAME']) ? '' : $_SERVER['SCRIPT_FILENAME']; +$tmp2 = realpath(__FILE__); +$i = strlen($tmp) - 1; +$j = strlen($tmp2) - 1; +while ($i > 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../main.inc.php")) { + $res = @include "../main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formfile.class.php'; + +dol_include_once('/importzugferd/class/zugferdimport.class.php'); +dol_include_once('/importzugferd/lib/importzugferd.lib.php'); + +// Load translation files +$langs->loadLangs(array("importzugferd@importzugferd")); + +// Security check +if (!isModEnabled('importzugferd')) { + accessforbidden('Module not enabled'); +} + +/* + * View + */ + +$form = new Form($db); + +$title = $langs->trans('ModuleImportZugferdName'); +llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-index'); + +print load_fiche_titre($title, '', 'fa-file-import'); + +print '
'; + +// Statistics box +print '
'; + +print '
'; +print ''; +print ''; +print ''; +print ''; + +// Count imports by status +$sql = "SELECT status, COUNT(*) as nb FROM ".MAIN_DB_PREFIX."importzugferd_import"; +$sql .= " WHERE entity = ".(int)$conf->entity; +$sql .= " GROUP BY status"; + +$stats = array(0 => 0, 1 => 0, 2 => 0); +$resql = $db->query($sql); +if ($resql) { + while ($obj = $db->fetch_object($resql)) { + $stats[$obj->status] = $obj->nb; + } +} + +$import = new ZugferdImport($db); + +print ''; +print ''; +print ''; +print ''; + +print ''; +print ''; +print ''; +print ''; + +print ''; +print ''; +print ''; +print ''; + +print ''; +print ''; +print ''; +print ''; + +print '
'.$langs->trans('Statistics').'
'.$langs->trans('TotalImported').''.array_sum($stats).'
'.$import->LibStatut(0, 1).''.$stats[0].'
'.$import->LibStatut(1, 1).''.$stats[1].'
'.$import->LibStatut(2, 1).''.$stats[2].'
'; +print '
'; + +print '
'; // fichethirdleft + +// Quick actions and recent imports +print '
'; + +print '
'; +print ''; +print ''; +print ''; +print ''; + +print ''; +print ''; +print ''; + +print '
'.$langs->trans('QuickActions').'
'; +print ''; +print ' '.$langs->trans('ZugferdImport'); +print ''; +print '   '; +print ''; +print ' '.$langs->trans('ImportList'); +print ''; +print '   '; +print ''; +print ' '.$langs->trans('ProductMapping'); +print ''; +print '
'; +print '
'; + +// Recent imports +print '
'; +print '
'; +print ''; +print ''; +print ''; +print ''; + +$sql = "SELECT i.rowid, i.ref, i.invoice_number, i.invoice_date, i.seller_name, i.total_ttc, i.status"; +$sql .= " FROM ".MAIN_DB_PREFIX."importzugferd_import as i"; +$sql .= " WHERE i.entity = ".(int)$conf->entity; +$sql .= " ORDER BY i.date_creation DESC"; +$sql .= " LIMIT 10"; + +$resql = $db->query($sql); +if ($resql) { + $num = $db->num_rows($resql); + if ($num > 0) { + while ($obj = $db->fetch_object($resql)) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + } else { + print ''; + } +} + +print '
'.$langs->trans('RecentImports').'
'.$obj->ref.''.dol_escape_htmltag($obj->invoice_number).''.dol_print_date($db->jdate($obj->invoice_date), 'day').''.dol_escape_htmltag($obj->seller_name).''.price($obj->total_ttc).' EUR'.$import->LibStatut($obj->status, 0).'
'.$langs->trans('NoRecordFound').'
'; +print '
'; + +print '
'; // fichetwothirdright + +print '
'; // fichecenter + +print '
'; + +llxFooter(); +$db->close(); diff --git a/langs/de_DE/importzugferd.lang b/langs/de_DE/importzugferd.lang new file mode 100644 index 0000000..8b501bb --- /dev/null +++ b/langs/de_DE/importzugferd.lang @@ -0,0 +1,215 @@ +# Übersetzungsdatei für ImportZugferd Modul + +# +# Allgemein +# +ModuleImportZugferdName = ZUGFeRD Import +ModuleImportZugferdDesc = Import von ZUGFeRD/Factur-X Rechnungen als Lieferantenrechnungen + +# +# Admin-Seite +# +ImportZugferdSetup = ZUGFeRD Import Einstellungen +Settings = Einstellungen +ImportZugferdSetupPage = Konfiguration des ZUGFeRD Import Moduls + +# E-Mail Einstellungen +IMPORTZUGFERD_IMAP_HOST = IMAP Server +IMPORTZUGFERD_IMAP_HOSTTooltip = IMAP Server Hostname (z.B. imap.example.com) +IMPORTZUGFERD_IMAP_PORT = IMAP Port +IMPORTZUGFERD_IMAP_PORTTooltip = IMAP Server Port (993 für SSL, 143 für STARTTLS) +IMPORTZUGFERD_IMAP_USER = IMAP Benutzername +IMPORTZUGFERD_IMAP_USERTooltip = E-Mail-Adresse oder Benutzername für IMAP Login +IMPORTZUGFERD_IMAP_PASSWORD = IMAP Passwort +IMPORTZUGFERD_IMAP_PASSWORDTooltip = Passwort für IMAP Login +IMPORTZUGFERD_IMAP_FOLDER = Postfach-Ordner +IMPORTZUGFERD_IMAP_FOLDERTooltip = Ordner für Rechnungs-E-Mails (Standard: INBOX) +IMPORTZUGFERD_IMAP_SSL = SSL verwenden +IMPORTZUGFERD_IMAP_SSLTooltip = SSL-Verschlüsselung für IMAP-Verbindung aktivieren +IMPORTZUGFERD_AUTO_CREATE_INVOICE = Rechnungen automatisch erstellen +IMPORTZUGFERD_AUTO_CREATE_INVOICETooltip = Lieferantenrechnungen beim Import automatisch erstellen + +# Ordner Import Einstellungen +FolderImportSettings = Ordner Import Einstellungen +IMPORTZUGFERD_WATCH_FOLDER = Überwachungsordner +IMPORTZUGFERD_WATCH_FOLDERTooltip = Ordner für eingehende ZUGFeRD-Rechnungen (lokaler Pfad) +IMPORTZUGFERD_ARCHIVE_FOLDER = Archivordner +IMPORTZUGFERD_ARCHIVE_FOLDERTooltip = Ordner für erfolgreich importierte Rechnungen +IMPORTZUGFERD_IMAP_ARCHIVE_FOLDER = IMAP Archivordner +IMPORTZUGFERD_IMAP_ARCHIVE_FOLDERTooltip = IMAP-Ordner für archivierte E-Mails nach Import + +# +# Über-Seite +# +About = Über +ImportZugferdAbout = Über ZUGFeRD Import +ImportZugferdAboutPage = Dieses Modul ermöglicht den Import von ZUGFeRD/Factur-X Rechnungen aus PDF-Dateien. + +# +# Menü +# +ZugferdImport = Rechnung importieren +ImportList = Import-Liste +ProductMapping = Artikelzuordnung + +# +# Import-Seite +# +UploadZugferdInvoice = ZUGFeRD Rechnung hochladen +InvoiceData = Rechnungsdaten +InvoiceNumber = Rechnungsnummer +InvoiceDate = Rechnungsdatum +BuyerReference = Käuferreferenz (Kundennummer) +DueDate = Fälligkeitsdatum +SupplierAssignment = Lieferantenzuordnung +SelectSupplier = Lieferant auswählen +AutomaticallyDetected = automatisch erkannt +CreateSupplierInvoice = Lieferantenrechnung erstellen +CreateSupplierInvoiceAfterImport = Lieferantenrechnung nach Import erstellen +MatchedProduct = Zugeordnetes Produkt +MatchMethod = Zuordnungsmethode +NoProductMatch = Kein Produkt gefunden +CreateProduct = Produkt anlegen +ImportSuccessful = Rechnung erfolgreich importiert +ImportAnother = Weitere importieren +ViewInvoice = Rechnung anzeigen +ImportedFromZugferd = Importiert aus ZUGFeRD + +# +# Status +# +StatusImported = Importiert +StatusProcessed = Verarbeitet +StatusError = Fehler +Imported = Importiert +Processed = Verarbeitet +Error = Fehler + +# +# Zuordnung +# +AddMapping = Zuordnung hinzufügen +SupplierRef = Lieferanten-Artikelnr. +ManufacturerRef = Hersteller-Artikelnr. +MappingCreated = Zuordnung erstellt +MappingDeleted = Zuordnung gelöscht +DeleteMapping = Zuordnung löschen +ConfirmDeleteMapping = Möchten Sie diese Zuordnung wirklich löschen? +NoMappingsFound = Keine Zuordnungen für diesen Lieferanten gefunden +Active = Aktiv +Inactive = Inaktiv + +# +# Extrafeld +# +SupplierCustomerNumber = Kundennummer beim Lieferant +SupplierCustomerNumberHelp = Ihre Kundennummer bei diesem Lieferanten (für automatische Lieferantenerkennung) + +# +# Cronjob +# +ImportZugferdFromMailbox = ZUGFeRD Rechnungen aus Postfach importieren + +# +# Fehler +# +ErrorSupplierRequired = Bitte wählen Sie einen Lieferanten aus +ErrorNoFileUploaded = Keine Datei hochgeladen +ErrorFileUploadFailed = Datei-Upload fehlgeschlagen +ErrorDuplicateInvoice = Rechnung wurde bereits importiert (Duplikat erkannt) +ErrorProductNotFound = Produkt nicht gefunden +ErrorLineNotFound = Rechnungsposition nicht gefunden + +# +# Statistiken / Startseite +# +Statistics = Statistiken +TotalImported = Gesamt importiert +QuickActions = Schnellaktionen +RecentImports = Letzte Importe +ImportRecord = Import-Datensatz + +# +# Admin +# +IMAPSettings = IMAP Einstellungen +ImportSettings = Import Einstellungen +TestConnection = Verbindung testen +ConnectionSuccessful = Verbindung erfolgreich +ConnectionFailed = Verbindung fehlgeschlagen +ClickTestToCheck = Klicken Sie auf "Verbindung testen" um die Einstellungen zu prüfen +SelectFolder = Ordner auswählen +FolderSelected = Ordner ausgewählt +FoundFolders = Gefundene Ordner +IMAPExtensionNotInstalled = PHP IMAP-Erweiterung ist nicht installiert +IMAPExtensionHelp = Bitte installieren Sie die PHP IMAP-Erweiterung: sudo pacman -S php-imap (Arch) oder sudo apt install php-imap (Debian/Ubuntu) + +# +# Validierung +# +ValidationResult = Validierung +SumValidationOk = OK +SumValidationError = Summenabweichung: ZUGFeRD %s € / Dolibarr %s € (Differenz: %s €) +BasisQuantityInfo = Preis für %s %s +Difference = Differenz +ImportResult = Import Ergebnis + +# +# Karte / Löschen +# +DeleteImportRecord = Import-Datensatz löschen +ConfirmDeleteImportRecord = Möchten Sie den Import-Datensatz %s wirklich löschen? Dies ermöglicht das erneute Importieren der gleichen Rechnung. +RecordDeleted = Datensatz gelöscht +XMLContent = XML-Inhalt +ClickToExpand = Klicken zum Anzeigen +ErrorMessage = Fehlermeldung +ForceReimport = Erneuter Import erzwingen +ForceReimportHelp = Aktivieren, um Duplikatsprüfung zu umgehen (falls Rechnung bereits importiert wurde) + +# +# Produkt Vorlage +# +ProductTemplate = Vorlage +ProductTemplateHelp = Bestehendes Produkt als Vorlage duplizieren und ZUGFeRD-Daten übernehmen +ProductCreated = Produkt erfolgreich erstellt + +# +# Batch Import +# +BatchImport = Stapel-Import +SelectSource = Quelle auswählen +ImportFromFolder = Import aus Ordner +ImportFromIMAP = Import aus E-Mail Postfach +StartImport = Import starten +Files = Dateien +BatchImportComplete = Import abgeschlossen: %s erfolgreich, %s fehlerhaft, %s übersprungen +BatchImportNotConfigured = Kein Überwachungsordner oder IMAP konfiguriert +ConfigureModule = Modul konfigurieren +ErrorWatchFolderNotConfigured = Überwachungsordner nicht konfiguriert oder nicht vorhanden +ErrorIMAPNotConfigured = IMAP nicht konfiguriert +NoFilesFound = Keine PDF-Dateien gefunden +NoEmailsFound = Keine E-Mails gefunden +Success = Erfolgreich +Skipped = Übersprungen +Archived = Archiviert + +# +# Manueller Workflow +# +StatusPending = Manueller Eingriff +PendingImports = Ausstehende Importe +NoPendingImports = Keine ausstehenden Importe +ManualInterventionRequired = Manueller Eingriff erforderlich +ProductsNotAssigned = Produkte nicht zugeordnet +SupplierNotAssigned = Lieferant nicht zugeordnet +ReadyToCreateInvoice = Bereit zur Rechnungserstellung +AssignProduct = Produkt zuordnen +ProductAssigned = Produkt zugeordnet +ProductRemoved = Produktzuordnung entfernt +SupplierUpdated = Lieferant aktualisiert +ManualAssignment = Manuelle Zuordnung +InvoiceCreatedSuccessfully = Rechnung erfolgreich erstellt +ImportRecordCreated = Import-Datensatz erstellt +ErrorNotAllProductsAssigned = Nicht alle Produkte zugeordnet +BackToList = Zurück zur Liste +ErrorRecordNotFound = Datensatz nicht gefunden diff --git a/langs/en_US/importzugferd.lang b/langs/en_US/importzugferd.lang new file mode 100755 index 0000000..86fda5a --- /dev/null +++ b/langs/en_US/importzugferd.lang @@ -0,0 +1,215 @@ +# Translation file for ImportZugferd module + +# +# Generic +# +ModuleImportZugferdName = ZUGFeRD Import +ModuleImportZugferdDesc = Import ZUGFeRD/Factur-X invoices as supplier invoices + +# +# Admin page +# +ImportZugferdSetup = ZUGFeRD Import Setup +Settings = Settings +ImportZugferdSetupPage = ZUGFeRD Import module configuration + +# Email settings +IMPORTZUGFERD_IMAP_HOST = IMAP Server +IMPORTZUGFERD_IMAP_HOSTTooltip = IMAP server hostname (e.g. imap.example.com) +IMPORTZUGFERD_IMAP_PORT = IMAP Port +IMPORTZUGFERD_IMAP_PORTTooltip = IMAP server port (993 for SSL, 143 for STARTTLS) +IMPORTZUGFERD_IMAP_USER = IMAP Username +IMPORTZUGFERD_IMAP_USERTooltip = Email address or username for IMAP login +IMPORTZUGFERD_IMAP_PASSWORD = IMAP Password +IMPORTZUGFERD_IMAP_PASSWORDTooltip = Password for IMAP login +IMPORTZUGFERD_IMAP_FOLDER = Mailbox Folder +IMPORTZUGFERD_IMAP_FOLDERTooltip = Folder to monitor for invoices (default: INBOX) +IMPORTZUGFERD_IMAP_SSL = Use SSL +IMPORTZUGFERD_IMAP_SSLTooltip = Enable SSL encryption for IMAP connection +IMPORTZUGFERD_AUTO_CREATE_INVOICE = Auto-create invoices +IMPORTZUGFERD_AUTO_CREATE_INVOICETooltip = Automatically create supplier invoices when importing from mailbox + +# Folder Import Settings +FolderImportSettings = Folder Import Settings +IMPORTZUGFERD_WATCH_FOLDER = Watch Folder +IMPORTZUGFERD_WATCH_FOLDERTooltip = Folder for incoming ZUGFeRD invoices (local path) +IMPORTZUGFERD_ARCHIVE_FOLDER = Archive Folder +IMPORTZUGFERD_ARCHIVE_FOLDERTooltip = Folder for successfully imported invoices +IMPORTZUGFERD_IMAP_ARCHIVE_FOLDER = IMAP Archive Folder +IMPORTZUGFERD_IMAP_ARCHIVE_FOLDERTooltip = IMAP folder for archived emails after import + +# +# About page +# +About = About +ImportZugferdAbout = About ZUGFeRD Import +ImportZugferdAboutPage = This module allows importing ZUGFeRD/Factur-X invoices from PDF files. + +# +# Menu +# +ZugferdImport = Import Invoice +ImportList = Import List +ProductMapping = Product Mapping + +# +# Import page +# +UploadZugferdInvoice = Upload ZUGFeRD Invoice +InvoiceData = Invoice Data +InvoiceNumber = Invoice Number +InvoiceDate = Invoice Date +BuyerReference = Buyer Reference (Customer No.) +DueDate = Due Date +SupplierAssignment = Supplier Assignment +SelectSupplier = Select Supplier +AutomaticallyDetected = automatically detected +CreateSupplierInvoice = Create Supplier Invoice +CreateSupplierInvoiceAfterImport = Create supplier invoice after import +MatchedProduct = Matched Product +MatchMethod = Match method +NoProductMatch = No product match +CreateProduct = Create Product +ImportSuccessful = Invoice imported successfully +ImportAnother = Import Another +ViewInvoice = View Invoice +ImportedFromZugferd = Imported from ZUGFeRD + +# +# Status +# +StatusImported = Imported +StatusProcessed = Processed +StatusError = Error +Imported = Imported +Processed = Processed +Error = Error + +# +# Mapping +# +AddMapping = Add Mapping +SupplierRef = Supplier Article No. +ManufacturerRef = Manufacturer Ref +MappingCreated = Mapping created +MappingDeleted = Mapping deleted +DeleteMapping = Delete Mapping +ConfirmDeleteMapping = Are you sure you want to delete this mapping? +NoMappingsFound = No mappings found for this supplier +Active = Active +Inactive = Inactive + +# +# Extrafield +# +SupplierCustomerNumber = Customer No. at Supplier +SupplierCustomerNumberHelp = Your customer number at this supplier (used for automatic supplier detection) + +# +# Cronjob +# +ImportZugferdFromMailbox = Import ZUGFeRD invoices from mailbox + +# +# Errors +# +ErrorSupplierRequired = Please select a supplier +ErrorNoFileUploaded = No file uploaded +ErrorFileUploadFailed = File upload failed +ErrorDuplicateInvoice = Invoice already imported (duplicate detected) +ErrorProductNotFound = Product not found +ErrorLineNotFound = Invoice line not found + +# +# Statistics / Index +# +Statistics = Statistics +TotalImported = Total Imported +QuickActions = Quick Actions +RecentImports = Recent Imports +ImportRecord = Import Record + +# +# Admin +# +IMAPSettings = IMAP Settings +ImportSettings = Import Settings +TestConnection = Test Connection +ConnectionSuccessful = Connection successful +ConnectionFailed = Connection failed +ClickTestToCheck = Click "Test Connection" to verify settings +SelectFolder = Select Folder +FolderSelected = Folder selected +FoundFolders = Found folders +IMAPExtensionNotInstalled = PHP IMAP extension is not installed +IMAPExtensionHelp = Please install the PHP IMAP extension: sudo apt install php-imap (Debian/Ubuntu) or sudo pacman -S php-imap (Arch) + +# +# Validation +# +ValidationResult = Validation +SumValidationOk = OK +SumValidationError = Sum mismatch: ZUGFeRD %s € / Dolibarr %s € (Difference: %s €) +BasisQuantityInfo = Price for %s %s +Difference = Difference +ImportResult = Import Result + +# +# Card / Delete +# +DeleteImportRecord = Delete import record +ConfirmDeleteImportRecord = Are you sure you want to delete import record %s? This will allow re-importing the same invoice. +RecordDeleted = Record deleted +XMLContent = XML Content +ClickToExpand = Click to expand +ErrorMessage = Error message +ForceReimport = Force reimport +ForceReimportHelp = Enable to bypass duplicate check (if invoice was already imported) + +# +# Product Template +# +ProductTemplate = Template +ProductTemplateHelp = Duplicate existing product as template and apply ZUGFeRD data +ProductCreated = Product created successfully + +# +# Batch Import +# +BatchImport = Batch Import +SelectSource = Select Source +ImportFromFolder = Import from Folder +ImportFromIMAP = Import from Email Mailbox +StartImport = Start Import +Files = Files +BatchImportComplete = Import completed: %s successful, %s failed, %s skipped +BatchImportNotConfigured = No watch folder or IMAP configured +ConfigureModule = Configure Module +ErrorWatchFolderNotConfigured = Watch folder not configured or not found +ErrorIMAPNotConfigured = IMAP not configured +NoFilesFound = No PDF files found +NoEmailsFound = No emails found +Success = Success +Skipped = Skipped +Archived = Archived + +# +# Manual Workflow +# +StatusPending = Manual Review +PendingImports = Pending Imports +NoPendingImports = No pending imports +ManualInterventionRequired = Manual intervention required +ProductsNotAssigned = products not assigned +SupplierNotAssigned = Supplier not assigned +ReadyToCreateInvoice = Ready to create invoice +AssignProduct = Assign product +ProductAssigned = Product assigned +ProductRemoved = Product assignment removed +SupplierUpdated = Supplier updated +ManualAssignment = Manual assignment +InvoiceCreatedSuccessfully = Invoice created successfully +ImportRecordCreated = Import record created +ErrorNotAllProductsAssigned = Not all products assigned +BackToList = Back to list +ErrorRecordNotFound = Record not found diff --git a/lib/importzugferd.lib.php b/lib/importzugferd.lib.php new file mode 100755 index 0000000..aa7c65e --- /dev/null +++ b/lib/importzugferd.lib.php @@ -0,0 +1,173 @@ + + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU General Public License for more details. + * + * You should have received a copy of the GNU General Public License + * along with this program. If not, see . + */ + +/** + * \file importzugferd/lib/importzugferd.lib.php + * \ingroup importzugferd + * \brief Library files with common functions for ImportZugferd + */ + +/** + * Prepare admin pages header + * + * @return array + */ +function importzugferdAdminPrepareHead() +{ + global $langs, $conf; + + // global $db; + // $extrafields = new ExtraFields($db); + // $extrafields->fetch_name_optionals_label('myobject'); + + $langs->load("importzugferd@importzugferd"); + + $h = 0; + $head = array(); + + $head[$h][0] = dol_buildpath("/importzugferd/admin/setup.php", 1); + $head[$h][1] = $langs->trans("Settings"); + $head[$h][2] = 'settings'; + $h++; + + /* + $head[$h][0] = dol_buildpath("/importzugferd/admin/myobject_extrafields.php", 1); + $head[$h][1] = $langs->trans("ExtraFields"); + $nbExtrafields = (isset($extrafields->attributes['myobject']['label']) && is_countable($extrafields->attributes['myobject']['label'])) ? count($extrafields->attributes['myobject']['label']) : 0; + if ($nbExtrafields > 0) { + $head[$h][1] .= '' . $nbExtrafields . ''; + } + $head[$h][2] = 'myobject_extrafields'; + $h++; + + $head[$h][0] = dol_buildpath("/importzugferd/admin/myobjectline_extrafields.php", 1); + $head[$h][1] = $langs->trans("ExtraFieldsLines"); + $nbExtrafields = (isset($extrafields->attributes['myobjectline']['label']) && is_countable($extrafields->attributes['myobjectline']['label'])) ? count($extrafields->attributes['myobject']['label']) : 0; + if ($nbExtrafields > 0) { + $head[$h][1] .= '' . $nbExtrafields . ''; + } + $head[$h][2] = 'myobject_extrafieldsline'; + $h++; + */ + + $head[$h][0] = dol_buildpath("/importzugferd/admin/about.php", 1); + $head[$h][1] = $langs->trans("About"); + $head[$h][2] = 'about'; + $h++; + + // Show more tabs from modules + // Entries must be declared in modules descriptor with line + //$this->tabs = array( + // 'entity:+tabname:Title:@importzugferd:/importzugferd/mypage.php?id=__ID__' + //); // to add new tab + //$this->tabs = array( + // 'entity:-tabname:Title:@importzugferd:/importzugferd/mypage.php?id=__ID__' + //); // to remove a tab + complete_head_from_modules($conf, $langs, null, $head, $h, 'importzugferd@importzugferd'); + + complete_head_from_modules($conf, $langs, null, $head, $h, 'importzugferd@importzugferd', 'remove'); + + return $head; +} + +/** + * Get readable label for UN/ECE Recommendation 20 unit codes + * + * @param string $code UN/ECE unit code (e.g. C62, MTR, LTR) + * @return string Readable label or original code if not found + */ +function zugferdGetUnitLabel($code) +{ + // UN/ECE Recommendation 20 - Common unit codes used in ZUGFeRD/Factur-X + $units = array( + // Pieces / Count + 'C62' => 'Stk.', // One (piece/unit) + 'PCE' => 'Stk.', // Piece + 'EA' => 'Stk.', // Each + 'H87' => 'Stk.', // Piece + 'XPP' => 'Stk.', // Piece + 'NAR' => 'Stk.', // Number of articles + 'NMP' => 'Stk.', // Number of packs + 'NPR' => 'Paar', // Number of pairs + 'SET' => 'Set', // Set + 'PR' => 'Paar', // Pair + + // Length + 'MTR' => 'm', // Metre + 'CMT' => 'cm', // Centimetre + 'MMT' => 'mm', // Millimetre + 'KMT' => 'km', // Kilometre + 'INH' => 'Zoll', // Inch + 'FOT' => 'Fuß', // Foot + 'LM' => 'lfm', // Linear metre + + // Area + 'MTK' => 'm²', // Square metre + 'CMK' => 'cm²', // Square centimetre + 'MMK' => 'mm²', // Square millimetre + + // Volume + 'MTQ' => 'm³', // Cubic metre + 'LTR' => 'l', // Litre + 'MLT' => 'ml', // Millilitre + 'HLT' => 'hl', // Hectolitre + 'CMQ' => 'cm³', // Cubic centimetre + + // Mass / Weight + 'KGM' => 'kg', // Kilogram + 'GRM' => 'g', // Gram + 'MGM' => 'mg', // Milligram + 'TNE' => 't', // Tonne (metric ton) + 'LBR' => 'lb', // Pound + + // Time + 'HUR' => 'Std.', // Hour + 'MIN' => 'Min.', // Minute + 'SEC' => 'Sek.', // Second + 'DAY' => 'Tag', // Day + 'WEE' => 'Woche', // Week + 'MON' => 'Monat', // Month + 'ANN' => 'Jahr', // Year + + // Packaging + 'XBX' => 'Karton', // Box + 'XCT' => 'Karton', // Carton + 'XPK' => 'Paket', // Package + 'XPA' => 'Palette', // Pallet + 'XSA' => 'Sack', // Sack + 'XBG' => 'Beutel', // Bag + 'XBO' => 'Flasche', // Bottle + 'XCA' => 'Dose', // Can + 'XRO' => 'Rolle', // Roll + 'XTU' => 'Tube', // Tube + + // Other + 'P1' => '%', // Percent + 'KWH' => 'kWh', // Kilowatt hour + 'MWH' => 'MWh', // Megawatt hour + 'WTT' => 'W', // Watt + 'KWT' => 'kW', // Kilowatt + ); + + $code = strtoupper(trim($code)); + + if (isset($units[$code])) { + return $units[$code]; + } + + return $code; +} diff --git a/list.php b/list.php new file mode 100644 index 0000000..47b06ea --- /dev/null +++ b/list.php @@ -0,0 +1,311 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../main.inc.php")) { + $res = @include "../main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +require_once DOL_DOCUMENT_ROOT.'/core/lib/date.lib.php'; +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; + +dol_include_once('/importzugferd/class/zugferdimport.class.php'); +dol_include_once('/importzugferd/lib/importzugferd.lib.php'); + +// Load translation files +$langs->loadLangs(array("importzugferd@importzugferd", "bills", "companies")); + +// Security check +if (!$user->hasRight('importzugferd', 'import', 'read')) { + accessforbidden(); +} + +// Get parameters +$action = GETPOST('action', 'aZ09'); +$massaction = GETPOST('massaction', 'alpha'); +$confirm = GETPOST('confirm', 'alpha'); +$toselect = GETPOST('toselect', 'array'); +$contextpage = GETPOST('contextpage', 'aZ') ? GETPOST('contextpage', 'aZ') : 'zugferdimportlist'; + +// Search parameters +$search_ref = GETPOST('search_ref', 'alpha'); +$search_invoice_number = GETPOST('search_invoice_number', 'alpha'); +$search_seller_name = GETPOST('search_seller_name', 'alpha'); +$search_status = GETPOST('search_status', 'int'); + +$limit = GETPOST('limit', 'int') ? GETPOST('limit', 'int') : $conf->liste_limit; +$sortfield = GETPOST('sortfield', 'aZ09comma'); +$sortorder = GETPOST('sortorder', 'aZ09comma'); +$page = GETPOSTISSET('pageplusone') ? (GETPOST('pageplusone') - 1) : GETPOST("page", 'int'); +if (empty($page) || $page < 0 || GETPOST('button_search', 'alpha') || GETPOST('button_removefilter', 'alpha')) { + $page = 0; +} +$offset = $limit * $page; +$pageprev = $page - 1; +$pagenext = $page + 1; + +if (!$sortfield) { + $sortfield = 'i.date_creation'; +} +if (!$sortorder) { + $sortorder = 'DESC'; +} + +// Initialize objects +$object = new ZugferdImport($db); +$form = new Form($db); +$formother = new FormOther($db); + +/* + * Actions + */ + +if (GETPOST('button_removefilter_x', 'alpha') || GETPOST('button_removefilter.x', 'alpha') || GETPOST('button_removefilter', 'alpha')) { + $search_ref = ''; + $search_invoice_number = ''; + $search_seller_name = ''; + $search_status = ''; + $toselect = array(); +} + +/* + * View + */ + +$title = $langs->trans('ImportList'); +llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-list'); + +// Build SQL query +$sql = "SELECT i.rowid, i.ref, i.invoice_number, i.invoice_date, i.seller_name, i.seller_vat,"; +$sql .= " i.buyer_reference, i.total_ht, i.total_ttc, i.currency, i.fk_soc, i.fk_facture_fourn,"; +$sql .= " i.status, i.error_message, i.date_creation, i.pdf_filename,"; +$sql .= " s.nom as supplier_name"; +$sql .= " FROM ".MAIN_DB_PREFIX."importzugferd_import as i"; +$sql .= " LEFT JOIN ".MAIN_DB_PREFIX."societe as s ON s.rowid = i.fk_soc"; +$sql .= " WHERE i.entity IN (".getEntity('importzugferd_import').")"; + +if (!empty($search_ref)) { + $sql .= natural_search('i.ref', $search_ref); +} +if (!empty($search_invoice_number)) { + $sql .= natural_search('i.invoice_number', $search_invoice_number); +} +if (!empty($search_seller_name)) { + $sql .= natural_search('i.seller_name', $search_seller_name); +} +if ($search_status !== '' && $search_status >= 0) { + $sql .= " AND i.status = ".(int)$search_status; +} + +// Count total +$nbtotalofrecords = ''; +if (!getDolGlobalInt('MAIN_DISABLE_FULL_SCANLIST')) { + $sqlforcount = preg_replace('/^SELECT[^FROM]*FROM/', 'SELECT COUNT(*) as nbtotalofrecords FROM', $sql); + $sqlforcount = preg_replace('/ORDER BY .*$/', '', $sqlforcount); + $resqlforcount = $db->query($sqlforcount); + if ($resqlforcount) { + $objforcount = $db->fetch_object($resqlforcount); + $nbtotalofrecords = $objforcount->nbtotalofrecords; + } + $db->free($resqlforcount); + + if (($page * $limit) > $nbtotalofrecords) { + $page = 0; + $offset = 0; + } +} + +$sql .= $db->order($sortfield, $sortorder); +$sql .= $db->plimit($limit + 1, $offset); + +$resql = $db->query($sql); +if (!$resql) { + dol_print_error($db); + exit; +} + +$num = $db->num_rows($resql); + +// List header +$param = ''; +if (!empty($search_ref)) $param .= '&search_ref='.urlencode($search_ref); +if (!empty($search_invoice_number)) $param .= '&search_invoice_number='.urlencode($search_invoice_number); +if (!empty($search_seller_name)) $param .= '&search_seller_name='.urlencode($search_seller_name); +if ($search_status !== '') $param .= '&search_status='.urlencode($search_status); + +print '
'; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +$newcardbutton = dolGetButtonTitle($langs->trans('Import'), '', 'fa fa-plus-circle', dol_buildpath('/importzugferd/import.php', 1)); + +print_barre_liste($title, $page, $_SERVER["PHP_SELF"], $param, $sortfield, $sortorder, '', $num, $nbtotalofrecords, 'fa-file-import', 0, $newcardbutton); + +print '
'; +print ''; + +// Header line +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; + +// Column headers +print ''; +print_liste_field_titre('Ref', $_SERVER["PHP_SELF"], 'i.ref', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('InvoiceNumber', $_SERVER["PHP_SELF"], 'i.invoice_number', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('InvoiceDate', $_SERVER["PHP_SELF"], 'i.invoice_date', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('Supplier', $_SERVER["PHP_SELF"], 'i.seller_name', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('SupplierInvoice', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('TotalTTC', $_SERVER["PHP_SELF"], 'i.total_ttc', '', $param, '', $sortfield, $sortorder, 'right '); +print_liste_field_titre('Status', $_SERVER["PHP_SELF"], 'i.status', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('ValidationResult', $_SERVER["PHP_SELF"], '', '', $param, '', $sortfield, $sortorder); +print_liste_field_titre('DateCreation', $_SERVER["PHP_SELF"], 'i.date_creation', '', $param, '', $sortfield, $sortorder, 'center '); +print ''; + +// Data rows +$i = 0; +while ($i < min($num, $limit)) { + $obj = $db->fetch_object($resql); + + print ''; + + // Ref + print ''; + + // Invoice number + print ''; + + // Invoice date + print ''; + + // Seller/Supplier + print ''; + + // Supplier invoice + print ''; + + // Total TTC + print ''; + + // Status + print ''; + + // Validation result / Error message + print ''; + + // Date creation + print ''; + + print ''; + + $i++; +} + +if ($num == 0) { + print ''; +} + +$db->free($resql); + +print '
'; +$arrayofstatus = array(0 => $langs->trans('Imported'), 1 => $langs->trans('Processed'), 2 => $langs->trans('Error'), 3 => $langs->trans('StatusPending')); +print $form->selectarray('search_status', $arrayofstatus, $search_status, 1, 0, 0, '', 0, 0, 0, '', 'minwidth75'); +print ''; +print ''; +print ''; +print '
'; + print ''.$obj->ref.''; + print ''.dol_escape_htmltag($obj->invoice_number).''.dol_print_date($db->jdate($obj->invoice_date), 'day').''; + if ($obj->fk_soc > 0) { + $supplier = new Societe($db); + $supplier->fetch($obj->fk_soc); + print $supplier->getNomUrl(1); + } else { + print ''.dol_escape_htmltag($obj->seller_name).''; + } + print ''; + if ($obj->fk_facture_fourn > 0) { + require_once DOL_DOCUMENT_ROOT.'/fourn/class/fournisseur.facture.class.php'; + $invoice = new FactureFournisseur($db); + $invoice->fetch($obj->fk_facture_fourn); + print $invoice->getNomUrl(1); + } else { + print '-'; + } + print ''.price($obj->total_ttc).''; + print $object->LibStatut($obj->status, 1); + print ''; + if ($obj->status == 2 && !empty($obj->error_message)) { + // Error status - show error message in red + print ''; + print ''; + print dol_trunc(dol_escape_htmltag($obj->error_message), 40); + print ''; + } elseif ($obj->status == 1) { + // Processed - show OK + print ''; + print ''; + print $langs->trans('SumValidationOk'); + print ''; + } else { + print '-'; + } + print ''.dol_print_date($db->jdate($obj->date_creation), 'dayhour').'
'.$langs->trans("NoRecordFound").'
'; +print '
'; + +print '
'; + +llxFooter(); +$db->close(); diff --git a/mapping.php b/mapping.php new file mode 100644 index 0000000..5416980 --- /dev/null +++ b/mapping.php @@ -0,0 +1,274 @@ + 0 && $j > 0 && isset($tmp[$i]) && isset($tmp2[$j]) && $tmp[$i] == $tmp2[$j]) { + $i--; + $j--; +} +if (!$res && $i > 0 && file_exists(substr($tmp, 0, ($i + 1))."/main.inc.php")) { + $res = @include substr($tmp, 0, ($i + 1))."/main.inc.php"; +} +if (!$res && $i > 0 && file_exists(dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php")) { + $res = @include dirname(substr($tmp, 0, ($i + 1)))."/main.inc.php"; +} +if (!$res && file_exists("../main.inc.php")) { + $res = @include "../main.inc.php"; +} +if (!$res && file_exists("../../main.inc.php")) { + $res = @include "../../main.inc.php"; +} +if (!$res && file_exists("../../../main.inc.php")) { + $res = @include "../../../main.inc.php"; +} +if (!$res) { + die("Include of main fails"); +} + +require_once DOL_DOCUMENT_ROOT.'/core/class/html.formother.class.php'; +require_once DOL_DOCUMENT_ROOT.'/societe/class/societe.class.php'; +require_once DOL_DOCUMENT_ROOT.'/product/class/product.class.php'; + +dol_include_once('/importzugferd/class/productmapping.class.php'); +dol_include_once('/importzugferd/lib/importzugferd.lib.php'); + +// Load translation files +$langs->loadLangs(array("importzugferd@importzugferd", "products", "companies")); + +// Security check +if (!$user->hasRight('importzugferd', 'mapping', 'write')) { + accessforbidden(); +} + +// Get parameters +$action = GETPOST('action', 'aZ09'); +$confirm = GETPOST('confirm', 'alpha'); +$id = GETPOST('id', 'int'); +$supplier_id = GETPOST('supplier_id', 'int'); + +// Form fields +$supplier_ref = GETPOST('supplier_ref', 'alpha'); +$product_id = GETPOST('product_id', 'int'); +$ean = GETPOST('ean', 'alpha'); +$manufacturer_ref = GETPOST('manufacturer_ref', 'alpha'); +$description = GETPOST('description', 'alpha'); +$priority = GETPOST('priority', 'int'); + +// Initialize objects +$mapping = new ProductMapping($db); +$form = new Form($db); + +$error = 0; + +/* + * Actions + */ + +// Add mapping +if ($action == 'add') { + if (empty($supplier_id) || $supplier_id <= 0) { + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Supplier')), null, 'errors'); + $error++; + } + if (empty($supplier_ref)) { + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('SupplierRef')), null, 'errors'); + $error++; + } + if (empty($product_id) || $product_id <= 0) { + setEventMessages($langs->trans('ErrorFieldRequired', $langs->transnoentities('Product')), null, 'errors'); + $error++; + } + + if (!$error) { + $mapping->fk_soc = $supplier_id; + $mapping->supplier_ref = $supplier_ref; + $mapping->fk_product = $product_id; + $mapping->ean = $ean; + $mapping->manufacturer_ref = $manufacturer_ref; + $mapping->description = $description; + $mapping->priority = $priority; + + $result = $mapping->create($user); + if ($result > 0) { + setEventMessages($langs->trans('MappingCreated'), null, 'mesgs'); + header('Location: '.$_SERVER['PHP_SELF'].'?supplier_id='.$supplier_id); + exit; + } else { + setEventMessages($mapping->error, null, 'errors'); + } + } + $action = ''; +} + +// Delete mapping +if ($action == 'confirm_delete' && $confirm == 'yes') { + $mapping->fetch($id); + $save_supplier_id = $mapping->fk_soc; + + $result = $mapping->delete($user); + if ($result > 0) { + setEventMessages($langs->trans('MappingDeleted'), null, 'mesgs'); + header('Location: '.$_SERVER['PHP_SELF'].'?supplier_id='.$save_supplier_id); + exit; + } else { + setEventMessages($mapping->error, null, 'errors'); + } +} + +/* + * View + */ + +$title = $langs->trans('ProductMapping'); +llxHeader('', $title, '', '', 0, 0, '', '', '', 'mod-importzugferd page-mapping'); + +print load_fiche_titre($title, '', 'fa-exchange-alt'); + +// Confirm delete +if ($action == 'delete') { + print $form->formconfirm( + $_SERVER['PHP_SELF'].'?id='.$id.'&supplier_id='.$supplier_id, + $langs->trans('DeleteMapping'), + $langs->trans('ConfirmDeleteMapping'), + 'confirm_delete', + '', + 0, + 1 + ); +} + +// Supplier selection +print '
'; +print '
'; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print ''; +print '
'.$langs->trans('SelectSupplier').'
'.$langs->trans('Supplier').''; +print $form->select_company($supplier_id, 'supplier_id', 's.fournisseur = 1', 'SelectThirdParty', 0, 0, null, 0, 'minwidth300'); +print ' '; +print '
'; +print '
'; +print '
'; + +// If supplier selected, show mappings and add form +if ($supplier_id > 0) { + $supplier = new Societe($db); + $supplier->fetch($supplier_id); + + print '
'; + + // Add new mapping form + print '
'; + print ''; + print ''; + print ''; + + print '
'; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + print ''; + print ''; + print ''; + + print '
'.$langs->trans('AddMapping').' - '.$supplier->getNomUrl(1).'
'.$langs->trans('SupplierRef').''.$langs->trans('Product').''.$form->select_produits($product_id, 'product_id', '', 0, 0, -1, 2, '', 0, array(), 0, '1', 0, 'minwidth300', 0, '', null, 1).''.$langs->trans('EAN').'
'.$langs->trans('ManufacturerRef').''.$langs->trans('Description').''.$langs->trans('Priority').'
'; + print ''; + print '
'; + print '
'; + print '
'; + + // Existing mappings + print '
'; + print '
'; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + + $mappings = $mapping->fetchAllBySupplier($supplier_id); + + if (count($mappings) > 0) { + foreach ($mappings as $m) { + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + print ''; + } + } else { + print ''; + } + + print '
'.$langs->trans('SupplierRef').''.$langs->trans('Product').''.$langs->trans('EAN').''.$langs->trans('ManufacturerRef').''.$langs->trans('Description').''.$langs->trans('Priority').''.$langs->trans('Active').''.$langs->trans('Action').'
'.dol_escape_htmltag($m['supplier_ref']).''; + $product = new Product($db); + $product->fetch($m['fk_product']); + print $product->getNomUrl(1); + print ''.dol_escape_htmltag($m['ean']).''.dol_escape_htmltag($m['manufacturer_ref']).''.dol_escape_htmltag($m['description']).''.$m['priority'].''; + print $m['active'] ? img_picto($langs->trans('Active'), 'statut4') : img_picto($langs->trans('Inactive'), 'statut5'); + print ''; + print ''; + print img_picto($langs->trans('Delete'), 'delete'); + print ''; + print '
'.$langs->trans('NoMappingsFound').'
'; + print '
'; +} + +llxFooter(); +$db->close(); diff --git a/modulebuilder.txt b/modulebuilder.txt new file mode 100755 index 0000000..670a177 --- /dev/null +++ b/modulebuilder.txt @@ -0,0 +1,3 @@ +# DO NOT DELETE THIS FILE MANUALLY +# File to flag module built using official module template. +# When this file is present into a module directory, you can edit it with the module builder tool. \ No newline at end of file diff --git a/sql/dolibarr_allversions.sql b/sql/dolibarr_allversions.sql new file mode 100755 index 0000000..5026bb4 --- /dev/null +++ b/sql/dolibarr_allversions.sql @@ -0,0 +1,3 @@ +-- +-- Script run when an upgrade of Dolibarr is done. Whatever is the Dolibarr version. +-- diff --git a/sql/llx_importzugferd_import.key.sql b/sql/llx_importzugferd_import.key.sql new file mode 100644 index 0000000..86c7ee0 --- /dev/null +++ b/sql/llx_importzugferd_import.key.sql @@ -0,0 +1,14 @@ +-- ============================================================================ +-- Copyright (C) 2026 ZUGFeRD Import Module +-- ============================================================================ + +ALTER TABLE llx_importzugferd_import ADD INDEX idx_importzugferd_import_ref (ref); +ALTER TABLE llx_importzugferd_import ADD INDEX idx_importzugferd_import_invoice (invoice_number); +ALTER TABLE llx_importzugferd_import ADD UNIQUE INDEX uk_importzugferd_import_hash (file_hash, entity); +ALTER TABLE llx_importzugferd_import ADD INDEX idx_importzugferd_import_fk_soc (fk_soc); +ALTER TABLE llx_importzugferd_import ADD INDEX idx_importzugferd_import_fk_facture (fk_facture_fourn); +ALTER TABLE llx_importzugferd_import ADD INDEX idx_importzugferd_import_status (status); +ALTER TABLE llx_importzugferd_import ADD INDEX idx_importzugferd_import_buyer_ref (buyer_reference); + +ALTER TABLE llx_importzugferd_import ADD CONSTRAINT fk_importzugferd_import_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe(rowid); +ALTER TABLE llx_importzugferd_import ADD CONSTRAINT fk_importzugferd_import_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid); diff --git a/sql/llx_importzugferd_import.sql b/sql/llx_importzugferd_import.sql new file mode 100644 index 0000000..5df706e --- /dev/null +++ b/sql/llx_importzugferd_import.sql @@ -0,0 +1,40 @@ +-- ============================================================================ +-- Copyright (C) 2026 ZUGFeRD Import Module +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- ============================================================================ + +CREATE TABLE llx_importzugferd_import ( + rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL, + ref varchar(128) NOT NULL, -- Interne Referenz + invoice_number varchar(128) NOT NULL, -- Rechnungsnummer aus ZUGFeRD + invoice_date date NOT NULL, -- Rechnungsdatum + seller_name varchar(255), -- Lieferantenname aus Rechnung + seller_vat varchar(50), -- USt-ID Lieferant + buyer_reference varchar(128), -- Kundennummer beim Lieferanten + total_ht double(24,8) DEFAULT 0, -- Nettobetrag + total_ttc double(24,8) DEFAULT 0, -- Bruttobetrag + currency varchar(3) DEFAULT 'EUR', -- Währung + fk_soc integer, -- Zugeordneter Lieferant + fk_facture_fourn integer, -- Erstellte Lieferantenrechnung + xml_content mediumtext, -- Original XML-Inhalt + pdf_filename varchar(255), -- Original PDF-Dateiname + file_hash varchar(64), -- SHA256 Hash für Duplikatserkennung + status integer DEFAULT 0, -- 0=importiert, 1=verarbeitet, 2=fehler + error_message text, -- Fehlermeldung falls status=2 + date_creation datetime NOT NULL, -- Erstellungsdatum + date_import datetime, -- Importdatum der Rechnung + tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + fk_user_creat integer, -- Ersteller + fk_user_modif integer, -- Letzter Bearbeiter + import_key varchar(14), -- Import-Batch-Key + entity integer DEFAULT 1 NOT NULL -- Multi-company +) ENGINE=innodb; diff --git a/sql/llx_importzugferd_import_line.key.sql b/sql/llx_importzugferd_import_line.key.sql new file mode 100644 index 0000000..ed8d770 --- /dev/null +++ b/sql/llx_importzugferd_import_line.key.sql @@ -0,0 +1,7 @@ +-- ============================================================================ +-- Copyright (C) 2026 ZUGFeRD Import Module +-- ============================================================================ + +ALTER TABLE llx_importzugferd_import_line ADD INDEX idx_importzugferd_import_line_fk_import (fk_import); +ALTER TABLE llx_importzugferd_import_line ADD INDEX idx_importzugferd_import_line_fk_product (fk_product); +ALTER TABLE llx_importzugferd_import_line ADD CONSTRAINT fk_importzugferd_import_line_import FOREIGN KEY (fk_import) REFERENCES llx_importzugferd_import (rowid); diff --git a/sql/llx_importzugferd_import_line.sql b/sql/llx_importzugferd_import_line.sql new file mode 100644 index 0000000..5157b7d --- /dev/null +++ b/sql/llx_importzugferd_import_line.sql @@ -0,0 +1,35 @@ +-- ============================================================================ +-- Copyright (C) 2026 ZUGFeRD Import Module +-- +-- This program is free software; you can redistribute it and/or modify +-- it under the terms of the GNU General Public License as published by +-- the Free Software Foundation; either version 3 of the License, or +-- (at your option) any later version. +-- +-- This program is distributed in the hope that it will be useful, +-- but WITHOUT ANY WARRANTY; without even the implied warranty of +-- MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +-- GNU General Public License for more details. +-- ============================================================================ + +CREATE TABLE llx_importzugferd_import_line ( + rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL, + fk_import integer NOT NULL, -- Referenz zum Import + line_id varchar(50), -- Position/Zeilen-ID aus ZUGFeRD + supplier_ref varchar(128), -- Lieferanten-Artikelnummer + product_name varchar(255), -- Artikelbezeichnung aus ZUGFeRD + description text, -- Zusätzliche Beschreibung + quantity double(24,8) DEFAULT 1, -- Menge + unit_code varchar(10), -- UN/ECE Einheitencode (C62, MTR, etc.) + unit_price double(24,8) DEFAULT 0, -- Einzelpreis (berechnet) + unit_price_raw double(24,8) DEFAULT 0, -- Original-Einzelpreis + basis_quantity double(24,8) DEFAULT 1, -- Basismenge für Preis + basis_quantity_unit varchar(10), -- Einheit der Basismenge + line_total double(24,8) DEFAULT 0, -- Zeilensumme netto + tax_percent double(24,8) DEFAULT 0, -- MwSt-Satz + ean varchar(20), -- EAN/GTIN falls vorhanden + fk_product integer, -- Zugeordnetes Dolibarr-Produkt + match_method varchar(50), -- Wie wurde Produkt gefunden + date_creation datetime NOT NULL, + tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP +) ENGINE=innodb; diff --git a/sql/llx_importzugferd_productmapping.key.sql b/sql/llx_importzugferd_productmapping.key.sql new file mode 100644 index 0000000..7be7ebd --- /dev/null +++ b/sql/llx_importzugferd_productmapping.key.sql @@ -0,0 +1,13 @@ +-- ============================================================================ +-- Copyright (C) 2026 ZUGFeRD Import Module +-- ============================================================================ + +ALTER TABLE llx_importzugferd_productmapping ADD INDEX idx_productmapping_fk_soc (fk_soc); +ALTER TABLE llx_importzugferd_productmapping ADD INDEX idx_productmapping_fk_product (fk_product); +ALTER TABLE llx_importzugferd_productmapping ADD INDEX idx_productmapping_supplier_ref (supplier_ref); +ALTER TABLE llx_importzugferd_productmapping ADD INDEX idx_productmapping_ean (ean); +ALTER TABLE llx_importzugferd_productmapping ADD UNIQUE INDEX uk_productmapping_soc_ref (fk_soc, supplier_ref, entity); + +ALTER TABLE llx_importzugferd_productmapping ADD CONSTRAINT fk_productmapping_fk_soc FOREIGN KEY (fk_soc) REFERENCES llx_societe(rowid); +ALTER TABLE llx_importzugferd_productmapping ADD CONSTRAINT fk_productmapping_fk_product FOREIGN KEY (fk_product) REFERENCES llx_product(rowid); +ALTER TABLE llx_importzugferd_productmapping ADD CONSTRAINT fk_productmapping_fk_user_creat FOREIGN KEY (fk_user_creat) REFERENCES llx_user(rowid); diff --git a/sql/llx_importzugferd_productmapping.sql b/sql/llx_importzugferd_productmapping.sql new file mode 100644 index 0000000..fb75d4d --- /dev/null +++ b/sql/llx_importzugferd_productmapping.sql @@ -0,0 +1,22 @@ +-- ============================================================================ +-- Copyright (C) 2026 ZUGFeRD Import Module +-- +-- Artikelmapping-Tabelle: Zuordnung Lieferanten-Artikelnummern zu Produkten +-- ============================================================================ + +CREATE TABLE llx_importzugferd_productmapping ( + rowid integer AUTO_INCREMENT PRIMARY KEY NOT NULL, + fk_soc integer NOT NULL, -- Lieferant + supplier_ref varchar(128) NOT NULL, -- Lieferanten-Artikelnummer (SellerAssignedID) + fk_product integer NOT NULL, -- Dolibarr Produkt + ean varchar(32), -- EAN/GTIN (GlobalID) + manufacturer_ref varchar(128), -- Hersteller-Artikelnummer + description varchar(255), -- Optionale Beschreibung + priority integer DEFAULT 0, -- Priorität bei mehreren Mappings + active tinyint DEFAULT 1, -- Aktiv/Inaktiv + date_creation datetime NOT NULL, + tms timestamp DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP, + fk_user_creat integer, + fk_user_modif integer, + entity integer DEFAULT 1 NOT NULL +) ENGINE=innodb;